无法让PHP告诉MYSQL阻止用户

-1 php mysql connection installation

我为我的商店购买了一个游戏的脚本,在他们买了东西之后他们买不到任何东西一周.但我不能让这个脚本工作.有人可以向我解释如何设置MySql数据库来阻止用户?

<?php
// Purge records
mysql_query("DELETE FROM ip_table WHERE access_date < DATE_SUB(CURDATE(), INTERVAL 168 HOUR)");

$ip = $_SERVER['REMOTE_ADDR'];
$result = mysql_query("SELECT ip FROM ip_table WHERE ip = '$ip'");
if($result){
  die("TOS: You cannot access this for 1 Week, Security Measure");
} 
else {
  $result = mysql_query("INSERT INTO ip_table (ip, access_date) VALUES ('$ip', NOW())");
  echo "Thank you For your Purchase. you Have been Blocked For 1 Week due to a Security Measure.";
}
?>
Run Code Online (Sandbox Code Playgroud)

所有帮助表示赞赏.谢谢

Mic*_*ski 6

不要检查if ($result),因为它将返回有效的结果资源,即使它没有行.因此,它将始终进入die()块.

而是检查mysql_num_rows()是否从此查询返回了一行,除了测试FALSEin $result,这表示查询中有错误.

$result = mysql_query("SELECT ip FROM ip_table WHERE ip = '$ip'");
if($result && mysql_num_rows($result) > 0){
  die("TOS: You cannot access this for 1 Week, Security Measure");
} 
Run Code Online (Sandbox Code Playgroud)

注意:

虽然不应该从中发起SQL注入攻击$_SERVER['REMOTE_ADDRESS'],但$_SERVER仍然习惯于以任何方式转义值:

$ip = mysql_real_escape_string($_SERVER['REMOTE_ADDR']); 
Run Code Online (Sandbox Code Playgroud) 更新

如果你还没有弄清楚如何创建这个表,这里的语句是:

CREATE TABLE ip_table (
  ip VARCHAR(15) NOT NULL,
  access_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
Run Code Online (Sandbox Code Playgroud)

需要考虑的一个问题:如果多个用户位于NAT,公司或学校网络之后,则可以将您的Web服务器显示为来自相同的原始IP.如果可以,建议您向用户添加一些其他标识符.

基本的MySQL连接模式:

$conn = mysql_connect("localhost", "someusername", "thepassword");
if (!$conn) {
  // Error connecting.
}
else {
  mysql_select_db("yourDatabaseName");
}
// Now you can call mysql_query()...
Run Code Online (Sandbox Code Playgroud)