Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP MySQLi预编译语句';s返回false_Php_Database_Mysqli_Mariadb - Fatal编程技术网

PHP MySQLi预编译语句';s返回false

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

我对预先准备好的语句系统有一个问题,尽管它是一个管理DB表项的类系统

所以我遇到的问题是

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的评论,只是他首先将答案作为评论给了我:)@没有看到这一点。是的,我当然会联系他