Добавляет косые черты, mysql_real_escape всегда добавляет две косые черты?

У меня проблема со вставкой JSON в базу данных, я собираюсь взять переменные, json_encode их, удалить косую черту (из magic_quotes), а затем добавить обратно, чтобы экранировать кавычки в {"key":"value"}

К сожалению, strip_slashes в закодированной строке ничего не делает, и выводит это

{"content":"<p>This string has it\'s downsides</p>","date":1271352514}

Затем я попробовал addlashes и mysql_real_escape_string, оба вывода

"{\\"content\\":\\"<p>This string has it\\\'s downsides</p>\\",\\"date\\":1271352514}"

Я не могу понять, почему он добавляет две косые черты? И я рву на себе волосы из-за этого, каждый раз, когда я пытаюсь нанести полоску, они оставляют один в, а добавление слэша добавляет два. Любая помощь будет принята с благодарностью!

2 ответа

Решение

Во-первых, вы действительно должны рассмотреть возможность поворота magic_quotes off... Цитировать руководство:

Предупреждение

Эта функция УСТАРЕЛА с версии PHP 5.3.0. Полагаться на эту функцию крайне не рекомендуется.


Как говорится, используйте json_encode() создать свой массив JSON (вместо создания собственного) и завершить его одним вызовом mysql_real_escape_string() при запросе как таковой:

$data = array();
$data['content'] = "<p>This string has it's downsides</p>";
$data['date'] = 1271352514;

$json = json_encode($data);

mysql_query("INSERT INTO data
                VALUES ('" . mysql_real_escape_string($json) . "');");

Также группа PHP рекомендует использовать mysqli вместо mysql, Его объектно-ориентированный API и поддержка параметризованных запросов значительно повышают скорость разработки, сопровождение кода и безопасность.

Вот код выше, написанный с использованием mysqli:

$data = array();
$data['content'] = "<p>This string has it's downsides</p>";
$data['date'] = 1271352514;

$json = json_encode($data);

$sqlInsert = $mysqli->prepare("INSERT INTO data VALUES (?);")
$sqlInsert->bind_param("s", $json);
$sqlInsert->execute();

Если у вас уже есть строка JSON, как это (кстати: в JSON / тоже нужно убежать)

{"content":"<p>This string has it\'s downsides<\/p>","date":1271352514}

Тогда вам просто нужно подать заявку mysql_real_escape_string чтобы избежать его, чтобы его можно было использовать для вставки в строковое объявление MySQL:

$query = "INSERT INTO … SET json='".mysql_real_escape_string($json).'"';

И если у вас включены магические кавычки, вы должны отключить или удалить их до этого шага, чтобы ваш $json Строка действительно только допустимый JSON.

Другие вопросы по тегам