我有一个表,其中存储了json_encode
的数据。我尝试mysql_escape_string
以及mysql_real_escape_string
,但两者都不适用于我的情况。
例如:
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 :(得分:1)
好吧,因为你不能简单地在一个更大的项目中切换数据库API,我仔细研究了你的问题。不过,您应该尽快切换到mysqli
或PDO
。
你犯的错误是在错误的位置使用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) . "')");
数据库中的值:
@:;_-#()\/+.,?!\'"