指定用户不存在时,PDO 连接不会返回错误

问题描述 投票:0回答:2

我正在开发一个配置界面,客户端必须在其中指定数据库参数(主机、用户、密码、数据库)。

try{
  $c = new PDO('mysql:host='.$_POST['database_host'].';charset=utf-8', $_POST['database_user'], $_POST['database_password']);
  $c->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
  $c->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_OBJ);
  $c->query("USE `".$_POST['database']."`;");
}
catch(Exception $e)
{
    if(strstr($e->getMessage(),"[1045] Access denied for user '".$_POST['database_user']."'@'".$_POST['database_host']."' (using password: NO)"))
    {
        $errors[] = "This user requires a password.";
        $fields['database_password']['valid'] = false;
    }
    else if(strstr($e->getMessage(),"[1045] Access denied for user '".$_POST['database_user']."'@'".$_POST['database_host']."' (using password: YES)"))
    {
        $errors[] = "Wrong password or unexisting user.";
        $fields['database_password']['valid'] = false;
        $fields['database_user']['valid'] = false;
    }
    else echo $e->getMessage();
}

如果我输入的现有用户密码错误或没有密码,则会捕获错误(错误消息显示“此用户需要密码。”或“密码错误或不存在的用户。”)。 但如果我输入一个不存在的用户,则不会抛出任何错误,只会发出警告

Warning: PDO::query(): SQLSTATE[42000]: Syntax error or access violation: 1044 Access denied for user ''@'localhost' to database 'mediatheque' in C:\wamp\www\mediatheque3\index.php on line 425

脚本继续运行,我不知道如何停止它并通知用户错误的用户名。

我应该如何处理这个问题? 谢谢你。

php mysql pdo try-catch
2个回答
0
投票

这是有道理的,因为您在创建连接对象后设置了

ERRMODE_EXCEPTION
,所以为时已晚。

解决方案是将属性传递给

PDO
构造函数:

$attribute = array(
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_OBJ
);
$c = new PDO('mysql:host='.$_POST['database_host'].';charset=utf-8',
                           $_POST['database_user'], $_POST['database_password'], 
                           $attribute);

0
投票

即使用户无效,程序仍然继续执行,是因为你没有确切地告诉它停止执行。为此,最简单的方法是在您希望程序停止执行的位置添加“exit()”语句。下面是您的代码,我做了一些小的编辑。如果 PDO 连接失败,它将打印 PDO 的错误并退出。

try{
  $c = new PDO('mysql:host='.$_POST['database_host'].';charset=utf-8',$_POST['database_user'], $_POST['database_password']);
  $c->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
  $c->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_OBJ);
  $c->query("USE `".$_POST['database']."`;");
}
catch(Exception $e)
{
    if(strstr($e->getMessage(),"[1045] Access denied for user '".$_POST['database_user']."'@'".$_POST['database_host']."' (using password: NO)"))
    {
        $errors[] = "This user requires a password.";
        $fields['database_password']['valid'] = false;
    }
    else if(strstr($e->getMessage(),"[1045] Access denied for user '".$_POST['database_user']."'@'".$_POST['database_host']."' (using password: YES)"))
    {
        $errors[] = "Wrong password or unexisting user.";
        $fields['database_password']['valid'] = false;
        $fields['database_user']['valid'] = false;
    }
    exit($e->getMessage());
}
© www.soinside.com 2019 - 2024. All rights reserved.