从字符串中制作PDO

时间:2014-10-16 06:50:18

标签: php pdo

我正在程序性地制作PDO声明,到目前为止我已经

    $sql = "UPDATE users SET ";
    $values_array = array();
    foreach($non_empty_fields as $key => $value){
        $sql .= $key;
        $sql .= " = :".$key.", ";
        $values_array[':'.$key] = $value;
    }
    $sql = substr($sql, 0, -2);
    $sql .= " WHERE id = :id";
    $values_array[':id'] = $user_id;

    $sth = $this->conn->prepare($sql);
    print_r($non_empty_fields);
    print_r($values_array);
    echo($sql);
    $sth -> execute($values_array);
    $num_affected_rows = $sth -> affected_rows;
    $sth -> close();

当我运行它时,我得到了

 Array
(
    [gender] => female
    [device_id] => 1213423489ydasxas98y76
)
Array
(
    [:gender] => female
    [:device_id] => 1213423489ydasxas98y76
    [:id] => 35
)
UPDATE users SET gender = :gender, device_id = :device_id WHERE id = :id<br />
<b>Fatal error</b>:  Call to a member function execute() on a non-object in <b>/Sites/api/include/DbHandler.php</b> on line <b>280</b><br />

我怀疑它是因为我没有正确设置准备好的语句,所以我的问题是:你如何用字符串制作一个预备语句?

更新:

call_user_func所以代码现在看起来像:

    $sql = "UPDATE users SET ";
    $values_array = array();
    foreach($non_empty_fields as $key => $value){
        $sql .= $key;
        $sql .= " = ?, ";
        $values_array[] = &$value;
    }
    $sql = substr($sql, 0, -2);
    $sql .= " WHERE id = ?";
    $values_array[] = &$user_id;

    $sth = $this->conn->prepare($sql);
    $params = array_merge(array(str_repeat('s', count($values_array))), array_values($values_array));
    call_user_func_array(array(&$sth, 'bind_param'), $params);
    $sth -> execute();

现在我没有表示我得到的错误,pdo只是不更新​​表。

1 个答案:

答案 0 :(得分:0)

Mysqli?我以为你说这是PDO。 Mysqli不支持像:id这样的命名标记,你必须使用像?这样的问号

  

此参数可以在SQL语句中包含一个或多个参数标记,方法是在适当的位置嵌入问号(?)字符。

<强> Reference

对于PDO,您可以使用

  

准备要执行的SQL语句   PDOStatement :: execute()方法。 SQL语句可以包含零或   更多命名(:name)或问号(?)参数标记   执行语句时将替换实际值。您   不能同时使用命名和问号参数标记   相同的SQL语句;选择一个或另一个参数样式。使用这些   用于绑定任何用户输入的参数,不包括用户输入   直接在查询中。

<强> Manual