Сохранить в 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))) . "')");
3 ответов:
Вы должны передать данные через escape - функцию после сериализации, а не до - что вы и делаете сейчас.
$serialized = mysql_real_escape_string(serialize($data));Используйте параметризованный запрос с PDO или MySQLi,и вы можете вообще забыть о побеге.
Ты совершаешь ошибку, которую я видел у многих. Немного фундаментального непонимания того, как работает экранирование и как его следует использовать.
Вы не можете просто цепочкой экранировать функции и в конечном итоге получить что-то, что идеально подходит для любого контекста. Ваша ошибка проста..
Вы делаете две вещи:
- сериализация объекта (в данном случае строки)
- сохранение этого в базе данных.
Поэтому, прежде чем сохранить его в базу данных, вы должны убедиться, что что ваша ценность должным образом ускользнула. СДЕЛАЙТЕ ЭТО С 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