带有 PDO::FETCH_ASSOC 的 foreach 循环,提供的参数无效

Posted

技术标签:

【中文标题】带有 PDO::FETCH_ASSOC 的 foreach 循环,提供的参数无效【英文标题】:foreach loop with PDO::FETCH_ASSOC, Invalid argument supplied 【发布时间】:2015-08-27 14:01:51 【问题描述】:

我正在查询我的数据库,并想编写一个 foreach 循环,通过我的结果集,并在时间戳上运行 strtotime,以便在我的网页上使用它(我想调整数组 [ "posted"] 值到 strtotime(array["posted"])。

我是 php 和 PDO 的新手,不知道我的 foreach 循环出了什么问题。我得到的警告是 Warning: Invalid argument supplied for foreach() in /home/shooshte/Dropbox/PTC_php/db_queries/articles.php on line 29

我想我的目标 $result 数组错误?谁能解释如何解决这个问题?时间戳在名为posted 的列中,这也是我数组中的键。

感谢您的帮助。

我的 php:

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);

try 
    $hostname = "localhost";
    $username = "root";
    $password = "";

    $db = new PDO("mysql:host=$hostname;dbname=topdecka_PTC",$username, $password);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    if (!empty($_POST["searchword"])) 
        $searchword = $_POST["searchword"];
        $query = $db->prepare("SELECT title, posted, author_id, extract FROM articles WHERE title LIKE :searchword OR extract LIKE :searchword OR body LIKE :searchword");      
        $query->execute(array(":searchword" => "%" . $searchword . "%"));
        $result = $query->fetchAll();

        echo json_encode($result);
        die();
     
    else 
        $query = $db->prepare('SELECT posted FROM articles');
        $query->execute();

        $result = $query->fetchAll();

        foreach($result as $row) 
            $row['posted'] = strtotime($row['posted']);
        

        echo '<pre>';
        var_dump($result);
        echo '</pre>';

        //echo json_encode($result);
        die();
    
 
catch (PDOException $e) 
    echo "Error!: " . $e->getMessage() . "<br/>";
    die();

?>

这是var_dump

array(2) 
  [0]=>
  array(2) 
    ["posted"]=>
    string(19) "2015-06-10 11:16:46"
    [0]=>
    string(19) "2015-06-10 11:16:46"
  
  [1]=>
  array(2) 
    ["posted"]=>
    string(19) "2015-06-10 13:26:54"
    [0]=>
    string(19) "2015-06-10 13:26:54"
  

【问题讨论】:

var_dump($result); 显示什么? @honerlawd 将 var_dump 添加到帖子中 【参考方案1】:

警告发生在第 29 行(所以在 foreach($row['posted'] as $time))。原因是$row['posted']不是数组。

把循环改成这个

for($i = 0; $i < count($result); ++$i) 
  $result[$i]['posted'] = strtotime($result[$i]['posted']) * 1000;

【讨论】:

嘿,我试过 foreach($result as $row) $row['posted'] = strtotime($row['posted']); ,因为我想在编码和打印之前更改实际值,但没有任何反应(var_dump 仍然显示 ["posted"]=&gt; string(19) "2015-06-10 11:16:46" 哦,你想重置$row['posted']的值吗? 是的,我想将它设置为strtotime * 1000,所以我可以使用jQuery对其进行格式化=) 是的,成功了。非常感谢,现在我可以继续学习 JS =) @MihaŠušteršič 有趣的问题,但如果您在发布问题后立即发布您的意图以及您的问题的最终目标是什么,它会节省很多时间。 ;-)【参考方案2】:

我不能 100% 确定这是否会奏效,但我想当我遇到这个问题时我做了类似的事情。

$resultset = array();
   while ($row = $query->fetch())  $resultset[] = $row;   

   foreach($resultset as $result) 
        foreach($row["posted"] as $time) 
            $time = strtotime($time);
           
       

【讨论】:

以上是关于带有 PDO::FETCH_ASSOC 的 foreach 循环,提供的参数无效的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 与 PDO::FETCH_ASSOC 类似的方法是啥?

如何让 PDO::FETCH_ASSOC 将整数作为整数返回? [复制]

PHP Json 编码 PDO::FETCH_ASSOC

加入表时PDO fetch_assoc [重复]

PDO 中没有行时返回值

编写PDO DELETE查询值