【问题标题】:Compare MySQL row against PHP array values将 MySQL 行与 PHP 数组值进行比较
【发布时间】:2012-12-18 19:22:19
【问题描述】:

我正在尝试将列表中的 IP 地址与阻止的 IP 列表进行比较。如果 IP 地址等于 $blockedIP 数组中的地址,则该行不包含在列表中。该列表由 mysqli_query 填充。如果 IP 地址与数组中的一个匹配,我想做的是排除整行。

echo '<div class="genericTable"><h2>Downloaded Sermons Report</h2><table>';

$blockedIP = array('69.58.178.58', '173.199.115.123', '173.199.120.99');

foreach($blockedIP as $ip){
$sql = mysqli_query($db, "SELECT * FROM dl_log WHERE ipaddress <> '".$ip."'");

while($row = mysqli_fetch_assoc($sql)){
    echo '<tr>';

    if($row['ipaddress'] !== $ip){
        foreach($row as $each){
            echo '<td class="genericTable">'.$each.'</td>';
        }
    }
    echo '</tr>';
  }
}
echo '</table></div>';

我已经用几种不同的方式尝试了该脚本,要么获取整个列表,要么将每一行和每一列与数组进行比较,这使得表格看起来很翘。我正在使用 foreach 将值与数组进行比较。我应该把它放在哪里? 谢谢。

【问题讨论】:

  • 你知道屏蔽IP是没有意义的吧? IP != 用户。一个 IP 可能有数百万人,一个人可以为每个请求使用一个新 IP。
  • 好吧,如果您想避免出现一行,只需在打印该行之前进行检查...
  • Dagon,我并没有阻止 IP 访问,只是阻止其出现在列表中。整个脚本分析已下载文件的用户的 IP、下载时间等。被阻止的 IP 似乎是搜索引擎机器人。我不想用不必要的数据使表格膨胀。

标签: php mysql arrays compare


【解决方案1】:

如果 IP 地址与数组中的一个匹配,我想做的是排除整行。

你有几个选择:

  1. 一个使用 SQL IN 的查询。用implode()压缩被屏蔽的IP地址。

    SELECT * FROM dl_log WHERE ipaddress NOT IN (...);
    
  2. 一次查询并使用 PHP in_array() 过滤他的结果

    // SQL
    SELECT * FROM dl_log;
    
    // PHP
    if (!in_array($row['ipaddress'], $blockedIP))
    

【讨论】:

  • 如果你想停止它的搜索引擎,使用 robots.txt 文件或用户代理分析。效率更高,bot ips 一直在变化
【解决方案2】:

如果您不想打印该行,请更改

if($row['ipaddress'] !== $ip){

if(!in_array($row['ipaddress'], $blockedIP)){

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多