我试图尽可能多地向用户提供相关信息,并且我希望能够告诉他们是否有来自他们刚刚执行过的操作之一的警告,例如数据已被截断,因为它已被填充到太短的字段中,或者他们试图将字母或小数放入整数字段中。
出于测试目的,我已经将代码缩减到了它自己的页面上:
<?php
error_reporting(E_ALL);
ini_set('display_errors', True);
session_start();
include '../php/security.php';
sec::dieifnotvalid();
include '../php/db_connection_params.php';
$pdo_conn = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);
$qry_string = "insert into tbl_engine (capacity) values (?)";
$var_array = array('gfd');
$q = $pdo_conn->prepare($qry_string);
$q->execute($var_array);
$return_arr = $q->fetchAll();
var_dump($q->errorInfo());
?>
如果我尝试执行类似的操作,
$qry_string = "insert into tbl_manufacturer_lookup (manufacturer_name) values (?)";
$var_array = array('Audi');
将一个重复的条目插入一个唯一的列,我得
array(3) { [0]=> string(5) "00000" [1]=> int(1062) [2]=> string(57) "Duplicate entry 'Audi' for key 'manufacturer_name_UNIQUE'" }
打印在页面上。这很好。
但如果我这样做,
$qry_string = "insert into tbl_engine (capacity) values (?)";
$var_array = array('hjgt');
将字符串插入整数字段,errorinfo为
array(3) { [0]=> string(5) "HY000" [1]=> NULL [2]=> NULL }
与插入整数值完全相同。
相比之下,MySQL工作台将返回如下内容:
1 row(s) affected, 1 warning(s): 1366 Incorrect integer value: 'fdd' for column 'capacity' at row 1
我真的想让我的网络应用返回一些有用的东西
答案 0 :(得分:2)
执行SHOW WARNINGS
查询。更多信息here。
答案 1 :(得分:1)
对于那些看起来,快速简单的方法是使用查询SHOW WARNINGS
。这是一个可以根据需要重用的简单功能。
function lastWarning($pdo)
{
var_dump($pdo->query("SHOW WARNINGS")->fetch());
}
你可以随心所欲地做到这一点。例如,在PDO子类中:
namespace Foo;
class PDO extends \PDO
{
public function getWarning()
{
$warnings = $this->query('SHOW WARNINGS')->fetch();
if ($warning['Level'] == 'Error') {
return "Warning: {$warning['Message']} [#{$warning['Code']}]\n";
}
}
}
答案 2 :(得分:0)
如果我是你,我会简单地不依赖这样的警告。你应该简单地在PHP中做额外的查询和验证数据并显示一些警告(例如对于重复的唯一键)或者应该是整数的字段(并且它们不是)。
否则你可能会在数据库中插入一些不应该放在那里的数据(例如5,52作为小数就会出问题,也许你应该在PHP中纠正它或让用户输入正确的值)
答案 3 :(得分:-2)
要提取PDO警告,请初始化您的PDO对象,如下所示:
$pdo_conn = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass, array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING
));
请注意,这只应用于调试目的,因为消息通常包含敏感信息。