【问题标题】:Getting stuck in (php) foreach mysqli陷入(php)foreach mysqli
【发布时间】:2018-09-27 12:02:50
【问题描述】:

我正在尝试编写一个 php 页面来检查 $_GET['uuid'] 是否与数据库中的值匹配,以及当前访问者的 IP 地址是否与存储在数据库中的 $_GET['uuid'] 的 IP 地址匹配。

代码如下:

if(isset($_GET['uuid'])){
    $uuid = $_GET['uuid'];
    include('database.php');
    $sql = "SELECT * FROM `ips`"; 
    $sql2 =  "SELECT * FROM `ips` WHERE `uuid` =  '". $uuid ."'";
    foreach($mysqli->query($sql) as $row){
        $ipss = $row;
    }
    foreach($mysqli->query($sql2) as $ipsrrr){
        $ipsr = $ipsrrr;
    }
    if($ipss['uuid'] == $uuid && $ipsr['ip'] == $gip){
            $allowed = 1;
    }else{
        header('Location: index.php');
        exit(0);
    }
}else{
    header('Location: index.php');
    exit(0);
}

我不知道为什么,但我陷入了 foreach 循环。我得到一个带有加载图标的空白页面。

【问题讨论】:

  • 你不输出任何东西肯定会得到一个空白页
  • $gip 在那里未定义。以及在代码脚本顶部添加error_reporting(E_ALL);ini_set('display_errors',1); 以获取可能的错误。
  • 为什么要进行两次查询,一次获取 all IP 行,一次仅获取 uuid 匹配的行(其中似乎更明智)?!其次,您循环遍历结果并分配给$ipss$ipsr,但是您正在覆盖这些变量并且只有最后一行会粘在那里。这一切都没有多大意义。你应该只做 一个 查询WHERE uuid = $uuid AND ip = $gip,要么得到结果,要么没有。无需在 PHP 中循环任何内容或再次比较某些内容。
  • $gip 变量是什么?你曾经平等过吗?
  • 先抱歉,没有贴出完整代码

标签: php html mysqli foreach


【解决方案1】:

您不需要执行任何循环。正如@deceze 所说,您可以简单地查询 uuid 和 ip,如果有结果,则用户是“允许的”。小心 SQL 注入。

  if(!empty($_GET['uuid'])){

    // Evaluate IP and UUID.

    require_once 'database.php';

    if($mysqli->query("SELECT * FROM ips WHERE uuid = $uuid AND ip = $ip")){

      $allowed = 1;

    } else {

      header('Location: index.php');

    }

  } else {

    header('Location: index.php');

  }

尚未测试,但应该可以。

关于您的代码的一些事情:

  1. 如果包含它,您应该需要您的数据库文件。
  2. 您可以查看 PDO 和 Prepared Statements。

【讨论】:

【解决方案2】:

$mysqli->query($sql) 返回一个结果集。

尝试将每个 foreach 循环替换为(针对每个循环进行修改)

$resultSet = $mysqli->query($sql);
while($row = $resultSet->fetch_row())
{
    $ipss = $row;
}

这将检索结果集,然后对返回的每一行执行一个操作。

【讨论】:

    【解决方案3】:

    您的代码$mysqli->query($sql) 返回一个对象,而不是一个可迭代数组。要获取字段数组,您需要使用方法fetch_all(MYSQLI_ASSOC)。看下面的例子:

        <?php
     $host = "localhost";
     $mysql = mysqli_connect($host, "root", "", "database");
     $result = $mysql->query("SELECT * FROM table");
     $result = $result->fetch_all(MYSQLI_ASSOC);
     //parameter `MYSQLI_ASSOC` means to return associated array, 
     //(without it you will get a numeric keys for array)
     //$result[0] contains your array.
     //Now you can manipulate data:
     foreach ($result[0] as $field) {
         $get_data = $field['some_col_name'];
     }
     ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-12
      • 1970-01-01
      • 1970-01-01
      • 2013-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多