大家好,我正在努力防止将重复记录注入我的数据库,我使用以下代码来阻止数据:
$con=mysqli_connect("localhost","root","","dbPos");
$first=trim($_POST['first']);
$last=trim($_POST['last']);
$emailaddress=trim($_POST['emailaddress']);
$queryF = "SELECT firstname FROM tbData WHERE firstname=='$first'";
$queryL = "SELECT lastname FROM tbData WHERE lastname=='$last";
$queryE = "SELECT emailaddress FROM tbData WHERE emailaddress=='$emailaddress'";
$resultF = mysqli_query($queryF);
$resultL = mysqli_query($queryL);
$resultE = mysqli_query($queryE);
if(mysqli_num_rows($con,$resultF) > 0 && mysqli_num_rows($con,$resultL) > 0 && mysqli_num_rows($con,$resultE) > 0)
{
header("Location: https://www.youtube.com"); //Just to check if it ignores the input.
}else{
mysqli_query($con,"INSERT INTO tbData VALUES (
'$first',
'$last',
'$emailaddress')");
header("Location: HOME.php");}
mysqli_close($con);
所以我需要它来检查第一个,最后一个名字和电子邮件地址,如果它在数据库上有重复,那么它会转到它注入数据的代码部分。不幸的是,我检查是否有重复的代码块返回'0',所以继续注入代码。
*基本上,如果应用程序具有相同的名字,姓氏和电子邮件地址,应该忽略输入的数据。
任何帮助都将受到高度赞赏!
答案 0 :(得分:0)
您不应该进行3次单独的查询,因为找到的值可能位于不同的行中。如果有人输入John Jones
,您会匹配John Smith
和Fred Jones
,因此如果没有,则会认为存在重复。
您应该对所有3列进行单一查询:
SELECT 1 FROM tbData
WHERE firstname = '$first' AND lastname = '$last' AND emailaddress = '$emailaddress'
如评论中所述,您还应该学习如何使用准备好的查询,或者至少使用mysqli_real_escape_string()
来清理用户输入。
您还在调用mysqli_num_rows()
错误。它应该只是:
mysqli_num_rows($result)
没有$con
参数。
答案 1 :(得分:0)
以下代码使用以下逻辑:
$resultFLE = mysqli_query($con,"SELECT * FROM tbData WHERE firstname='$first' AND lastname='$last' AND emailaddress='$emailaddress'");
$countFLE = mysqli_num_rows($resultFLE);
if($countFLE != null ){
header("Location: HOME.php");
}else{
mysqli_query($con,"INSERT INTO tbData VALUES (
...
header("Location: HOME.php");
}
我试图简化事情,再想一想;尝试首先通过将受影响的行与输入的数据进行逐一比较来查找受影响的行,只计算它是否会到达我的计数器,然后根据结果将页面路由到我想要的任何位置。