我想使用PHP防止表单中的重复值进入数据库表。
我创建了以下内容:
包含名为客户:
的表格的数据库CREATE TABLE clients(
firstName varchar(20),
lastName varchar(20),
primary key(firstName, lastName));
一个名为 form.html
的简单表单<h2>Enter your First and Last Name</h2>
<form action="frm_script.php" method="post">
<p><strong>First Name:</strong><br /> <input type="text" name="firstName" /></p>
<p><strong>Last Name:</strong><br /> <input type="text" name="lastName"/></p>
<input type="submit" name="submit" value="Add Customer" />
</form>
名为 frm_script.php
的表单处理脚本<?php
if(isset($_POST['submit']))
{
//get the name and comment entered by user
$firstName = $_POST['firstName'];
$lastName = $_POST['lastName'];
//connect to the database
$dbc = mysqli_connect('host', 'username', 'password', 'dbname') or die('Error connecting to MySQL server');
//insert results from the form input
$query = "INSERT IGNORE INTO clients(firstName, lastName) VALUES('$firstName', '$lastName')";
$result = mysqli_query($dbc, $query) or die('Error querying database.');
mysqli_close($dbc);
}
echo "Customer Added";
?>
到目前为止,通过我的 frm_script.php 文件,以上工作方式和唯一记录显示客户已添加。但是,对于重复记录,它会抛出“错误查询数据库”。
如何为以下内容更新 frm_script.php 脚本?
如果在输入名字/姓氏组合时发现重复行,则应显示消息“客户已列出”以及该记录。
如果在表单上输入First / Last名称组合时没有找到重复行,则应将该条目插入数据库并显示消息“customer added”
我已经读过应该首先运行SELECT然后运行INSERT但是我不确定如何将它实现到我现有的代码中。
答案 0 :(得分:16)
<?php
if(isset($_POST['submit'])) {
//get the name and comment entered by user
$firstName = $_POST['firstName'];
$lastName = $_POST['lastName'];
//connect to the database
$dbc = mysqli_connect('host', 'username', 'password', 'dbname') or die('Error connecting to MySQL server');
$check=mysqli_query($dbc,"select * from clients where firstname='$firstname' and lastname='$lastname'");
$checkrows=mysqli_num_rows($check);
if($checkrows>0) {
echo "customer exists";
} else {
//insert results from the form input
$query = "INSERT IGNORE INTO clients(firstName, lastName) VALUES('$firstName', '$lastName')";
$result = mysqli_query($dbc, $query) or die('Error querying database.');
mysqli_close($dbc);
}
echo "Customer Added";
};
?>
只需在数据库中检查firstname和lastname中的行,如果存在echo,则返回其他消息 插入
答案 1 :(得分:2)
由于您的主键是(firstName,lastName),因此您不需要php来阻止插入重复值。 Mysql为您做到这一点,因为主键必须是唯一的。
(如果它不是你的主键,你可以使用一个独特的约束)
要在重复条目上显示错误消息“客户端已列出”,您可以使用mysqli_errno($dbc)
并检查错误代码1062
。
快速修复应该做你想做的事:用or die('Error querying database.');
or die(mysqli_errno($dbc) == 1062 ? "Client already listed" : 'Error querying database.');
答案 2 :(得分:0)
处理$_POST
数据后,使用SELECT
查询后跟if
语句检查表中是否有任何行,其名称和姓氏与$_POST
名字和姓氏数据。
如果有,则显示已插入此数据的消息。
如果没有,请使用INSERT
查询将此数据添加到数据库表中,并显示已将此数据添加到表中的消息。
答案 3 :(得分:0)
我一直有这个问题。我已经从使用自动递增的主要到大多数时候使用md5哈希。所以虽然我自己还没有实现这个 - 现在没有机会/需要 - 你可以创建一个主键(VARCHAR 32),它是名字和姓氏的md5哈希。像这样:
$key = md5(strtolower($firstName . $lastName));
使该列成为主键。然后使用INSERT IGNORE
,您可以忽略任何错误。
然后在$ key上运行SELECT
以返回与$key
相关的所有内容,并以友好的格式显示您对用户的任何信息。您不必在此时向用户显示错误,只需向他们提供已捕获的信息即可。如果您担心具有相同名称的用户看到彼此的数据,则可以对数据进行模糊处理。例如,您不是显示电话号码(333)444-5555,而是显示(333)444-5 * 5或(333)* * - 5555。为用户提供足够信息以确定是否是他们或其他具有相同名称的人。
我通常使用SELECT
,如果再次为空INSERT
和SELECT
,则使用方法。它有效但速度明显慢于简单INSERT IGNORE
然后SELECT
。我使用的是我在PDO之上构建的DAO,当单个列是主键时,INSERT IGNORE
可以正常工作。我没有尝试过基于超过1列的主键,也没有尝试使用mysqli_ *函数。