如何检查数据库是否已经有数据或插入新数据

时间:2018-07-11 19:44:03

标签: php mysqli

我想要的是php检查客户端IP地址是否与数据库中的客户端IP地址相同(如果不存在),如果不插入新数据。 好吧,如果客户端尚未插入数据库中,则可以正常工作,但是如果客户端已经存在,则php会跳过更新并尝试将其再次插入数据库中。 我不知道这是怎么回事,也无法弄清楚。 这是我的代码:

<?php
$corruser = $_SESSION['user_name'];
$client_ip = $_SERVER['REMOTE_ADDR'];
require_once 'connections/dbc.php';
if (!$conn) {
  echo "Error connecting the database";
  exit();
} else{
  $GUI = "SELECT * FROM `customers` WHERE user_name='$corruser'";
  $GUI_response = mysqli_query($conn, $GUI);
  if (!$row = mysqli_fetch_assoc($GUI_response)) {
    echo "Error while query the database";
    exit();
  } else{
  $customer_id = $row['customer_id'];
  $check = "SELECT * FROM `users-ipdb` WHERE customer_id='$customer_id' AND user_name='$user_name' ";
  $check_response = mysqli_query($conn,$check);
  $check_result = mysqli_fetch_array($check_response, MYSQLI_NUM);
  if ($check_result[0] > 1) {
    $update_ip = "UPDATE `users-ipdb` SET `client_ip`='$client_ip' WHERE customer_id='$customer_id' AND user_name='$corruser' ";
    $update_ip_result = mysqli_query($conn, $update_ip);
    if (!$update_ip_result) {
      echo "ERROR UPDATING DATA BASE";
      exit();
    }
  } else{
  $insert_new = "INSERT INTO `users-ipdb`(`customer_id`, `user_name`,`client_ip`) VALUES ('$customer_id','$corruser','$client_ip')";
  $insert_new_result= mysqli_query($conn, $insert_new);
  if (!$insert_new_result) {
    echo "Error inserting new data in the database";
    exit();
  }
}

}
}
?>

2 个答案:

答案 0 :(得分:1)

我认为您对此代码有误:

  $check = "SELECT * FROM `users-ipdb` WHERE customer_id='$customer_id' AND user_name='$user_name' ";

$user_name变量不存在,应将其替换为$corruser

这就是为什么代码永远不会进入UPDATE的原因

答案 1 :(得分:0)

首先,请确保您的情况按预期工作。如果customer_id不是数字,则以下行:

if ($check_result[0] > 1) {

可能被评估为if(0 > 1),让您阅读:

Comparing String to Integer gives strange results

其他评论提到“ UPSERTS”,这里https://mariadb.com/kb/en/library/insert-on-duplicate-key-update/

进行了解释

基本想法是您可以做到

INSERT INTO `users-ipdb`(`customer_id`, `user_name`,`client_ip`) 
VALUES ('$customer_id','$corruser','$client_ip')" 
ON DUPLICATE KEY UPDATE client_ip='$client_ip';

,您将摆脱所有的php逻辑。为了使其正常工作,customer_iduser_name必须同时属于PRIMARY KEY的一部分。

如果需要查询多个表,则可以使用联接-如果使用ON DUPLICATE KEY UPDATE,则不需要它们,但还是要知道的一件好事-https://mariadb.com/kb/en/library/join-syntax/

最后但并非最不重要的-逃避任何可能来自其他来源的价值的好习惯。也许不是您的情况,但是有些人倾向于创建Joe';DROP TABLE mysql.user;SELECT '之类的用户名,这会破坏您的数据库,因为您的查询将变为

SELECT * FROM `users-ipdb` WHERE customer_id='$customer_id' AND user_name='Joe';DROP TABLE mysql.user;SELECT ''

所以要小心。