SQL插入后的PHP异常处理

时间:2016-07-04 15:33:36

标签: php mysql

我在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
 }
}
?>

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

3 个答案:

答案 0 :(得分:2)

来自评论:

  

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

好的,所以你有一个插入查询和检查是唯一的吗?因此,您必须在UNIQUE_INDEX MySQL列上进行INSERT,您可以使用以下shameless stolen from this answerthis question的答案来捕获这些异常:

  

在这个答案的情况下,我们假设您正在使用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.
        }
    }

你也应该阅读catching and outputting PDO errors。以及关于MySQL Unique Key Constraints的所有内容。

  • Should not catch PDO exceptions也是非常有用的替代观点。

  • 另请注意,MD5是用于存储密码的极弱哈希,并且PHP password_hash函数是非常首选的方式。

  • 为您的MySQL互动使用预备语句,上面的布局是它们外观的粗略指南,并且与MySQLiPDO非常相似。准备好的声明非常有道理用于保护您的数据免受恶意用户输入的侵害。

答案 1 :(得分:-1)

好吧,我可以给你代码,但首先你试试这个。

首先,您需要在代码的成功部分创建一个查询,该查询将从表中获取所有用户名 然后使用条件,如果必须检查用户输入的数据

代码可以像以下一样种植: &#34;从用户中选择用户名===&#39; $ username&#39;&#34 ;; if($ username === input_username){ 抛出一个错误。 }

三江源。

答案 2 :(得分:-2)

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