【问题标题】:Prevent duplicate data in Mysql with php用php防止Mysql中的重复数据
【发布时间】:2022-01-25 02:59:29
【问题描述】:

我创建了一个与mysql连接的简单注册表

html代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <link href="css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
    
    <div class="container">

<form method="post" enctype="multipart/form-data>">
<div class="form-group">

<label for="username"> User Name</label>
<input type="text" name="username" id="username">
</div>
<br>
<div class="form-group">
<label for="password"> password</label>
<input type="password" name="password" id="password">
</div>
<br>
<div class="form-group">
<label for="age"> Age</label>
<input type="text" name="age" id="age">
</div>
<br>

<button class="btn btn-primary btn-block" name="b_send"> send data</button>

</form>



</div>

    <script src="js/bootstrap.min.js"></script>
    <script src="js/jquery.js"></script>

</body>
</html>

mysql : dbname = final 表是=学生

在学生表中,我有列(用户名),我将其设置为 UNIQUE,

在 php 代码中我建立连接:

    <?php
    
if ($_SERVER['REQUEST_METHOD']=="POST"){

    if(isset($_POST['b_send'])){

        $username= $_POST['username'];
        $password=$_POST['password'] ;
        $age=$_POST['age'];
        
            try{
$conn=new PDO ("mysql:host=localhost; dbname=final",
                "admin","admin");
                
$sendvalues=$conn->exec("insert into students(username,password,age)
                        values('$username','$password','$age')"); 
                                                                                        

}

catch(PDOExeption $e){

    echo "error in data send";

}
         

}

}

?>

现在,我想检查一下,如果用户输入了列(用户名)中已经存在的重复名称,它会阻止向数据库发送数据并给用户错误消息

提前致谢

【问题讨论】:

  • 您应该查阅教程或手册。您可以使用此代码进行 SQL 注入。如果您检查$sendvalues 错误代码,您可以查看它是重复错误还是其他错误。或者,您可以发送 AJAX 检查,然后在注册之前告诉用户它已经存在。尽管可以识别所有用户名,但这将允许暴力攻击。
  • 谢谢 user3783243 我还没学过 AJAX 或 php 注入
  • 在 INSERT 之前,执行 SELECT 以查看用户名是否存在。
  • 我想检查一下,如果用户输入了列(用户名)中已经存在的重复名称,它会阻止向数据库发送数据并给用户错误消息没有意义.现在您发送 1 个查询并查看名称是否重复。在您想要进行的情况下,您将发送 1 个查询(并查看名称是否重复)或 2 个查询。您想从哪里获利?
  • 旁注:不要使用字符串插值或连接将值获取到 SQL 查询中。这很容易出错,并且可能使您的程序容易受到 SQL 注入攻击。使用参数化查询。见"How to include a PHP variable inside a MySQL statement""How can I prevent SQL injection in PHP?"

标签: php mysql pdo


【解决方案1】:

您可以继续使用insert into,如果在执行这样的查询时发生错误,请捕获错误:

try {
   $conn->exec("insert into students(username,password,age)
                        values('$username','$password','$age')"); 
   // do other things if successfully inserted
} catch (PDOException $e) {
   if ($e->errorInfo[1] == 1062) {
      // duplicate entry, do something else
   } else {
      // an error other than duplicate entry occurred
   }
}

由于您将列username 设置为UNIQUE,因此在尝试插入重复条目时执行将引发错误。

或者您可以使用insert ignore 并完全忽略错误消息。 阅读更多关于insert ignorehere

【讨论】:

  • 你好@noah1400 当我注册现有帐户时没有任何反应,它没有记录在数据库中,但没有向用户显示有关重复输入的错误
猜你喜欢
  • 2019-12-04
  • 1970-01-01
  • 1970-01-01
  • 2012-03-24
  • 2015-04-13
  • 2021-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多