有没有办法用Zend_Db_Adapter检索SHOW WARNINGS的输出?

时间:2013-02-23 16:26:03

标签: php mysql zend-framework

让我们考虑一个非常基本的表格:

CREATE TABLE test_warning (col_a INT NOT NULL, col_b INT NOT NULL)

+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| col_a | int(11) | NO   |     | NULL    |       |
| col_b | int(11) | NO   |     | NULL    |       |
+-------+---------+------+-----+---------+-------+

当我插入一行而未指定其中一列时,会生成警告:

INSERT INTO test_warning (col_a) VALUES (1);
Query OK, 1 row affected, 1 warning (0.05 sec)

SHOW WARNINGS;
+---------+------+--------------------------------------------+
| Level   | Code | Message                                    |
+---------+------+--------------------------------------------+
| Warning | 1364 | Field 'col_b' doesn't have a default value |
+---------+------+--------------------------------------------+

是否有人尝试在zend应用程序中使用SHOW WARNINGS检索Zend_Db_Adapter的输出?

我试过以下:

  • 使用适配器插入一行(例如,通过创建Zend_Db_Row并保存它),错过列的值以引发警告。
  • 执行$adapter->query('SHOW WARNINGS')->fetchAll();之类的命令。这将返回一个空数组。

我开始相信Zend_Db_Adapter对于通过SELECT检索数据非常有用。

1 个答案:

答案 0 :(得分:1)

有趣的问题。我只是运行测试,fetchAll()确实似乎返回MySQL警告的结果,至少对我来说!我正在运行ZF 1.12.0

首先,我在命令行上运行了一条SQL语句,其中字段的值超出了VARCHAR限制,并且列没有默认值。

结果如下:

mysql> INSERT INTO `myTable` (`example2`) VALUES ('a value that is too long');

mysql> show warnings;
+---------+------+-------------------------------------------------+
| Level   | Code | Message                                         |
+---------+------+-------------------------------------------------+
| Warning | 1364 | Field 'example1' doesn't have a default value   |
| Warning | 1265 | Data truncated for column 'example2' at row 1   |
+---------+------+-------------------------------------------------+

然后我使用Zend_Db运行相同的查询...

$stmt = $db->query(
    'INSERT INTO `myTable` (`example2`) VALUES (\'a value that is too long\')'
);


$stmt = $db->query(
    'SHOW WARNINGS;'
);

$result = $stmt->fetchAll();

echo '<pre>';
var_dump($result);
echo '</pre>';

以下是结果:

array(4) {
  [0]=>
  array(3) {
    ["Level"]=>
    string(7) "Warning"
    ["Code"]=>
    string(4) "1364"
    ["Message"]=>
    string(44) "Field 'example1' doesn't have a default value"
  }
  [1]=>
  array(3) {
    ["Level"]=>
    string(7) "Warning"
    ["Code"]=>
    string(4) "1265"
    ["Message"]=>
    string(44) "Data truncated for column 'example2' at row 1"
  }
}

这里的主要区别是我将SQL直接写入query()方法而不是使用Zend_db_Select构造它。值得一提的是,虽然理论上它不应该有所作为。