我正在程序性地制作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只是不更新表。
答案 0 :(得分:0)
哦Mysqli
?我以为你说这是PDO。 Mysqli不支持像:id
这样的命名标记,你必须使用像?
这样的问号
此参数可以在SQL语句中包含一个或多个参数标记,方法是在适当的位置嵌入问号(?)字符。
<强> Reference 强>
对于PDO,您可以使用
准备要执行的SQL语句 PDOStatement :: execute()方法。 SQL语句可以包含零或 更多命名(:name)或问号(?)参数标记 执行语句时将替换实际值。您 不能同时使用命名和问号参数标记 相同的SQL语句;选择一个或另一个参数样式。使用这些 用于绑定任何用户输入的参数,不包括用户输入 直接在查询中。
<强> Manual 强>