【问题标题】:SQL result array, from PDO query, has duplicated values [duplicate]来自 PDO 查询的 SQL 结果数组具有重复值 [重复]
【发布时间】:2020-09-09 08:28:22
【问题描述】:

我有一个 mysql 表,其中包含以下字段

STUDENTID  |  FIRSTNAME |  SURNAME  |  DOB   |  SCHOOLID

表单用于用户搜索学生并输出所有匹配的名字和姓氏

以下 SQL 语句返回 PDO 罚款


$sqlstmnt2 = 'SELECT * FROM students WHERE firstName = :fname AND surname = :sname AND schoolID = :schoolID';

// prepare PDOstatement as $query ...
// ...

$query->execute();
$_SESSION['foundPupils'] = $query->fetchAll();

但是,当我将它传递到会话变量中的另一个 PHP 页面时,我对如何单独访问每个字段感到困惑。我有以下代码

foreach($_SESSION['foundPupils'][0] as $found){
    echo($found);
}

这会输出找到的数据,但问题是它会输出两次,而且它只是一长串数据,无法很好地格式化。我的问题是:

为什么每个结果输出两次? 如何访问此数组中的各个字段(例如,类似于 foundPupils[0]['firstName']?

【问题讨论】:

  • 您没有包含相关的代码。你在哪里以及如何设置$_SESSION?根据您的获取模式,默认值将返回一个混合数组,其中包含数字键和索引键,两者都包含对应的列值。
  • 你能告诉我们var_export($_SESSION['foundPupils'][0])的输出吗?

标签: php mysql pdo


【解决方案1】:

根据文档,PDOStatement::fetchPDOStatement::fetchAll 方法都接受 $fetch_style 参数。如果未设置,则默认值为PDO::FETCH_BOTH。这意味着获取的数组将按位置(例如 0、1、2)和列名(例如 "firstName""surname")引用字段。

所以默认情况下,您获取的结果将是这样的:

Array
(
    [0] => Array
        (
            [name] => apple
            [0] => apple
            [colour] => red
            [1] => red
        )

    [1] => Array
        (
            [name] => pear
            [0] => pear
            [colour] => green
            [1] => green
        )

    [2] => Array
        (
            [name] => watermelon
            [0] => watermelon
            [colour] => pink
            [1] => pink
        )

)

要解决这个问题,您需要调用您的 fetch 函数(我想它是 PDOStatement::fetchAll),并使用 PDO::FETCH_COLUMN 作为 fetch 样式:

$query->execute();
$_SESSION['foundPupils'] = $query->fetchAll(PDO::FETCH_COLUMN);

【讨论】:

    【解决方案2】:

    查询结果被返回并存储在一个结果对象中。因此,您必须使用 xxxx_fetch_array 或 xxxx_fetch_row 遍历结果。例如

    $sql='SELECT * FROM table_name';
    $result = mysqli_query($conn,$sql);
    while($row=mysqli_fetch_array($result)){
        echo $row['COLUMN_NAME'].'<br />';
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-28
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 2011-01-19
      • 1970-01-01
      相关资源
      最近更新 更多