使用PHP防止表中的重复记录
我想防止使用PHP将值从表单复制到数据库表中 我创建了以下内容: 具有名为“客户端”的表的数据库:使用PHP防止表中的重复记录,php,mysql,Php,Mysql,我想防止使用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_sc
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";
?>
处理完$\u POST
数据后,使用选择
查询,然后使用if
语句检查表中是否有与$\u POST
名字和姓氏数据相同的行
如果有,则显示一条消息,说明此数据已插入
如果没有,请使用INSERT
查询将此数据添加到数据库表中,并显示一条消息,说明此数据已添加到表中。我一直有此问题。我大部分时间都是从使用自动递增的主哈希表改为使用md5哈希表。所以,虽然我自己还没有实现这一点-目前没有机会/需要-您可以创建一个主键(VARCHAR 32),它是名和姓的md5散列。像这样:
$key = md5(strtolower($firstName . $lastName));
使该列成为te主键。然后使用插入忽略,可以忽略任何错误
然后在$key上运行选择
,返回与$key
相关的所有信息,并以友好的格式显示用户的所有信息。您不必在此时向用户显示错误,只需向他们提供已捕获的信息即可。如果您担心同名用户看到彼此的数据,那么这些数据可能会被混淆。例如,不显示电话号码(333)444-5555,而是显示(333)444-5*5或(333)**-5555。给用户足够的信息来知道是他们还是其他同名的人
通常我使用了SELECT
,如果INSERT
为空,则再次使用SELECT
方法。它可以工作,但比简单的插入忽略然后选择要慢得多。我使用在PDO之上构建的DAO,当一列是主键时,INSERT IGNORE
可以很好地工作。我没有在基于多个列的主键上尝试过,也没有在mysqli_*函数上尝试过。
<?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-yourmessage-else
插入因为主键是(firstName,lastName),所以不需要php来防止重复值的插入。Mysql为您做到了这一点,因为主键必须是唯一的
(如果不是主键,则可以使用唯一约束)
要在重复条目上显示错误消息“Client ready listed”,可以使用mysqli\u errno($dbc)
并检查错误代码1062
快速修复程序,可以执行您想要的操作:替换或死亡('Error querying database')代码>带有
或die(mysqli_errno($dbc)==1062?“已列出客户端”:“查询数据库时出错”)代码>用die(mysqli_Error($dbc))替换die('Error query database'))
代码>firstName=”;删除表客户端--代码>。再见,客户们。嗨,艾玛,我喜欢你们的解决方案。查看重复条目的一个简单方法是插入记录时出现问题。哇,gabe,谢谢你的全面回答。这确实给了我一些努力的方向。感谢您的回复,我将尝试一下;-)@安第尔:没问题。当我写这篇文章的时候,我并不认为我需要它,但我现在正处于其中。例如,我正在捕获所有AdWords活动及其状态(暂停、活动等)。通常我会将所有活动放在一个表中,状态放在另一个表中,然后创建链接表-camp2stat。但是,状态会随着时间的推移而改变,我希望在状态改变时进行存储。因此,我现在有一个链接表,其中包含日期,而不仅仅是活动ID和状态ID。但是,我不想在每天的状态发生变化时存储它们……嗨,goddfree,我只是使用上面Sai的回复来存储的。尽管如此,仍然会出现错误-第一个:mysqli_query()需要至少2个参数,第二个:mysqli_num_rows()需要参数1为mysqli_result,null。我不知道这些到底是什么意思-有什么想法吗?谢谢;-)mysqli_query()需要至少两个参数
此错误表示您尚未传递连接或未建立到数据库的连接mysqli_num_rows()要求参数1为mysqli_result,null
表示查询工作不正常。首先在数据库中测试您的查询,然后将其作为良好实践在php中使用警告:这个答案对所有人都是开放的,应该使用参数化的预处理语句,而不是手动构建查询。它们由或提供。永远不要相信任何形式的输入!即使您的查询仅由受信任的用户执行。