Добавляет косые черты, mysql_real_escape всегда добавляет две косые черты? - PullRequest
2 голосов
/ 15 апреля 2010

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

К сожалению, 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 ]

0 голосов
/ 15 апреля 2010

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

Внимание

Эта функция была УСТАРЕЛА по состоянию на 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();
0 голосов
/ 15 апреля 2010

Если у вас уже есть строка 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.

...