Php 从字符串生成PDO
到目前为止,我正在按程序制作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
$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()
afterprepare()
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();