以前有人为我写了很多次PHP程序,现在我在运行代码时遇到了这个错误:
mysqli_real_escape_string()
期望参数2为字符串、数组在…中给出
我无法修复这里的代码:
function db_array_update($table, $a, $where)
{
$q = "update $table set ";
$b = NULL;
foreach($a as $key => $value)
{
if (is_int($key))
continue;
$con = mysqli_connect("localhost", MYSQLUSER , MYSQLPASS, MYSQLDB);
$b[] = "$key='".mysqli_real_escape_string($con, $value)."'";
}
$q .= implode(",", $b);
$q .= " where ".$where;
db_query($q);
}
我这样使用它:
db_array_update("all_data",array('last_fetched' =>date("Y/m/d H:i:s"),'name'=>$name, 'creation'=>$creat, 'expiration' =>$expire,"id=".$res['id']);
有人能帮我怎么修吗?尝试了很多东西但没有成功。。。
作为$a
传递到函数中的内容必须有一个或多个数组值,这些值本身就是数组。如果$value
是一个数组,即您有一个多维数组而不是简单的键/字符串对,则会出现此错误。
在函数中执行var_dump($a)
,查看哪个数组值是数组。此外,你在传递的数据中也有一些错误:
db_array_update("all_data",array(
'last_fetched' => date("Y/m/d H:i:s"),
'name'=>$name, // May be an array?
'creation'=>$creat, // May be an array?
'expiration' =>$expire, // May be an array?
), // Need this closing ) to end the array.
"id=".$res['id'] // This one should be outside the array!
);
此外,您需要在为$where
条件传递的'id='
位之前关闭数组,您已经在那里打开了括号。
实际上,你的代码在这个问题之外充满了有趣的东西。在这里研究答案。如果这是一个有代表性的代码样本,那么应该有人重写您的数据库功能。
对mysqli的使用是错误的。优衣库的全部收益已经降到了零。看见http://php.net/manual/en/book.mysqli.php例如。
要更正部分代码:
- 连接被打开了很多次:真的效率很低
- 当以正确的方式将数据添加到数据库中时,不需要escape:不使用变量绑定=>对SQL注入的保护非常弱
这些可能的更正后的代码:
function db_array_update($table, $a, $where)
{
$q = "update $table set";
$b = NULL;
$c=null;
$con = mysqli_connect("localhost", MYSQLUSER , MYSQLPASS, MYSQLDB);
foreach($a as $key => $value)
{
if (is_int($key))
continue;
$b[]="$key=?";
}
$q .= implode(",", $b);
$q .= " where ".$where;
$stmt = $mysqli->prepare($q);
foreach($a as $key => $value)
{
if (is_int($key))
continue;
$stmt->bind_param($key, $value);
}
$stmt->execute();
$stmt->close();
}
这仍然不符合:
- $where是未知字符串,应具有参数绑定
- $table被假定为一个内部值,但应该只是一个直接的表名,以防止任何滥用