我是一名Java开发人员,他只是接受了“一些快速简单的DB内容”的任务 - 除了我对PHP / MySQL不太了解...我需要在数据库中插入一条记录 - 但只是如果电子邮件字段与DB中已存在的电子邮件字段不匹配。以下是我为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."')");
有什么想法吗?
答案 0 :(得分:6)
考虑在此特定表上放置unique
索引。以下代码将添加索引并删除任何当前重复项:
ALTER IGNORE TABLE `RegisteredUsersTable` ADD UNIQUE INDEX unique_email (`UserEmail`);
添加此内容后,请使用INSERT IGNORE
或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,则将其插入。如果没有,那么电子邮件已经存在(或者还有其他错误)。
答案 1 :(得分: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;}
}
?>
答案 2 :(得分:0)
至于您的第一个查询,要软化服务器上的负载,请改用count()。
$mysqli->query("SELECT count(*) FROM RegisteredUsersTable WHERE UserEmail = '$newUserEmail'");
这样,你可以检查你是否得到高于1的结果。如果结果大于1,则存在用户名(因为返回了一行)。
要检查返回的数据,您只需执行该语句,然后获取结果。部分乐趣在于学习,所以这里是documentation