# SQLSTATE[HY093]: Invalid parameter number: no parameters were bound


Một lỗi củ chuối vừa bị dính ngày hôm qua. Chuỗi sql:

$value = $this->\_db->quote($value); // output like ' test? \\' special characters'
$query = "UPDATE table\_abc SET field\_def = $value WHERE field\_xyz = 123";
$this->\_db->query($query);

Nếu chạy PHP phiên bản thấp hơn 5.2.7 thì sẽ bị lỗi **SQLSTATE\[HY093\]: Invalid parameter number: no parameters were bound**, do PDO parse sai placeholder dẫn đến bind param sai toét. Lỗi này xảy ra khi execute trực tiếp câu lệnh sql mà trong value của nó chứa đồng thời 2 ký tự question mark (?) và single quote (')

Trong ZF thì khắc phục đơn giản bằng cách sử dung Zend\_Db update method (làm bừa nó lại ngon :()

$data = array('field\_def' => $value);
$this->\_db->update('table\_abc', $data, 'field\_xyz = 123');

\[Bổ sung\] Ở đoạn code trên là xử lý cho trường hợp UPDATE, nếu trong trường hợp SELECT thì vẫn bị lỗi bind param, mặc dù dùng Zend\_Db\_Select. Cách giải quyết cực kỳ đơn giản, có thể fix được cho cả trường hợp UPDATE, đó là thay đổi lại setting của Zend\_Db để nó không tự động bind param nữa:

$this->\_db->getConnection()->setAttribute(PDO::MYSQL\_ATTR\_DIRECT\_QUERY, false);

\======================================================= 1.^ Lỗi cụ thể xem tại: [http://bugs.php.net/44251](http://bugs.php.net/44251) 2.^ [http://www.php.net/ChangeLog-5.php](http://www.php.net/ChangeLog-5.php), section 5.2.7 3.^ [http://framework.zend.com/issues/browse/ZF-1343](http://framework.zend.com/issues/browse/ZF-1343)

