当前位置: 首页 > 面试题库 >

PHP PDO与foreach和fetch

厍华清
2023-03-14
问题内容

如下代码:

<?php
try {
    $dbh = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password);
    echo "Connection is successful!<br/>";
    $sql = "SELECT * FROM users";
    $users = $dbh->query($sql);
    foreach ($users as $row) {
        print $row["name"] . "-" . $row["sex"] ."<br/>";
    }
    foreach ($users as $row) {
        print $row["name"] . "-" . $row["sex"] ."<br/>";
    }
    $dbh = null;
}
catch (PDOexception $e) {
    echo "Error is: " . $e-> etmessage();
}

输出:

Connection is successful!

person A-male
person B-female

两次运行“ foreach”不是我的目的,我很好奇为什么两个“ foreach”语句仅输出一次结果?

以下是类似情况:

<?php
try {
    $dbh = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password);
    echo "Connection is successful!<br/>";
    $sql = "SELECT * FROM users";
    $users = $dbh->query($sql);
    foreach ($users as $row) {
        print $row["name"] . "-" . $row["sex"] ."<br/>";
    }
    echo "<br/>";
    $result = $users->fetch(PDO::FETCH_ASSOC);
    foreach($result as $key => $value) {
        echo $key . "-" . $value . "<br/>";
    }
    $dbh = null;
}
catch (PDOexception $e) {
    echo "Error is: " . $e-> etmessage();
}

输出:

Connection is successful!

person A-male
person B-female

SCREAM: Error suppression ignored for
Warning: Invalid argument supplied for foreach()

但是,当我从上述代码中删除第一个“ foreach”时,输出将变为正常:

<?php
try {
    $dbh = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password);
    echo "Connection is successful!<br/>";
    $sql = "SELECT * FROM users";
    $users = $dbh->query($sql);

    echo "<br/>";
    $result = $users->fetch(PDO::FETCH_ASSOC);
    foreach($result as $key => $value) {
        echo $key . "-" . $value . "<br/>";
    }
    $dbh = null;
}
catch (PDOexception $e) {
    echo "Error is: " . $e-> etmessage();
}

输出:

Connection is successful!

user_id-0000000001
name-person A
sex-male

为什么会这样?


问题答案:

一个PDOStatement(你有$users)是向前光标。这意味着,一旦消耗(第一次foreach迭代),就不会后退到结果集的开头。

您可以在之后关闭光标,foreach然后再次执行该语句:

$users       = $dbh->query($sql);
foreach ($users as $row) {
    print $row["name"] . "-" . $row["sex"] ."<br/>";
}

$users->execute();

foreach ($users as $row) {
    print $row["name"] . "-" . $row["sex"] ."<br/>";
}

或者您可以使用量身定制CachingIterator的Fullcache进行缓存:

$users       = $dbh->query($sql);

$usersCached = new CachedPDOStatement($users);

foreach ($usersCached as $row) {
    print $row["name"] . "-" . $row["sex"] ."<br/>";
}
foreach ($usersCached as $row) {
    print $row["name"] . "-" . $row["sex"] ."<br/>";
}

您会发现本CachedPDOStatement课程的要点。缓存迭代器可能比将结果集存储到数组中更为理智,因为它仍提供PDOStatement已包装对象的所有属性和方法。



 类似资料:
  • 问题内容: 有没有一种方法可以在Java 8中构建使用索引迭代的方法?理想情况下,我想要这样的东西: 我现在能做的最好的事情是: 问题答案: 由于您要遍历可索引的集合(列表等),因此我假设您可以仅遍历元素的索引: 生成的代码类似于使用经典i ++样式的for循环迭代列表,但具有更易于并行化的特性(当然,假设并发对params的只读访问是安全的)。

  • 问题内容: 我有一个类似结构的数组,它公开了异步方法。异步方法调用返回数组结构,从而返回更多异步方法。我正在创建另一个JSON对象来存储从该结构获得的值,因此我需要注意跟踪回调中的引用。 我已经编写了一个蛮力解决方案,但是我想学习一个更惯用或干净的解决方案。 对于n级嵌套,该模式应该是可重复的。 我需要使用promise.all或一些类似的技术来确定何时解析封闭例程。 并非每个元素都必然涉及进行异

  • 我有一个类似数组的结构,它公开异步方法。async方法调用返回数组结构,这些结构反过来公开更多的异步方法。我正在创建另一个JSON对象来存储从这个结构中获得的值,因此我需要小心跟踪回调中的引用。 我已经编写了一个暴力解决方案,但我想学习一个更惯用或干净的解决方案。 该模式应可重复n个嵌套级别 这是部分代码-

  • 问题内容: 我有一个嵌套的数组,我想在其中显示结果的子集。例如,在下面的数组中,我想遍历嵌套array [1]中的所有值。 我试图使用foreach函数,但似乎无法正常工作。这是我的原始语法(尽管我意识到这是错误的)。 我试图避免对键是否与我要搜索的键相同的变量进行比较,即 有任何想法吗? 问题答案: 如果您知道嵌套数组中的级别数,则可以简单地执行嵌套循环。像这样: 如果您不知道数组的深度,则需要

  • 产出: 请提供2个方法将产生不同输出的例子。

  • 问题内容: 如果您有一个Array,并且想使用Java8 forEach()方法,那么哪种方法更好或更有效: 要么 差异是否显着,或者有更好的解决方案来解决? 问题答案: 都不行 如果您已经有一个数组, 我会用: 因为您将数组到流的转换留给了JDK-让它负责效率等。 但是,由于您没有数组,因此我将使用的varargs创建值的流: 这又让JDK负责有效地按需传输值。