mysqli_real_escape_string用于函数db_array_update


mysqli_real_escape_string foreach function db_array_update

以前有人为我写了很多次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被假定为一个内部值,但应该只是一个直接的表名,以防止任何滥用