0

我是一名 Java 开发人员,刚刚接到了“一些快速简单的 DB 东西”的任务——除了我对 PHP/MySQL 不太了解……我需要将一条记录插入数据库——但前提是电子邮件字段与数据库中已存在的字段不匹配。这是我迄今为止收集到的 PHP 代码:

// Grab the values from the HTML form:
$newUserName = $_POST['newUserName'];
$newUserName = $mysqli->real_escape_string($newUserName);
$newUserEmail = $_POST['newUserEmail'];
$newUserEmail = $mysqli->real_escape_string($newUserEmail);

// Now search the DB to see if a record with this email already exists:
$mysqli->query("SELECT * FROM RegisteredUsersTable WHERE UserEmail = '$newUserEmail'");

现在我需要查看是否有任何内容从该搜索返回——这意味着电子邮件已经存在——如果是,我需要提醒用户,否则我可以继续使用以下方法将新信息插入数据库:

$mysqli->query("INSERT INTO RegisteredUsersTable (UserName, UserEmail) VALUES ('".$newUserName."', '".$newUserEmail."')");

有任何想法吗?

4

3 回答 3

6

考虑unique在这个特定的表上放置一个索引。以下代码将添加索引并删除所有当前重复项:

ALTER IGNORE TABLE `RegisteredUsersTable` ADD UNIQUE INDEX unique_email (`UserEmail`);

添加后,使用INSERT IGNOREor INSERT...ON DUPLICATE KEY UPDATE。如果没有重复,他们只会执行插入。

$mysqli->query("INSERT IGNORE INTO RegisteredUsersTable (UserName, UserEmail) VALUES ('".$newUserName."', '".$newUserEmail."')");

Mysql 会抛出错误,因为电子邮件已经在数据库中。但是,IGNORE 命令告诉脚本不要注意此查询的错误,因为在这种情况下,您希望它用于重复行。

此外,即使使用INSERT IGNORE. 使用 MYSQL LAST_INSERT_ID()。如果给出了 ID,则将其插入。如果没有,那么电子邮件已经存在(或有另一个错误)。

于 2013-08-02T03:25:15.947 回答
6

根据您的代码工作,这应该为您指明正确的方向。也许有更好的方法来构建您的数据库,从而更好地利用它。

<?php

$mysqli = new mysqli("localhost", "iodine", "iodine","iodine");

// Grab the values from the HTML form:
/*
$newUserName = $_POST['newUserName'];
$newUserName = $mysqli->real_escape_string($newUserName);
$newUserEmail = $_POST['newUserEmail'];
$newUserEmail = $mysqli->real_escape_string($newUserEmail);
*/
$newUserName = "Test User";
$newUserEmail = "test4@example.com";

// Now search the DB to see if a record with this email already exists:
echo "SELECT * FROM RegisteredUsersTable WHERE UserEmail = '$newUserEmail'", "\n";
$result = $mysqli->query("SELECT * FROM RegisteredUsersTable WHERE UserEmail = '$newUserEmail'");

if (!$result) {
  die($mysqli->error);
}
echo "num_rows = ".$result->num_rows."\n";
if ($result->num_rows > 0) {
   echo "Duplicate email\n";
   // do something to alert user about non-unique email
} else {
  $result = $mysqli->query("INSERT IGNORE INTO RegisteredUsersTable (UserName, UserEmail) VALUES ('".$newUserName."', '".$newUserEmail."')");
  if ($result === false) {echo "SQL error:".$mysqli->error;}
}

?>
于 2013-08-02T03:33:32.687 回答
0

至于您的第一个查询,为了减轻服务器上的负载,请改用 count() 。

$mysqli->query("SELECT count(*) FROM RegisteredUsersTable WHERE UserEmail = '$newUserEmail'");

这样,您只需检查您是否得到了大于 1 的结果。如果结果大于 1,则用户名存在(因为返回了一行)。

要检查返回的数据,您只需执行语句,然后获取结果。部分乐趣在于学习,所以这里是文档

于 2013-08-02T03:24:58.567 回答