SQL插入后的PHP异常处理


PHP exception handling after SQL insert

我在php中创建了一个非常简单的注册表单,目前当用户尝试注册时,会弹出一个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
 }
}
?>

如何检查电子邮件或用户名是否已经在数据库中存在?这两个变量在数据库中已经是唯一的

From Comments:

我不想要2查询,而数据库可以为我返回一个异常。如果该表中有大约1000万条记录,我不想在插入新记录之前检查所有记录。

好,所以你有一个查询插入和检查是唯一的?所以你必须在UNIQUE_INDEX MySQL列上插入,你可以用下面这种风格的答案来捕捉这些异常:

在这个答案的情况下,我们将假设您使用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是一个非常弱的哈希用于存储密码,PHP password_hash函数是更首选的方式。

  • 使用准备语句为您的MySQL交互,上面的布局是一个粗略的指南,他们如何看,是非常相似的MySQLiPDO。准备好的语句在保护您的数据免受恶意用户输入方面走了很长的路

$con=mysqli_connect("localhost","root","","my_db");
$check="SELECT COUNT(*) FROM persons WHERE Email = '$_POST[eMailTxt]'";
if (mysqli_query($con,$check)>=1)
{
    echo "User Already in Exists<br/>";
}
else
{
    $newUser="INSERT INTO persons(Email,FirstName,LastName,PassWord) values('$_POST[eMailTxt]','$_POST[NameTxt]','$_POST[LnameTxt]','$_POST[passWordTxt]')";
    if (mysqli_query($con,$newUser))
    {
        echo "You are now registered<br/>";
    }
    else
    {
        echo "Error adding user in database<br/>";
    }
}