try { $db = new PDO("mysql:host=".HOST.";dbname=".DB, USER, PW); $st = $db->prepare("SELECT * FROM c6ode"); } catch (PDOException $e){ echo $e->getMessage(); } 在上述情况下,如何检查查询的mysql错误?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
您需要将错误模式属性PDO :: ATTR_ERRMODE设置为PDO :: ERRMODE_EXCEPTION。 并且由于您期望prepare()方法会引发异常,因此应该禁用PDO :: ATTR_EMULATE_PREPARES * 功能。否则,MySQL服务器在执行之前不会“看到”该语句。
setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $pdo->prepare('INSERT INTO DoesNotExist (x) VALUES (?)'); } catch(Exception $e) { echo 'Exception -> '; var_dump($e->getMessage()); } 打印(以我为例) Exception -> string(91) "SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test.doesnotexist' doesn't exist" 参见http://wezfurlong.org/blog/2006/apr/using-pdo-mysql/ EMULATE_PREPARES = true似乎现在是pdo_mysql驱动程序的默认设置。从那时起,查询缓存的问题已得到修复/更改,并且使用mysqlnd驱动程序,我对EMULATE_PREPARES = false没问题(尽管我只是php爱好者,但请不要相信我的话……) *),然后是PDO :: MYSQL_ATTR_DIRECT_QUERY-我必须承认我不了解这两个属性的相互作用(还好吗?),所以我将它们都设置为 $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly', array( PDO::ATTR_EMULATE_PREPARES=>false, PDO::MYSQL_ATTR_DIRECT_QUERY=>false, PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION ));来源:stack overflow