2016-10-27 13 views
-3

У меня есть одна таблица, в которой хранятся данные с json_encode. Я пробовал mysql_escape_string, а также mysql_real_escape_string, но оба они не работают в моем случае.Как вставить специальный символ в MySQL?

Например:

my password is : @:;_-#()\/+.,?!'" 

update new_devices set parameter = '{"password":"@:;_-#()\/+.,?!'""}' where id = 126 

With mysql_real_escape_string : 

update new_devices set parameter = '{"password":"@:;_-#()\/+.,?!\\\\\\'\\\\\\\""}' where id = 126; 

PHP код:

function update_password($param_array){ 
    $param_array['new_pass']=mysql_escape_string($param_array['new_pass']); 
    $dirparam['password'] = $param_array['new_pass']; 
    $sip_query_result = $this->update_query("Device Update Query", "devices", $param_array['id'],array("dir_params" => json_encode($dirparam))); 
} 

function update_query($method_name,$table_name,$where,$update_array){ 
if (is_array($update_array)) { 
    $data_str = " set "; 
    foreach ($update_array as $key => $value) { 
     $data_str.=$key . " = '" . $value . "',"; 
    } 
    $data_str = rtrim($data_str, ","); 
    }else{   
    $data_str=" set ".$update_array; 
    } 
    $update_query=null; 
    if (!empty($data_str)) 
    $update_query.="update " . $table . $data_str; 
    $where_str=null; 
    if (!empty($where)) { 
     $where_str = " where id =".$where; 
    } 
    $update_query = $update_query . $where_str; 
    mysql_query($update_query); 
} 

Это возможно в PHP с помощью другого решения?

Я знаю, что хранилище json_encode данных в базу данных его не очень хорошая идея, но приложение большое, и я не могу сделать это изменение.

+0

использование 'mysql_real_escape_string 'также возможно дублировать. http://stackoverflow.com/questions/2584066/how-to-insert-special-characters-into-a-database – Karthi

+0

@LifeTimeProgrammer благодарит за ответ, но его не дублирует Как я уже сказал, я уже пробовал и его не работает –

+0

Позвольте мне добавить свой вопрос, чтобы показать мой запрос с mysql_real_escape_string –

ответ

1

Хорошо, поскольку вы не можете просто переключить API баз данных в более крупный проект, я более внимательно рассмотрел вашу проблему. Тем не менее, вы должны перейти на mysqli или PDO asap.

Ошибка, которую вы сделали, заключалась в том, чтобы использовать mysql_real_escape_string() в неправильном положении. Вы должны использовать его непосредственно перед отправкой своих данных в базу данных, поэтому ее необходимо использовать внутри вашей функции update_query().

Давайте проверим разницу между правильным и неправильным использованием.

Как обрабатывать данные

Определение пароль.

$password = <<<'PASSWORD' 
@:;_-#()\/+.,?!\'" 
PASSWORD; 

var_dump($password); 
// string(18) "@:;_-#()\/+.,?!\'"" 

Следующий шаг: кодировка json! Вместо этого вы избежали вашей строки в этом месте.

$passwordJSON = json_encode($password); 
var_dump($passwordJSON); 
// string(24) ""@:;_-#()\\\/+.,?!\\'\""" 

// compared to: 

$passwordEscaped = mysql_real_escape_string($password); 
var_dump($passwordEscaped); 
// string(22) "@:;_-#()\\/+.,?!\\\'\"" 

Затем приходит время, чтобы избежать его для базы данных. Но здесь вы использовали json_encode(), слишком поздно.

$passwordJSONEscaped = mysql_real_escape_string($passwordJSON); 
var_dump($passwordJSONEscaped); 
//string(34) "\"@:;_-#()\\\\\\/+.,?!\\\\\'\\\"\"" 

// compared to 

$passwordEscapedJSON = json_encode($passwordEscaped); 
var_dump($passwordEscapedJSON); 
// string(32) ""@:;_-#()\\\\\/+.,?!\\\\\\'\\\""" 

Результат

$resultCorrectWay = mysql_query("INSERT INTO passwordtest (password) VALUES ('$passwordJSONEscaped')"); 
var_dump($resultCorrectWay); 
// bool(true) 

// vs 

$resultWrongWay = mysql_query("INSERT INTO passwordtest (password) VALUES ('$passwordEscapedJSON')"); 
var_dump($resultWrongWay); 
// bool(false) 

Заключение

С помощью json_encode() ПОСЛЕ вы уже убежали вашу строку, вы добавили новые объекты, которые должны были бы быть экранированы для вашего запроса на работу ,

Сделайте это в правильном порядке, затем база данных может обрабатывать ваше заявление.

Все дело за попытку его дома

<?php 
ini_set('display_errors', 1); 
error_reporting(-1); 

mysql_connect('localhost', 'user', 'password'); 
mysql_select_db('test'); 

echo '<pre>'; 
$password = <<<'PASSWORD' 
@:;_-#()\/+.,?!\'" 
PASSWORD; 

var_dump($password); 
// string(18) "@:;_-#()\/+.,?!\'"" 

$passwordJSON = json_encode($password); 
var_dump($passwordJSON); 
// string(24) ""@:;_-#()\\\/+.,?!\\'\""" 

$passwordJSONEscaped = mysql_real_escape_string($passwordJSON); 
var_dump($passwordJSONEscaped); 
//string(34) "\"@:;_-#()\\\\\\/+.,?!\\\\\'\\\"\"" 

$resultCorrectWay = mysql_query("INSERT INTO passwordtest (password) VALUES ('$passwordJSONEscaped')"); 
var_dump($resultCorrectWay); 
// bool(true) 

$passwordEscaped = mysql_real_escape_string($password); 
var_dump($passwordEscaped); 
// string(22) "@:;_-#()\\/+.,?!\\\'\"" 

$passwordEscapedJSON = json_encode($passwordEscaped); 
var_dump($passwordEscapedJSON); 
// string(32) ""@:;_-#()\\\\\/+.,?!\\\\\\'\\\""" 

$resultWrongWay = mysql_query("INSERT INTO passwordtest (password) VALUES ('$passwordEscapedJSON')"); 
var_dump($resultWrongWay); 
// bool(false) 

редактировать: когда не JSON кодирования

var_dump($password); 
// string(18) "@:;_-#()\/+.,?!\'"" 
mysql_query("INSERT INTO passwordtest (password) VALUES ('" . mysql_real_escape_string($password) . "')"); 

Значение в базе:

@:;_-#()\/+.,?!\'" 
+0

Большое спасибо за ответ и такую ​​помощь. Но все-таки я получаю вопрос, как мой пароль будет храниться в базе данных с помощью \ есть ли другое возможное решение для хранения точной строки, как мы получаем от пользователя? Например: Текущий пароль: @:; _- #() \/+.,?! '" Сохраненный пароль базы данных: @:; _- #() \/+.,?! \\\\ \\ '\\\\\\\ "" –

+0

Как вы можете видеть, некоторые из этих «приходят за кодировкой json ... так что просто не кодируйте его, если это беспокоит вас, я думаю, или возиться с данные и удалить эти символы после кодирования.Есть ли реальная проблема с этими charakters? Tbh ваш вопрос, как «Я добавляю« ABC »в строку, почему она не сохраняется как строка, прежде чем я добавил« ABC »? – Philipp

+0

@Phillipp Я удалил json-кодировку из своих полей, но все равно, когда я собираюсь хранить пароль с котировками или двойными кавычками в своем магазине со слэшами, так что, пожалуйста, помогите мне в этом? –

Смежные вопросы