Php 使用MySQL在_array()中
比方说,我想创建一个IP黑名单系统,如果数据库**中存在页面的IP,则该系统会杀死该页面 以下是我目前拥有的: 文件:index.phpPhp 使用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 #### 数据库: +
#### 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初始化为一个空数组。我写的是doprint\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!");
}