【问题标题】:php - Warning: Illegal string offset but vardump shows correct string offset [duplicate]php - 警告:非法字符串偏移,但 vardump 显示正确的字符串偏移 [重复]
【发布时间】:2014-11-27 13:45:27
【问题描述】:

在 MySQL 数据库上完成 SELECT 查询并将 fetchAssoc() 方法应用于结果后,我在尝试访问 foreach 循环中的结果时收到警告。代码如下:

$query=$subquery->execute()->fetchAssoc();

foreach($query as $result) {
  if ($result['active'] == 'Y'){  // (this is line 703)
    $page_id = $result['page_id'];  // (this is line 704)
    if (!$package_pages[$page_id] || $package_pages[$page_id] != $page_id) { // line 705
      $pages[] = $page_id;
    }
  }

我插入了 var_dump($query) 来检查查询结果。以下是输出示例:

array (size=3)
'page_name' => string 'Apts & Rentals' (length=14)
'page_id' => string '49' (length=2)
'active' => string 'Y' (length=1)

array (size=3)
'page_name' => string 'Homepage' (length=8)
'page_id' => string '1' (length=1)
'active' => string 'Y' (length=1)

var_dump($query) 有 25 个数组输出

以下是警告示例:

Warning: Illegal string offset 'active' in ads_load() (line 703 of ...
Warning: Illegal string offset 'page_id' in ads_load() (line 704 of ...
Notice: Undefined index: Y in ads_load() (line 705 of ...

为什么偏移量是“活动的”,而“page_id”被标记为非法?

“注意:未定义的索引:Y”是从哪里来的,因为它没有被用作第 705 行的索引?

我不相信这是Illegal String Offset within PDO For Each loop 的重复。当我意识到上面给出的代码被放置在另一个循环中时,这个问题得到了解决,这给人的印象是我每次都在处理一个数组而不是单个数组。

【问题讨论】:

  • 你需要用isset检查它们是否存在
  • fetchAssoc() 从结果中返回单行数据。你在那个数组上循环并试图访问它的元素,就好像它们本身就是一个数组一样。这意味着$result 是一个字符串。第一次是Apts & rentals,下次是49,然后是Y

标签: php mysql


【解决方案1】:

您错误地访问它们 - 您有一个关联数组,并且您试图循环遍历它,就好像它是一个关联数组的数组一样。这是您转储的数据结构:

$query = array(
'page_name' => 'Homepage',
'page_id' => '1',
'active' => 'Y' );

您可以直接从$query获取结果,即:

$query=$subquery->execute()->fetchAssoc();

if ($query['active'] == 'Y')
    $page_id = $query['page_id'];
    // ... the rest of your code ...
}

您可以遍历 $query 的键和值,但由于您对 $query 数组中的特定值感兴趣,因此没有多大意义。

【讨论】:

  • var_dump($query) 输出 25 个数组。我在原始帖子中只展示了 2 个示例。那不是关联数组的数组吗?
  • 是的,您展示的示例数组是一个关联数组,但您将其视为一个 关联数组的数组。你看出区别了吗?
  • 好的,我现在明白了。让我感到困惑的是,显示的代码嵌入在另一个循环中。结果 var_dump 显示了 25 次迭代的结果。我的错。感谢您的快速回复。
猜你喜欢
  • 2013-04-11
  • 2012-04-09
  • 1970-01-01
  • 1970-01-01
  • 2017-09-05
  • 1970-01-01
  • 2013-11-07
相关资源
最近更新 更多