3

我想知道如何在 MySQL + PDO 中获取警告计数。

在控制台中进行查询时,我遇到了警告,寻找 varchar 而没有添加撇号(' ')。

mysql> describe keywords;
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| document_id | int(11)      | NO   | MUL | NULL    |                |
| keyword     | char(50)     | NO   |     | NULL    |                |
| value       | varchar(250) | YES  |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

mysql> select * from keywords where value = 1234567890;
+-----+-------------+--------------------+------------+
| id  | document_id | keyword            | value      |
+-----+-------------+--------------------+------------+
| 311 |          71 | Nº de Operacion   | 1234567890 |
+-----+-------------+--------------------+------------+
1 row in set, 12 warnings (0.00 sec)

mysql> show warnings;
+---------+------+---------------------------------------------------------+
| Level   | Code | Message                                                 |
+---------+------+---------------------------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: '1234-0'              |

我有一个参数化查询,我想知道该查询是否也在生成警告,或者在参数化时值是字符串还是整数都没有关系。

例子:

'SELECT * FROM keywords WHERE value = :value'

适用于搜索整数和字符串,或者我应该添加撇号:

'SELECT * FROM keywords WHERE value = \':value\''

用于搜索 varchar。顺便说一句,没有给出结果。

4

2 回答 2

11

SHOW WARNINGS好吧,据我所知,除了显式运行查询之外别无他法。

但老实说,我认为在 PHP 中出现 mysql 警告并没有多大意义。仅在开发阶段需要它们,但在实时服务器上根本不应该有任何引发警告的查询。

关于您对截断值的怀疑-它们是毫无根据的。准备好的陈述不是你想象的那样工作。当使用准备好的语句时, PDO永远不会产生可能引发类似警告的查询。

只需去掉这些错误的引号,运行正确的查询并查看:

$stm = $pdo->prepare('SELECT * FROM keywords WHERE value = :value');
$stm->execute(array(':value'=>'whatever'));
$stm = $pdo->query('SHOW WARNINGS');
var_dump($stm->fetchAll());
于 2013-06-24T13:56:36.230 回答
3

构建 PDO 实例时,传递一个包含此键值对的选项数组:

array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)

PDOException在发生错误时强制 PDO 抛出异常(实例)。此外,在使用准备好的语句时,您不要添加自己的引号......如果值是字符串,

WHERE value = :value

很好,PDO/MySQL 会为您正确引用该值。

PS:您以后可以随时更改错误模式,方法是调用setAttribute

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);//raise warnings, don't throw errors

这是属性列表在
这里,您将找到通过构造函数设置选项的示例

文档页面中的示例,仅扩展了一点:

$pdo = new PDO('mysql:host=myhost;dbname=mydb', 'login', 'password',
    array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'',
          PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
          PDO::ATTR_ORACLE_NULLS       => PDO::NULL_NATURAL)
);

编辑:
再看你的问题后,我注意到你得到的实际警告。该警告显然不会引发异常。准备好的语句在准备好语句时检查数据类型,完成该工作后,将执行该语句。在您的情况下,将双精度转换为 varchar,然后执行查询,将 varcharsvalue与查询中的 varchar 进行比较。没有警告,没有大惊小怪,它只是完成工作
这是一个相关的问题
这里是关于准备工作的更详细的解释

于 2013-06-24T13:45:55.980 回答