Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以得到PHP';s PDO返回MySQL警告,而不是仅返回错误消息?_Php_Mysql_Pdo_Warnings - Fatal编程技术网

我可以得到PHP';s PDO返回MySQL警告,而不是仅返回错误消息?

我可以得到PHP';s PDO返回MySQL警告,而不是仅返回错误消息?,php,mysql,pdo,warnings,Php,Mysql,Pdo,Warnings,我正在尝试将尽可能多的信息返回给我的用户,并且我希望能够告诉他们是否有来自他们刚刚执行的某个操作的警告,例如,如果数据被截断,因为它被填充到了一个太短的字段中,或者他们试着把字母或小数放进整数字段 出于测试目的,我在自己的页面上将代码缩减为: <?php error_reporting(E_ALL); ini_set('display_errors', True); session_start(); include '../p

我正在尝试将尽可能多的信息返回给我的用户,并且我希望能够告诉他们是否有来自他们刚刚执行的某个操作的警告,例如,如果数据被截断,因为它被填充到了一个太短的字段中,或者他们试着把字母或小数放进整数字段

出于测试目的,我在自己的页面上将代码缩减为:

<?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());
        ?>
这将是在一个唯一的列中插入一个重复的条目,我明白了

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_manufacturer_lookup (manufacturer_name) values (?)";
$var_array = array('Audi');
    $qry_string = "insert into tbl_engine (capacity) values (?)";
    $var_array = array('hjgt');
在整数字段中插入字符串时,errorinfo为

array(3) { [0]=> string(5) "HY000" [1]=> NULL [2]=> NULL }
这与我插入的整数值完全相同

相比之下,MySQL workbench将返回如下内容:

1 row(s) affected, 1 warning(s): 1366 Incorrect integer value: 'fdd' for column 'capacity' at row 1

我真的很想让我的web应用程序返回像这样有用的东西

如果我是你,我不会依赖这样的警告。您应该在PHP中使用simple进行额外的查询和验证数据,并显示一些警告(例如,重复的唯一键)或应为整数的字段(它们不是)


否则,您可能会在数据库中插入一些不应该放在那里的数据(例如,十进制的5,52可能是一个问题,您可能应该在PHP中更正它,或者让用户输入正确的值)

执行
显示警告
查询。更多信息。

要提取PDO警告,请初始化PDO对象,如下所示:

$pdo_conn = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass, array(
    PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING
));

注意,这只能用于调试目的,因为消息通常包含敏感信息。

对于那些查看的人来说,一种快速简便的方法是使用查询
显示警告。这是一个易于根据需要重用的函数

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";
        }
    }

}

是的,我正计划在javascript中存储表结构信息,并在表单元素失去焦点时使用javascript进行验证,我希望有一些备份,您应该在服务器端(使用PHP)验证数据,而不仅仅是在用户端(使用javascript),这对我不起作用,确切的代码给出了
警告:PDO::setAttribute()需要2个参数,3个参数在第22行的/var/www/identicar2/maintain_table/errortest.php中给出
,然后在谷歌搜索之后,我将代码更改为
$PDO_conn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_Warning)。它删除了php错误,但仍然没有通过errorInfo()在“坏”SQL查询上返回任何警告。根据,所做的只是在发生数据库错误时将PDO切换为触发php警告错误(其他选项是忽略所有数据库错误或引发异常)。这与MySQL警告完全无关,MySQL警告不会触发标准PDO错误处理功能。