Php 从字符串生成PDO

Php 从字符串生成PDO,php,pdo,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 = s

到目前为止,我正在按程序制作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 />

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

Oh
Mysqli
?我以为你说是PDO。Mysqli不支持命名标记,如
:id
,您必须使用问号,如

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

对于PDO,您可以使用

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


虽然您的过程有点复杂,但您的最终陈述似乎还不错。
$this->conn
是否已正确初始化?您还应该检查
$this->conn->errorInfo()
after
prepare()
calli如果

实际上是您生成的查询的一部分,那么prepare将失败,因为这不是有效的SQL。见@TiesonT。这不是它的一部分。谢谢你的资源tho@Hanky웃Panky我在prepare之后添加了对error info的调用,得到了这个错误:
调用未定义的方法mysqli::errorInfo()
<代码>$this->conn用于插入一个新用户,我用同样的方法初始化了它,idk为什么这次它可能坏了aroundI本人没有使用MySQLi,但是如果我没有弄错的话-一个占位符,例如
:gender
是用于PDO的。MySQLi使用
占位符作为参数。这可能是问题的原因吗?SQL看起来不错。但是对于PDO.soory的使用,我也很困惑,哈哈,我不知道mysqli准备的声明不是指PDO
    $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();