我对这个很难过。
我有一些代码可以生成更新查询,准备,绑定它们然后执行。第一个查询成功运行,但随后第二个查询失败。查询非常简单。我更加困惑,因为mysql日志显示正在准备的查询,我能够在mysql中手动执行它。请考虑以下代码:
$set = null;
foreach($editable as $field => $value) {
if(!empty($value))
$set .= $field."=?,";
}
$set = substr($set, 0, -1);
// generate the update query based on object data, and execute it
$stmt = $this->dbh->stmt_init() or die("stmt_init: ".$this->dbh->error);
$stmt->prepare("UPDATE ".$this->table_name."
SET ".$set."
WHERE ".$whereclause) or die("prepare failed: ".$this->dbh->error." (".$stmt->sqlstate.")");
if($stmt->error) die($stmt->error);
$this->bindParameters($stmt, $editable);
$stmt->execute();
$stmt->close();
function bindParameters(&$statement, &$params) {
echo "<pre>";
var_dump($statement);
echo "</pre>";
$args = array();
// just assume every value is string type
$args[] = implode('', array_map(function($v) {
return "d";
},
array_values($params)));
foreach ($params as $paramName => $value) {
$args[] = &$params[$paramName];
//$params[$paramName] = null;
}
var_dump($args);
//die();
call_user_func_array(array(&$statement, 'bind_param'), $args);
}
第一部分在循环中运行,其中$ editable是字段名称和值的数组。 $ whereClause总是“client_id = 83”。 $ this-&gt; dbh保存连接对象。此代码适用于第一次更新,但不适用于第二次更新。它正在生成这样的查询:
UPDATE client_rate SET rate=? WHERE client_id=83
它创造了以下内容:
UPDATE client_rate SET rate=99 WHERE client_id=83
UPDATE client_rate SET rate=165 WHERE client_id=83
第二个是因语法错误而失败的那个。 mysql日志显示这些查询,我可以手动运行它们而没有错误。
错误显示的错误是:
prepare failed: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE client_id=83' at line 3 (42000)
这是我在与此相关的mysql查询日志中看到的:
19954 Query SELECT * FROM client_rate LIMIT 0
19954 Query SELECT * FROM client_rate WHERE client_id=83
19954 Prepare UPDATE client_rate
SET rate=?
WHERE client_id=83
19954 Execute UPDATE client_rate
SET rate=99
WHERE client_id=83
19954 Close stmt
19954 Query SELECT * FROM client_rate WHERE client_id=83
19954 Prepare UPDATE client_rate
SET rate=?
WHERE client_id=83
19954 Execute UPDATE client_rate
SET rate=165
WHERE client_id=83
19954 Close stmt
我该怎么做错了会导致准备检测错误?
更新: 当我删除所有错误检查时,我可以看到数据库实际上正在运行查询。我只是在我的页面上得到以下几次:
Warning: mysqli_stmt::bind_param(): invalid object or resource mysqli_stmt
任何明显的事情可能都是我遗失的?
答案 0 :(得分:0)
好吧,到底我老实说不知道是什么造成的。我注意到我的调试代码真的堆积起来试图解决这个问题,所以我还原了我的工作副本。然后神秘地开始工作。
我不确定我做了什么来打破它,但现在它有效......