Php 使用MySQL在_array()中

Php 使用MySQL在_array()中,php,mysql,pdo,Php,Mysql,Pdo,比方说,我想创建一个IP黑名单系统,如果数据库**中存在页面的IP,则该系统会杀死该页面 以下是我目前拥有的: 文件:index.php #### Firewall #### $data = $conn->query("SELECT * FROM firewall"); if (in_array($_SERVER['REMOTE_ADDR'], $data->fetchAll())) { die("Error!"); } #### Firewall #### 数据库: +

比方说,我想创建一个IP黑名单系统,如果数据库**中存在页面的IP,则该系统会杀死该页面

以下是我目前拥有的:

文件:index.php

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

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

+----+-----------+------------+
| id | ip        | date       |
+----+-----------+------------+
|  1 | 127.0.0.1 | 2017-05-16 |
+----+-----------+------------+
1 row in set (0.00 sec)
问题是,它似乎根本不起作用。 感谢您的帮助

**:我正在使用PDO连接到数据库

谢谢, CrAzYz_uz(Zypeth)

将其更改为:

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

if (in_array($_SERVER['REMOTE_ADDR'], $data->fetchAll(PDO::FETCH_COLUMN, 0))) {
    die("Error!");
}
#### Firewall ####
它使用,因此您只能得到一个列而不是一个数组作为结果。

来自:

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());

请查看
$data->fetchAll()
的内容,并了解
的位置
clause@u_mulder它和我展示的一样,名为“数据库:”。既然你问了,我还是会给你看的<代码>数组([0]=>数组([id]=>1[0]=>1[ip]=>127.0.0.1[1]=>127.0.0.1[date]=>2017-05-16[2]=>2017-05-16))在这种情况下,从数据库请求所有记录绝对是无稽之谈。编写一个查询,选择具有远程IP的记录,然后检查您获得了多少条结果记录。我将从
防火墙
中选择
IP
,其中
IP
='IPADDRESS'LIMIT 1$data->fetchAll(PDO::FETCH_列,1);?我改为专门检索IP的代码,这个输出是什么?不起作用。我做了一个
print\r($ips)
就在
foreach($data->fetchAll()as$record){}
之前,我得到的只是
Array()
很明显:您刚刚将$ips初始化为一个空数组。我写的是do
print\r($data->fetchAll()),而不是$ips。如果不起作用,您可能希望将结果分配给print_r()之前的变量,例如
$records=$data->fetchAll();打印(记录)成功了,谢谢!
$block = $conn->prepare("SELECT `ip` FROM `firewall` WHERE `ip` = :ip");
$block->bindParam(':ip', $_SERVER['REMOTE_ADDR']);
$block->execute();
$block = $block->fetchAll(PDO::FETCH_ASSOC);
if (!empty($block)) {
    die("Error!");
}