Исключение одиночных кавычек в PHP / MySQL не работает

Я пытаюсь вставить строку в таблицу MySQL, используя комбинацию JavaScript / Ajax и PHP. После передачи нужной строки (JavaScript) в скрипт PHP с использованием Ajax, я затем попытаюсь вставить его в таблицу с помощью PHP.

PHP-скрипт работает, однако, как только появляется одна кавычка ('), вставка останавливается в этой точке. Я попытался использовать mysql_real_escape_string (), addslashes (), htmlentities () и str_replace () в различных комбинациях, пробовал это с помощью магических кавычек, и независимо от того, что одиночные кавычки не могут быть обработаны. Я просто хотел бы либо сохранить их, либо заставить их ускользнуть должным образом, но для меня ничего не работает – сама строка из Tweet, поэтому мне интересно, может ли это быть причиной конфликта кодировок? Любые советы относительно того, как преодолеть это, будут очень признательны.

Например, чтобы лучше проиллюстрировать, если я передаю эту строку скрипту PHP:

обещаю, что ты не будешь голосовать

Затем после дезинфекции строки с помощью любого из вышеперечисленных методов и вставки в таблицу MySQL она всегда будет выглядеть так: в таблице MySQL:

обещаю, что ты выиграл

Вот мой php-код:

include("dbconnect.php"); //connect to DB $tweet = mysql_real_escape_string($_POST['tweet']); //escape the string if($tweet != '') { //check it's not empty $query = "insert into Tory (Content) values('$tweet')"; //insert statement $link = mysql_query($query); if (!$link) { echo "3"; die($result); } echo "<p>".$tweet."</p>"; //for Ajax callback } 

Вот код Javascript / Ajax:

 $.ajax({ type: 'POST', url: 'buildTable.php', //previous php code data: "tweet=" + content, //content is the tweet string as javascript var success: function(thetweet) { $(document.body).append(thetweet); } }); 

EDIT: Спасибо за все комментарии и советы. Временное решение, которое я использовал, заключается в замене всех экземпляров одной кавычки на обратную косую черту на стороне клиента, прежде чем передать строку в скрипт PHP. Затем переключите его на одну цитату при извлечении в PHP или JavaScript.

Вы можете легко избежать всего ускользающего, если вы используете mysqli или PDO с подготовленными операторами. В mysql_* функции mysql_* устаревают, поэтому это была бы прекрасная возможность переключения.

Ваш код будет чем-то вроде (PDO, используя ваш код):

 $query = "insert into Tory (Content) values (:tweet)"; $stmt = $db->prepare($sql); // $db being your PDO object $stmt->execute(array(':tweet' => $_POST['tweet'])); // assuming you are not verifying the tweet somewhere else 

Вставить строку с одиночной цитатой ( ' ) или двойной цитатой ( " ) в mysql

Просто используйте addslashes(); in Insertion и stripslashes(); для получения данных.

 $str = "Hello Friend's.. Hows you all"s."; // Outputs: Hello Friend\'s..Hows you all\"s. echo addslashes($str); 

stripslashes – строка без цитаты, цитируемая с помощью addslashes() . Возвращает строку с удаленной обратной косой чертой. ( \' становится ' и т. д.) Двойная обратная косая черта ( \\ ) превращается в одну обратную косую черту ( \ ).

 $str = "Hello Friend\'s.. Hows you all"s."; // Outputs: Hello Friend's.. Hows you all"s. echo stripslashes($str); 

Теперь мы подошли к делу. Если мы вставляем строку в базу данных с одинарной или двойной цитатой, например:

 $str = “Hello Friend's.. Hows you all"s.”; $query = “INSERT INTO tbl (description) VALUES ('$str')”; 

Это приведет к ошибке, но если мы будем использовать функцию addslashes($str) как показано ниже, а затем вставить в базу данных, то ошибки не будет.

 $str = “Hello Friend's.. Hows you all"s.”; $desc_str = addslashes($str); $query = “INSERT INTO tbl (description) VALUES ('$desc_str')”; 

аналогично мы можем использовать stripslashes($str) для печати этого значения поля таблицы следующим образом:

 echo stripslashes($str); 

Заменить:

 $link = mysql_query($query); if (!$link) { echo "3"; die($result); } 

С:

 mysql_query($query); if(mysql_errno() != 0) die(mysql_error()); 

Я не уверен, что это актуально, и я знаю, что это немного поздно, но у меня возникла аналогичная проблема при попытке создать файл CSV. Я не мог понять, почему мои одиночные кавычки не ускользнули.

РЕШЕНИЕ

Оказывается, одинарные кавычки в моем sring были умными цитатами, то есть кудрявыми цитатами, а не прямыми кавычками.

После запуска функции ниже ( спасибо Крису Шифлетту ) мои кавычки были преобразованы, и мои проблемы с экранированием решены.

Передайте каждое значение поля / ячейки / значение столбца, которое будет храниться через эту функцию, для преобразования умных символов, таких как фигурные кавычки и emdash, в объекты HTML, такие как прямые кавычки и дефисы

 $smart_string = "String containing smart quotes"; $safe_string = convert_smart_quotes($smart_string); function convert_smart_quotes($string) { $search = array(chr(145), chr(146), chr(147), chr(148), chr(151)); $replace = array("'", "'", '"', '"', '-'); //return string with smart characters replaced by html safe characters return str_replace($search, $replace, $string); } 

Как я уже сказал, не уверен, что это напрямую поможет вашей проблеме, но может помочь вам и другим в будущем!