Сохранить в MySQL сериализованную информацию с кавычками



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



Пример, строка "te'St", после сериализации мы имеем



s:5:"te'st";


Но чтобы сохранить его в SQL, нам нужно добавить косые черты, и я делаю



serialize(addslashes($string))


После этого в нашей БД MySQL мы имеем



s:6:"te'st";


И это проблема. с:6 означает, что мы имеем 6 символов строки, но наш "Дэ ты" только 5, так что, когда мы пытаемся восстановить его, то получаю ошибку.



Как это сделать? решить ее? Попробовал htmlspecialchars и mysql_real_escape_string



Обновление:



Как я использую mysql_real_escape_string



 mysql_query("INSERT INTO `table`(`string`) VALUES ('" . serialize(array('iId' =>$aSqlResult['typeID'], 'sName' => mysql_real_escape_string($sScanResultLine))) . "')");
633   3  

3 ответов:

Вы должны передать данные через escape - функцию после сериализации, а не до - что вы и делаете сейчас.

$serialized = mysql_real_escape_string(serialize($data));

Используйте параметризованный запрос с PDO или MySQLi,и вы можете вообще забыть о побеге.

Ты совершаешь ошибку, которую я видел у многих. Немного фундаментального непонимания того, как работает экранирование и как его следует использовать.

Вы не можете просто цепочкой экранировать функции и в конечном итоге получить что-то, что идеально подходит для любого контекста. Ваша ошибка проста..

Вы делаете две вещи:

  1. сериализация объекта (в данном случае строки)
  2. сохранение этого в базе данных.

Поэтому, прежде чем сохранить его в базу данных, вы должны убедиться, что что ваша ценность должным образом ускользнула. СДЕЛАЙТЕ ЭТО С MYSQLI! Функции mysql_ мертвы.

Эквивалент mysqli::real_escape_string.

Но самое главное.. (извините, что затягиваю)..

serialize изменяет выходные данные, он может вернуть целую кучу вещей.. кавычки, 0x00 ' s и это не допускается в запросах mysql.

Так что real_escape_string, очевидно, должен быть последний шаг! Сначала сериализуйте, а затем экранируйте выходные данные этой функции. Вы сделали точно так же противоположный.

В вашем случае mysql_real_escape_string() - это путь. Это должно работать, если только вы не сделали это как-то неправильно (Примечание: Вы должны быть подключены к БД перед вызовом этой функции). И на самом деле вы должны использовать mysqli_ или PDO, а не расширение mysql_, которое теперь устарело. Использование htmlspecialchars() - это просто использование неправильного инструмента для выполнения задачи.

Код должен быть таким:

mysql_real_escape_string( serialize( $string ) );

Comments

    Ничего не найдено.