PHP MySQLi预编译语句';s返回false
我对预先准备好的语句系统有一个问题,尽管它是一个管理DB表项的类系统 所以我遇到的问题是PHP MySQLi预编译语句';s返回false,php,database,mysqli,mariadb,Php,Database,Mysqli,Mariadb,我对预先准备好的语句系统有一个问题,尽管它是一个管理DB表项的类系统 所以我遇到的问题是 INSERT INTO `sys_User` SET `email` = ? `last_name` = ? `password` = ? `encryption` = ? 在下面的一行$stmt=$db->prepare($sql)失败(返回false) 但是我没有从数据库引擎中得到错误 Array ( [Number] => 256 [String] => MySQLi Q
INSERT INTO `sys_User` SET `email` = ? `last_name` = ? `password` = ? `encryption` = ?
在下面的一行$stmt=$db->prepare($sql)代码>失败(返回false)
但是我没有从数据库引擎中得到错误
Array
(
[Number] => 256
[String] => MySQLi Query failed MySQL said ''.
[File] => /var/www/models/table/base.php
[Line] => 282
)
在所有数据库表类的基类内
$db = self::getDatabase();
$bindParamArgs = array();
$bindParamArgs[] = "";
$sql = "INSERT INTO `".$this->getTableName()."` SET ";
foreach($this->updated as $name => $val){
$sql .= " `".$name."` = ?";
$bindParamArgs[0] .= $columns[$name]->Type;
$bindParamArgs[] = &$this->values[$name];
}
echo $sql;
$stmt = $db->prepare($sql);
if(!$stmt){
\trigger_error("MySQLi Query failed MySQL said '".$stmt->error."'.", \E_USER_ERROR);
}
$result = \site\model\Database::getEvaluatedBind($stmt, $bindParamArgs);
一些需要的信息:
self::getDatabase()代码>返回与数据库(MySQLi)对象的连接
$this->getTableName()
获取我们正在处理的表的表名这是从已调用的类名计算出来的
$this->updated
表中所有列的数组,如果已修改且需要保存,则该数组等于布尔值true
\site\model\Database::getEvaluatedBind(mysqli_stmt&$stmt,$params)
我创建的一个自定义方法,用于调用bind_param,使该死的pass-by-reference系统满意
这件事一定很简单,我想不出来,我就是想不出来。答案是基于@jeroen上面的评论
此处出现了您的错误:
INSERT INTO `sys_User` SET `email` = ? `last_name` = ? `password` = ? `encryption` = ?
应该是:
INSERT INTO `sys_User` SET `email` = ?, `last_name` = ?, `password` = ?, `encryption` = ?
你需要用逗号分隔列占位符对。OMG谢谢@jeroen我现在正在测试,如果我遗漏了这样的内容,我已经对整个系统进行了很长时间的研究。你试过$db->error吗?echo$sql;然后在命令行客户端中复制并粘贴输出。如果是prepare语句,请使用语法“prepare xyz FROM”。然后看看解析错误,@GeorgRichter你错了,因为我不想做选择,这就是prepair的作用。这是一个插入,我不想保存语句,我想在那里使用它,然后让引擎忘记它。。。我已将其标记为答案,因为它是正确的,但您是否可以在您的awser顶部提及这是@jeroen的评论,只是他首先将答案作为评论给了我:)@没有看到这一点。是的,我当然会联系他