如果不存在将多个值插入表MySQL

时间:2019-07-15 01:44:52

标签: php mysql

我有一个包含3列(ID,用户名,全名)的表,我希望ID为AUTOINCREMENT。我只想在表中不存在的情况下插入表中。

这是我的代码:

$fullName = $_POST['fullname'];
$username = $_POST['username'];
$dbhost = "localhost";
  $dbname = "databasename";
  $dbusername = "root";
  $dbpassword = "";

  $link = new PDO("mysql:host=$dbhost;dbname=$dbname","$dbusername","");

  $statement = $link->prepare('INSERT INTO accounts (username, fullname)
      VALUES (:username, :fname)');

  $statement->execute([
      'fname' => $fullName,
      'username' => $usernameget,
  ]);

6 个答案:

答案 0 :(得分:1)

如果您的 id 已经自动增加,则无需在查询中提及。

您可以在下面的查询中简单地编写

insert into accounts (username,fullname) values( $username , $fullname )

答案 1 :(得分:0)

这里有几处要解决。

  • 如果您不需要或不关心列值,请不要指定列值。仅在必要或相关时指定 。在这种情况下,id应该省略。
  • 始终将占位符值用于用户数据。 从不直接将$_GET$_POST数据放入查询中。
  • 为避免重复,在表上添加UNIQUE约束。

要解决此问题,您可以调整代码:

// Enable exceptions, avoiding the need for manual error checking
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

// Try and keep the order of things like this consistent through your code
$username = $_POST['username'];
$fullname = $_POST['fullname'];

// Here using a short, common name for the database handle $db    
$db = new mysqli("localhost","root","","database");

// Prepare your insert first as a query with no data, only placeholders
$db->prepare("insert into accounts (username,fullname) values(?,?)");

// Bind the data to the placeholders, here two string ("s") values.
$db->bind_param('ss', $username, $fullname);

// Execute the query
$db->execute();

要添加UNIQUE约束,请使用CREATE INDEX

CREATE INDEX idx_accounts_username (username);
CREATE INDEX idx_accounts_full_name (full_name);

那必须在您的MySQL Shell中运行,而不是PHP。

在放置UNIQUE约束时,MySQL将不允许重复数据。请注意,NULL值不计算在内,可以“复制”。在列上设置NOT NULL,以强制它们完全唯一。

答案 2 :(得分:0)

由于您的id是自动增量主键,因此您可以使用以下方法创建或更新它:

insert into accounts (username,fullname) values( $username , $fullname ) on duplicate key update username = '$username',fullname = '$fullname'

答案 3 :(得分:0)

您可以使用PHP中的else条件来做到这一点

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

$chk = mysqli_query("select * FROM `accounts` where fullname='$fullname' and username='$username'");
$rs = mysqli_fetch_array($chk);
if($rs == "")
{
    $ins = mysqli_query("INSERT INTO `accounts`(fullname,username) VALUES ('$fullname','$username'))";
} 
else{
    echo "Duplicate entry";
}   

或者您也可以通过SQL查询执行此操作。

INSERT INTO accounts(username,fullname)
SELECT * from (SELECT '$username', '$fullname') AS tmp
WHERE NOT EXISTS
(SELECT username FROM accounts WHERE username='$username')

答案 4 :(得分:0)

要获得正确答案,必须提出问题并提供尽可能多的解释。你应该至少告诉你做了什么,然后得到什么。
据我了解,要实现您的目标,必须更改表结构并插入查询。
请记住接受答案,如果答案满足您的要求,请单击“上投票”按钮,
否则请提供问题的更多信息,以便此处的成员可以给出正确的答案。

如果您了解创建表的查询,请转到此答案的底部,否则请执行以下操作:
如果您使用gui创建表,
1.单击创建新表。

enter image description here
2.在右窗格中,给出表名和列名,如图所示。 (不要在“全名”中留空格,而应使用“ full_name”或“ fullname”)

enter image description here 3.向右滚动窗口,直到看到A_I列,如图所示。

enter image description here 4.勾选第一行(我们已将其用作ID),将出现“添加索引”框。
  只需单击此处转到(底部)即可。
  您将被重定向到表列表,如图所示。 enter image description here 6.再次打开(单击)表。

enter image description here 7.单击结构。
enter image description here    现在假设您不想在“用户名”列中重复,请单击此列并单击“唯一”,如图所示

enter image description here 如果不想在两个列的值都在一起时重复,请单击两个列,然后单击“唯一”,如图所示

enter image description here



如果您了解create table命令:

这是上面的sql: 创建表accounts(  id int(11)NOT NULL AUTO_INCREMENT,  username varchar(25)NOT NULL,  fullname varchar(55)NOT NULL,  主键(id),  唯一键usernameusername) )ENGINE = MyISAM DEFAULT CHARSET = latin1


具有以上表结构的记录将自动增加,并且不会添加重复的名称。 (记住,在使用
将查询插入到

插入查询时,要处理重复的条目错误,您的查询将是:

$statement = $link->prepare('INSERT IGNORE INTO accounts (username, fullname)
      VALUES (:username, :fname)');


,或者您也可以使用
ON DUPLICATE KEY)

答案 5 :(得分:0)

如果未设置为自动增量,请先设置您的主键(例如ID)

第二次使用多次插入值

INSERT IGNORE INTO accounts (username,fullname) VALUES ("p","k"),("c","s");

IGNORE关键字用于重复

如果您想用PDO来查看