我想要的是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();
}
}
}
}
?>
答案 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_id
和user_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 ''
所以要小心。