2013-03-06 44 views
-1

我在更新脚本中遇到了一些问题。我绑定了我的值,但它返回false,我看不到我做错了什么。pdo绑定在更新中返回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。

+2

'$ DB->的setAttribute(PDO :: ATTR_ERRMODE,PDO :: ERRMODE_EXCEPTION);' – 2013-03-06 08:16:41

+0

如果'PDOStatement对象::执行()'返回'FALSE',你不应该得出这样的结论:你做错了什么,因为它是该函数的有效返回值。这只意味着该陈述出现了失败,并且陈述本身包含错误信息。只需选择错误信息http://www.php.net/manual/en/pdostatement.errorinfo.php它会告诉你更多关于失败的信息。因此,不要仅在您的问题中告知FALSE(这可能意味着很多),您应该提供具体的错误信息。 – hakre 2013-03-06 08:25:57

+0

应该注意,上面的pdo脚本不是我的工作。在这里找到它 - 找不到线程。 问题更新错误 – 2013-03-06 09:13:47

回答

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

您只能对准备好的语句使用绑定函数。​​用于在事先已经知道查询的所有值/变量的情况下生成查询。

+0

他仍然在占位符中使用'PDO :: query'。对我来说没有意义。 – silkfire 2013-03-06 08:24:41

+1

可能不命名'prepare'方法'query'的一个原因。我猜OP试图创建一个流畅的界面。 – hakre 2013-03-06 08:29:11

+0

他没有使用'PDO :: query()',这是他自己的代码,它返回一个语句。 – 2013-03-06 08:29:18

-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)); 
} 

这会防止你有问题,结合一个值,但它得到了被忽视。

与执行类似。如果你想提供信息失败的原因,你需要读出错误信息并抛出异常。

相关问题