我正在php中创建一个非常简单的注册表单,当前当用户尝试注册时,将弹出一个带有succes或fail消息的javascript警报。
现在,我想捕获sql异常,以显示用户名或电子邮件是否已经在数据库中执行,而不是标准的失败消息。
这是我目前拥有的代码:
if(isset($_POST['btn-signup']))
{
$uname = mysql_real_escape_string($_POST['uname']);
$email = mysql_real_escape_string($_POST['email']);
$upass = md5(mysql_real_escape_string($_POST['pass']));
if(mysql_query("INSERT INTO user(username,password,email) VALUES('$uname','$upass','$email')"))
{
?>
<script>alert('successfully registered ');</script>
<?php
}
else{
?>
<script>alert('error while registering you...');</script>
<?php
}
}
?>
我如何检查是否电子邮件或用户名已经在数据库中?这两个变量在数据库中都是唯一的。
来自备注:
我不想要2个查询,而数据库可以为我返回一个异常。如果那个表中有大约1000万条记录,我不想在插入一条新的之前检查它们全部。
好的,那么您有一个查询要插入并检查是否唯一?所以你必须在unique_index
MySQL列上插入,你就可以捕捉到这种异常,用下面这样的回答方式来回答这个问题:
在这个答案的情况下,我们假设您正在使用PDO,因为您应该使用PDO。请仔细读一下。
// Pre-setup the database connection somewhere, usually an include (or a class)
$link = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbusername,$dbpassword);
// PDO needs to be set in Exception mode:
$link->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
//Input Processing functions.
// (entirely optional)
$uname = MyCleanerFunction($_POST['uname']);
$email = MyCleanerFunction($_POST['email']);
//please see note below re:MD5
//$upass = md5($_POST['pass']);
$options['cost'] = 12;
$upass = password_hash($_POST['pass'],PASSWORD_BCRYPT,$options);
//now reach the code part:
try {
//PDO query execution goes here:
$statement = $link->prepare("INSERT INTO user(username,password,email) VALUES(:uname, :email, :pass)"));
$statement->bindValue(":uname", $uname);
$statement->bindValue(":email", $email);
$statement->bindValue(":pass", $upass);
$statement->execute();
//reaching here everything is ok!
}
catch (\PDOException $e) {
if ($e->errorInfo[1] == 1062) {
// The INSERT query failed due to a key constraint violation.
// THIS means that it failed because the Primary Key
// (the email) appears already in the database table.
}
if($e->errorInfo[1] == 9999){
// possible other IF clauses for other errors in INSERT.
}
}
您还可以阅读有关捕获和输出PDO错误的内容。以及关于MySQL唯一键约束的所有内容。
>
也是非常有用的另一种观点,即您不应该捕获PDO异常。
另外,请注意,MD5是一个非常弱的用于存储密码的哈希函数,而PHPpassword_hash
函数是最好的方法。
请使用准备好的语句进行MySQL交互,上面的布局是它们外观的粗略指南,对于mysqli
和pdo
非常相似。准备好的语句在保护数据不受恶意用户输入的影响方面有很大的作用。