如何在使用php插入之前检查数据库中是否存在记录


how to check if a record exist in a database before inserting with php

我正在创建一个表单,该表单使用php收集数据并发送到数据库,其中包含我在网上获得的代码片段。

$con=mysqli_connect("localhost","root","famakin","k");
if(mysqli_connect_errno())
{
   echo"FailedtoconnecttoMySQL:".mysqli_connect_error();
}
$sql="INSERT INTO transactions(Username,Insured_Name,combined,Residential_Address,Telephone,Email,Make_Of_Car,Model,Engine_Number,Year_Of_Manufacture,Chassis_Number,Vehicle_Class,Colour,Registeration_Number,Product_Type,Premium,Policy_Number,Start_Date,Expiry_Date,Date_Begin,Type_Of_Insurance,Status,  Transaction_id)VALUES('$_POST[Username]','$_POST[Insured_Name]','$_POST[combined]','$_POST[Residential_Address]','$_POST[Telephone]','$_POST[Email]','$_POST[Make_Of_Car]','$_POST[Model]','$_POST[Engine_Number]','$_POST[Year_Of_Manufacture]','$_POST[Chassis_Number]','$_POST[Vehicle_Class]','$_POST[Colour]','$_POST[Registeration_Number]','$_POST[Product_Type]','$_POST[Premium]','$_POST[Policy_Number]','$_POST[Date]','$_POST[Date_Expiry]','$_POST[Date_Begin]','$_POST[Type_Of_Insurance]','$_POST[Status]','$_POST[Transaction_id]')";
if(!mysqli_query($con,$sql))
{
   die('Error:'.mysqli_error($con));
}
mysqli_close($con);

这适用于将详细信息插入数据库,但我想检查(例如)我插入数据库的用户名是否存在,请我如何使用我现有的用户名?

关于

主要有两种方法,本质上。。。

  1. CCD_ 1,然后再尝试CCD_。如果SELECT找到了记录,则不执行INSERT,而是相应地响应用户
  2. 在表中需要唯一的列(或列集)上放置UNIQUE约束。这将导致INSERT失败,代码必须捕获并处理该失败并相应地响应用户

第二种选择将责任完全放在数据库本身上,如果要使用该数据库并需要维护同样的责任,那么这一点非常重要。

此外,,这一点很重要,请注意,您的代码容易受到SQL注入攻击,这允许用户在您的服务器上执行自己的代码。您需要了解这些信息,以便保护您的应用程序。

在这里,您可以通过mysqli_num_rows():

$username = mysqli_real_escape_string($con, $_POST['Username']);
$check_select = mysqli_query("SELECT * FROM `transactions` WHERE Username = '$username'"); 
$numrows=mysqli_num_rows($check_select);
if($numrows > 0){
// do something
}
else{
// do something else
}

尽管还有其他方法可以做到这一点,但这只是一个例子。

您也可以通过将列设置为UNIQUE来避免这种情况。


  • 顺便说一下,您当前的代码对SQL注入是开放的
    使用准备好的语句,或将PDO与准备好的声明一起使用它们更安全

只需在INSERT之前执行SELECT查询。如果存在具有该用户名的记录,则不要插入该记录。

在插入之前,您需要查询它的存在(请参阅谷歌关于如何"从数据库PHP中选择数据")。

如果select count(*) from Transactions.... where Username =..返回的不是0,则用户名已被占用。

注意:我更担心的是,您将SELECT0-参数直接包含在SQL查询字符串中,并建议您阅读一些关于"SQL注入PHP"的内容。