serialize () не работает с апострофом - PullRequest
1 голос
/ 05 ноября 2011

У меня возникли проблемы с кодом ниже при попытке отправить форму динамически. Функция serialize () прекрасно работает, за исключением случаев, когда в поле формы есть апостроф.

Из других мест, где я смотрел онлайн, похоже, что serialize () должен об этом позаботиться. По какой-то странной причине мне это не удается.

Вот мой код:

//Submit Edit Facility form data
$("#Facility_Edit").click(function() {  
    var dataString = $("#edit_facility").serialize();

    alert (dataString); //return false;
    $.ajax({
        type: "POST",
        url: "process.php",
        data: dataString,
        success: function() {
          $('#submitresults').html("<div id='message' class='alert-message fade in' data-alert='alert'></div>");
          $('#message').html("<b>Account has been edited successfully!</b>")
          .append("<p>If you would like to make more changes, please do so below. Otherwise, please click <a href='facility.php?facility_id=<?php echo $facility_id;?>'>here to view the account.</p>")
          .hide()
          .fadeIn(1500, function() {
            $('#message').prepend("<a class='close' href='#'>&times;</a>");
            setTimeout('window.location="facility.php?facility_id=<?php echo $facility_id;?>&action=edit"', 3000)
          });
        }
    });

    return false;
});

Это вывод, который я получаю с апострофом:

Facility_Name=Coeur+d'Alene+Homes+&Facility_Type=Assisted+Living+Facility&
Facility_Address=624+W+Harrison&Facility_Beds=&Facility_City=Coeur+d'Alene&
Facility_State=ID&Facility_Zip=83814&Facility_OC=Tambra&Facility_Phone=&Facility_HCC=&
Facility_Fax=&Facility_Team=CDA&Facility_DC=&facility_facilitypreference_status=&
Facility_ID=1305&Submit_Type=editfacility

Обратите внимание, что после удаления апострофа код работает отлично и отправляется правильно. Как я могу это исправить?

РЕДАКТИРОВАТЬ: Добавлен код стороны PHP

$facility_name = htmlspecialchars(trim($_POST['Facility_Name']));               
$facility_type = htmlspecialchars(trim($_POST['Facility_Type']));
$facility_address = htmlspecialchars(trim($_POST['Facility_Address']));         
$facility_zip = htmlspecialchars(trim($_POST['Facility_Zip']));
$facility_oc = htmlspecialchars(trim($_POST['Facility_OC']));               
$facility_hcc = htmlspecialchars(trim($_POST['Facility_HCC']));
$facility_phone = htmlspecialchars(trim($_POST['Facility_Phone']));             
$facility_beds = htmlspecialchars(trim($_POST['Facility_Beds']));
$facility_fax = htmlspecialchars(trim($_POST['Facility_Fax']));             
$facility_dc = htmlspecialchars(trim($_POST['Facility_DC']));

Я также пробовал:

$facility_name = htmlspecialchars(addslashes(trim($_POST['Facility_Name'])));               
$facility_type = htmlspecialchars(trim($_POST['Facility_Type']));
$facility_address = htmlspecialchars(addslashes(trim($_POST['Facility_Address']))); 

Ответы [ 4 ]

1 голос
/ 05 ноября 2011

Вы пытались использовать encodeURI ? :

var dataString = encodeURI($("#edit_facility").serialize()); 

Если это не работает, так что не рискуйте: попробуйте с htmlspecialchars .

var dataString = htmlspecialchars($("#edit_facility").serialize() , 'ENT_QUOTES')

А в вашем php сделайте:

$facility_name = trim($_POST['Facility_Name']));

Я надеюсь, что вы сможете решить свою проблему.

EDIT:

Мне сделали тест с двумя файлами:

serialize.php

<!DOCTYPE html>
<html>
<head>
</head>
<body>
<div id="post">
</div>
<form name="form1" id="form1" action="#">
    <p><input type="text" id="Facility_Name" name="Facility_Name" value="Coeur d'Alene Homes"/>
    <p><input type="text" id="Facility_Type" name="Facility_Type" value="Assisted Living Facility"/>
    <p><input type="text" id="Facility_Address" name="Facility_Address" value="624 W Harrison"/>

    <p><button type="button" id="send">Send</button>
</form>
<script src="http://code.jquery.com/jquery-1.7.min.js"></script>
<script>
    $(function(){
        $('#send').click(function(){
            $.ajax({
                type: "POST",
                url: "serialize1.php",
                data: $('#form1').serialize(),
                success: function(sData) {
                    $('#post').html(sData);
                }
            });
        });
    });
</script>
</body>
</html>

serialize1.php

<code><?php
echo '<pre>';
var_dump($_POST);
echo '
'; ?>

А в serialize1.php в chrome, firefox и IE я получаю:

array(3) {
  ["Facility_Name"]=>
  string(19) "Coeur d'Alene Homes"
  ["Facility_Type"]=>
  string(24) "Assisted Living Facility"
  ["Facility_Address"]=>
  string(14) "624 W Harrison"
}

Для того, чтобы помочь вам, я был бы признателен, дайте мне больше информации.

1 голос
/ 05 ноября 2011
var dataString = $("#edit_facility").serialize().replace(/\'/g,'\\\'');

или лучше, используйте одну из различных функций "addlashes" javascript.

однако, что произойдет, если вы выполните

$_POST = array_map('addslashes', $_POST);
0 голосов
/ 06 марта 2017

Год 2017, и мне трудно поверить, что эта проблема все еще существует.

Для начала позвольте мне кратко рассказать вам о том, как работает сериализация.Вот пример:

a: 6: {i: 0; s: 27: «Я бы не против, это она»; i: 1; s: 14: «его собственный выбор»; i:2; s: 27: «Я бы не стал возражать, пока он»; i: 3; s: 52: «она готова сделать все, чтобы бороться с этим с моей помощью»

Теперь, a: 6 говорит вамчто в сериализованном массиве есть шесть элементов.После этого i: 0 означает, что это первый элемент.И теперь вы видите проблему, s: 27 говорит, что строка содержит 27 символов.Но я заметил, что когда в строке есть знак -> '<---, он насчитывает не 1, а 2 символа.Это означает, что сериализация НЕ дает сбоя.В строке содержится 27 символов, когда она попадает в базу данных.Но база данных видит \ 'и удаляет \, оставляя только'.Когда эти данные возвращаются в PHP и он пытается десериализоваться, он видит s: 27, но строку с 26 символами.И вот тогда начинается проблема. </p>

Мое решение было исправить строку перед ее десериализацией:

$ question_level ['answers1'] = str_replace ('\' ',' \\ '',$ question_level [ 'answers1']);

0 голосов
/ 02 сентября 2015

Хорошо, если вы используете PHP, я бы предложил использовать PDO. Подготовленные операторы по умолчанию избегают всего и не требуют дополнительного кодирования. например.

Боковой код PHP

$facility_name = $_POST['Facility_Name'];
$Insert = $pdo-Prepare("Insert into table (`id`, `facility_name `) VALUES (NULL,:facility_name )");
$Insert->bindParam(':facility_name ',$facility_name);
$insert->execute();

Вот и все. Ничего ЭТОГО.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...