【问题标题】:Duplication with INSERT mysqli使用 INSERT mysqli 进行复制
【发布时间】:2013-12-18 06:46:43
【问题描述】:

当我在我的数据库中插入用户名和电子邮件时,数据会重复。所以我有同一个用户的两个 id。当我为查询回显受影响的行数时,结果为 1。有人可以帮我解决这个问题吗?

 <form name="field" method="post" action="test.php">
     <label for="username">Username:</label><br>
     <input name="username" id="username" type="text"/><br>
     <label for="email">Email:</label><br>
     <input name="email" id="email" type="text"/><br>
     <input name="submit" type="submit" value="Register" id="submit" />
    </form>


    <?php

    $mysqli = new mysqli('127.0.0.1', 'root', '', 'project');

        $username = $_POST['username'];
        $email = $_POST['email'];

    $mysqli->query("INSERT INTO `project`.`registration` (`id`,`username`,`email`) VALUES ('id','$username','$email')");

    $result = $mysqli->affected_rows;

    echo $result;

    ?>

【问题讨论】:

  • id的值是多少,你在insert语句中使用过?
  • Affected Rows 显示更改/添加了多少行,因此当您添加一个时,它显示 1
  • 您是否双击了提交按钮?很多年前我就看到了这个问题,而这正是正在发生的事情。如果您在那里进行一些额外的检查以防止输入重复项,它可能会有所帮助。
  • 您可以在插入之前先查询您的数据库,使用mysqli_num_rows 然后如果没有匹配,则继续插入。这是我使用的一种方法。
  • 请切换到prepared statements以防止SQL injection

标签: php forms mysqli


【解决方案1】:

首先,出于安全原因,仅使用准备好的语句和 PDO 包装器。现在来解决问题。你的数据库方案是什么?你从哪里得到你的id 变量?它是你使用它的方式的一个常数。请注意,如果您的方案说 id int auto_increment 主键。它会自行递增,因此您不必手动设置 id。

改变

$mysqli->query("INSERT INTO `project`.`registration` (`id`,`username`,`email`) VALUES ('id','$username','$email')");

$mysqli->query("INSERT INTO `project`.`registration` (`username`,`email`) VALUES ('$username','$email')");

【讨论】:

  • 我可以从支持者那里得到评论吗?解释这个答案的任何用途。
【解决方案2】:

您必须尽可能使用唯一的列。例如,如果用户名是唯一的,您还必须使其在注册表中唯一。

例如:

CREATE TABLE Registration ( 
username varchar(50) NOT NULL UNIQUE, 
email varchar(255) NOT NULL, 
id INT NOT NULL );

通过将此约束添加到您的表中,您应该能够看到错误来自何处。

【讨论】:

  • 这个答案是迄今为止唯一接近问题的答案。然而,它并没有回答为什么会发生重复查询,我相信这是主要问题。
猜你喜欢
  • 2016-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
相关资源
最近更新 更多