我正在开发一个配置界面,客户端必须指定db参数(主机,用户,密码,db)。
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();
}
如果我输入错误密码或没有密码的现有用户,则会捕获错误(显示错误消息"此用户需要密码。"或"密码错误或未使用的用户。& #34)。 但是,如果我输入一个不存在的用户,则不会抛出任何错误警告
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
并且脚本继续我不知道如何阻止它并通知用户错误的用户名。
我该如何处理这个问题? 谢谢。
答案 0 :(得分: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);
答案 1 :(得分: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());
}