mysqli_real_escape_string foreach函数db_array_update

时间:2015-06-27 17:31:49

标签: php arrays mysqli foreach

有人在很多时候为我写了一个PHP程序,现在我在运行代码时遇到了这个错误:

  

<option value="value1" disabled>value1</option> 期望参数2为字符串,数组   在...中给出。

我无法解决这个问题:

mysqli_real_escape_string()

我这样用它:

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);

}

有人可以帮我解决这个问题吗? 试了很多东西,但没有工作......

2 个答案:

答案 0 :(得分:1)

作为$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!
    );

此外,您需要在'id='位之前关闭数组,以便$where条件传入,您在那里有未闭合的括号。

...实际上,你的代码在这个问题之外充满了各种各样的功能。在这里研究答案。如果这是代码的代表性样本,则有人应该重写您的数据库功能。

答案 1 :(得分:0)

使用mysqli是错误的。 mysqli的全部好处已减少到零。有关示例,请参阅http://php.net/manual/en/book.mysqli.php

纠正部分代码:

  • 多次打开连接:真的效率低下。
  • 将数据以正确的方式添加到数据库时,不需要
  • 转义:不使用变量绑定=&gt;针对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被认为是一个内部值,但应该只是一个直接的表名,以防止任何滥用。