php PDO fetchAll()-在不工作时,foreach工作

php PDO fetchAll()-在不工作时,foreach工作,php,pdo,foreach,while-loop,fetchall,Php,Pdo,Foreach,While Loop,Fetchall,我想知道我是否做得很好,或者fetchAll()在WHILE中不起作用 这里有一个例子 $db=new PDO("mysql:host=" .$dbhost. "; dbname=" . $dbname, $dbuser, $dbpass); $page=$db->prepare("SELECT * FROM page"); $page->execute(); foreach ($page->fetchAll(PDO::FETCH_ASSOC) as $row) { //

我想知道我是否做得很好,或者fetchAll()在WHILE中不起作用

这里有一个例子

$db=new PDO("mysql:host=" .$dbhost. "; dbname=" . $dbname, $dbuser, $dbpass);

$page=$db->prepare("SELECT * FROM page");
$page->execute();

foreach ($page->fetchAll(PDO::FETCH_ASSOC) as $row) {

//echo a row
//is working
}
然而,如果我尝试循环一段时间

while ($row=$page->fetchAll(PDO::FETCH_ASSOC)){

//echo a row
//Show empty
}

我试着只使用fetch(),它在工作,我的问题是:为什么fetchAll()不能与“WHILE”一起工作?

fetch all返回结果集中剩余的所有记录。记住这一点,您的foreach能够按预期迭代结果集

对于等效的while实现,应该使用
$page->fetch(PDO::fetch_ASSOC)

如果你想用一段时间把你能做的都拿来

$rows = $page->fetchAll(PDO::FETCH_ASSOC);

// use array_shift to free up the memory associated with the record as we deal with it
while($row = array_shift($rows)){
   // do something awesome with row
}

不过,有一点需要提醒:fetchall将完全做到这一点,如果结果大小很大,它将给您机器上的资源带来压力。我只会在知道结果集很小的情况下这样做,或者我通过对查询应用限制来强制执行此操作。

使用while循环中的
fetchAll
,您在第一次迭代中已获取了所有记录,下次没有任何内容可获取。在
foreach
中,您还获取了第一行中的所有记录,但是
foreach
将结果用于迭代。

来自PHP手册:

while语句的含义很简单。它告诉PHP重复执行嵌套语句,只要while表达式的计算结果为TRUE

由于返回一个数组,
而($row=$page->fetchAll(PDO::FETCH_ASSOC))
将把$row设置为整个结果集的数组。您所期望的是fetchAll方法能够扩展,但它没有扩展


foreach
foreach
是正确的方法。

无需循环遍历记录集,因为
fetchAll
-在一个命令中很好地获取all记录。很好,不是吗

$rows = $page->fetchAll(PDO::FETCH_ASSOC);

// $rows is an array containing all records...
foreach ($rows as $row)
    echo $row->fieldname;

我试图重现你的情况。看这里:

script.php 输出 输出意味着,虽然语句执行一次并打印所有行,但查询应该返回,这是绝对正确的,因为fetchAll返回一个包含所有行的数组数组。PHP将其解释为true,而while只运行一次


While
foreach
将迭代数组数组,每次都会有相应的行。

在While示例中,您可能应该使用fetch而不是fetchAll。在for中,应该在循环条件之前获取所有。fetchAll以数组或行数组的形式返回所有匹配的行。是的,fetch()正如我所说的那样工作,但我有一个很大的DB,我认为最好的方法是fetchAll(),所以在这种情况下唯一的解决方案是使用foreach()?@Maftisi I在通过fetchAll获取的结果集中发布了一个使用while的解决方案。@Maftisi您可以将
fetchAll
foreach
一起使用,或者将
fetchAll
的结果与Orangepill的解决方案中的
while
一起循环。While需要评估每次迭代的条件。对于已经习惯于编写While loop代码的人,或者他们的代码已经在使用While loop,并且他们希望将MySQL类升级到PDO,我建议使用此解决方案,因为您不需要更改您的编码样式。是
array_shift()
可以同时使用
while()
fetchAll()
。但为什么呢?
foreach()
fetchAll()
有什么问题?在这种情况下,
while()
foreach()
有什么好处?@stack唯一真正的好处是,通过数组移位,您可以潜在地将资源释放回服务器,所以我总是想知道这种小而聪明的点。真的谢谢+1(顺便说一句,我很担心PHP房间里的一个
if语句
;-)
,谢谢@michi一个问题,它在我的本地服务器上工作,但当我上传到主机时它不工作:(4年多前写的;-)本地机器和服务器上的不同设置,使用谷歌找出如何有系统地解决这个问题。我在SQL中用大写的表名重命名了小写字母works:pAwesome!简单有效的解决方案:)
$rows = $page->fetchAll(PDO::FETCH_ASSOC);

// $rows is an array containing all records...
foreach ($rows as $row)
    echo $row->fieldname;
<?php
$host = 'localhost';
$user = "user";
$password = '';
$db_name = 'test';
$port = 3306;

try
{
    $connection = new PDO("mysql:host=$host;port=$port;dbname=$db_name", $user, $password);
    $connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch (PDOException $e)
{
    echo 'Connection failed: ' . $e->getMessage();
}

$page=$connection->prepare("SELECT * FROM Document");
$page->execute();

while ($row = $page->fetchAll(PDO::FETCH_ASSOC)) {
    var_dump($row);
}
DROP TABLE IF EXISTS `Document`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `Document` (
  `DataID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `Description` varchar(50) CHARACTER SET utf8 NOT NULL,
  PRIMARY KEY (`DataID`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `Document`
--

LOCK TABLES `Document` WRITE;
/*!40000 ALTER TABLE `Document` DISABLE KEYS */;
INSERT INTO `Document` VALUES (1,'!!!'),(2,'This is document 2'),(3,'This is document 3'),(4,'This is document 4'),(5,'Hello');
/*!40000 ALTER TABLE `Document` ENABLE KEYS */;
UNLOCK TABLES;
$php script.php
array(5) {
  [0]=>
  array(2) {
    ["DataID"]=>
    string(1) "1"
    ["Description"]=>
    string(3) "!!!"
  }
  [1]=>
  array(2) {
    ["DataID"]=>
    string(1) "2"
    ["Description"]=>
    string(18) "This is document 2"
  }
  [2]=>
  array(2) {
    ["DataID"]=>
    string(1) "3"
    ["Description"]=>
    string(18) "This is document 3"
  }
  [3]=>
  array(2) {
    ["DataID"]=>
    string(1) "4"
    ["Description"]=>
    string(18) "This is document 4"
  }
  [4]=>
  array(2) {
    ["DataID"]=>
    string(1) "5"
    ["Description"]=>
    string(5) "Hello"
  }
}