我在更新脚本方面遇到了一些问题。我绑定了我的值,但它返回false,我看不出我做错了什么。
我正在运行:
$row = $db->query('
UPDATE '. $config->db_prefix .'_adverts
SET ad_type = ?,
title = ?,
text = ?,
price = ?,
category = ?,
condition = ?
WHERE aid = ?')
->bind(1, $ad_type)
->bind(2, $title)
->bind(3, $text)
->bind(4, $price)
->bind(5, $category)
->bind(6, $condition)
->bind(7, $aid)->execute();
}
绑定功能是:
public function bind($pos, $value, $type = null) {
if( is_null($type) ) {
switch( true ) {
case is_int($value):
$type = PDO::PARAM_INT;
break;
case is_bool($value):
$type = PDO::PARAM_BOOL;
break;
case is_null($value):
$type = PDO::PARAM_NULL;
break;
default:
$type = PDO::PARAM_STR;
}
}
$this->stmt->bindValue($pos, $value, $type);
return $this;
}
var_dump($this)
给了我:
object(DB)#1 (2) { ["dbh":protected]=> object(PDO)#2 (0) { } ["stmt":protected]=> object(PDOStatement)#15 (1) { ["queryString"]=> string(211) " UPDATE rno_adverts SET ad_type = ?, title = ?, text = ?, price = ?, category = ?, condition = ? WHERE aid = ?" } }
但我看不出有什么问题。
编辑:
查询功能是这样的:
public function query($query) {
$this->stmt = $this->dbh->prepare($query);
return $this;
}
并执行是这样的:
public function execute($var = null) {
return $this->stmt->execute($var);
}
ERROR:
Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 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 'condition = 3 WHERE aid = 1'
查询的输出:
UPDATE rno_adverts SET ad_type = 3, title = "Gul bil", text = "En flot gul bil med hvide striber", price = 500, category = 4, condition = 3 WHERE aid = 1
我对此查询视而不见,所以我看不出问题所在。如果我删除类别和条件,它可以正常工作。这两个字段在数据库中都是INT NOT NULL。
答案 0 :(得分:2)
您只能将绑定函数与预准备语句一起使用。 ->query()
用于生成查询,您已事先知道查询的所有值/变量。
答案 1 :(得分:0)
只需摆脱这个绑定功能就可以了
$sql = 'UPDATE '. $config->db_prefix .'_adverts SET
ad_type = ?, title = ?, text = ?, price = ?, category = ?, condition = ?
WHERE aid = ?';
$db->query($sql);
$db->execute(array($ad_type, $title, $text, $price, $category, $condition, $aid));
答案 2 :(得分:-1)
根据您的问题,我们无法具体说明错误的位置。因此,我建议您先添加更多错误检查,例如使用bindvalue()
,您不会检查返回值:
$this->stmt->bindValue($pos, $value, $type);
如果失败则抛出异常:
$bind = $this->stmt->bindValue($pos, $value, $type);
if (!$bind) {
throw new Exception(sprintf("Unable to bind parameter %s with a value of type #%d", $pos, $type));
}
这样可以防止您在绑定值时出现问题,但却没有引起注意。
与执行类似。如果要提供信息失败的原因,则需要读出错误信息并抛出异常。