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
2.^ http://www.php.net/ChangeLog-5.php, section 5.2.7
3.^ http://framework.zend.com/issues/browse/ZF-1343

Posted in PHP
It's me ;-)

Nam Khanh Do

Khanh is a full stack web developer with over 10 years of experience developing for the web. You can reach him on Twitter, like him on Facebook and connect with him on LinkedIn.

Leave a Reply

Your email address will not be published. Required fields are marked *