使用MySQL的in_array()

时间:2017-05-16 07:54:27

标签: php mysql pdo

让我们说我想创建一个IP黑名单系统,如果他们的IP存在于数据库**中,它就会杀死该页面。

这是我目前所拥有的:

文件:index.php

get(K)

数据库:

#### Firewall ####
$data = $conn->query("SELECT * FROM firewall");

if (in_array($_SERVER['REMOTE_ADDR'], $data->fetchAll())) {
    die("Error!");
}
#### Firewall ####

问题是,它似乎根本不起作用。 任何帮助表示赞赏。

**:我使用 PDO 连接数据库

谢谢, CrAzYz_(Zypeth)

3 个答案:

答案 0 :(得分:0)

将其更改为:

#### Firewall ####
$data = $conn->query("SELECT `ip` FROM firewall");

if (in_array($_SERVER['REMOTE_ADDR'], $data->fetchAll(PDO::FETCH_COLUMN, 0))) {
    die("Error!");
}
#### Firewall ####

它使用FETCH_COLUMN,因此您只能获得单个列而不是数组。

答案 1 :(得分:0)

来自manual page

  

PDOStatement :: fetchAll()返回包含所有内容的数组   结果集中的剩余行。数组将每行表示为   列值数组或具有属性的对象   对应于每个列名。

这意味着$data->fetchAll()不是一维数组,而是记录数组(二维数组)或对象数组。 所以,你应该这样做:

// Collect IP addresses in a separate array first
$ips = [];
foreach($data->fetchAll() as $record){
     $ips[] = $record->ip; // or, $record['ip']
}

// Test the remote address against the 1-dimensional array
if (in_array($_SERVER['REMOTE_ADDR'], $ips)) {
   die("Error!");
}

要确定返回数据的格式,您可以执行以下操作:

print_r($data->fetchAll());

答案 2 :(得分:0)

js/main.js