【问题标题】:Trouble displaying results correctly from FOREACH loop无法正确显示 FOREACH 循环的结果
【发布时间】:2014-08-07 04:04:33
【问题描述】:

我将我的代码切换到 PDO 并且我几乎到了,除了这部分,查询的所有结果都应该使用 foreach 语句显示。我知道数据被正确提取并正确存储在 $row2 中。

我需要做的是从 $results2 中获取 'position' 变量并将其加 1,然后运行位置等于该新数字的 foreach 循环...

在我切换到 PDO 之前,我的代码运行良好,并且确实正确显示了 2 个预期结果:

$cont = $results2[0]->position;;
$cont++;

foreach ($results2 as $resulting) {
if ( $results2[0]->position = $cont )
{
echo "<hr><br><br>" . $resulting->text . "&nbsp;" . "   <b>Suggested by: $resulting-
>display_name </b><br>|<b> <a href=\"$url\">Approve this contribution</a></b> | <b><a
href=\"$url\">delete this suggestion</a></b> |";
}
}

但是现在,foreach 在转换为 PDO 之后只返回了两次相同的第一个结果,看起来像这样:

//新的 PDO 代码——不显示两个结果:

$results2->execute();
$row2 = $results2->fetchAll(PDO::FETCH_ASSOC);

$cont = $row2[0]['position'];
$cont++;

foreach ($row2 as $resulting) {
if ( $row2[0]['position'] == $cont )
{
echo "<hr><br><br>" . $row2[0][text] . "&nbsp;" . "   <b>Suggested by:" . $row2[0]
[display_name] . "</b><br>|<b> <a href=\"$url\">Approve this contribution</a></b> | <b>
<a href=\"$url/?WID=$resulting->WID\">delete this suggestion</a></b> |";
}
}

【问题讨论】:

  • 不应该有两个等号用于比较而不是赋值吗?
  • 如果我将 = 更改为 == 我没有得到任何结果。但是,如果我将其保留为 =,那么我会得到第一个结果。
  • 您确实意识到 if 语句没有任何意义?您只是在分配值并返回true,因此会发生回声
  • 好吧,事实上,在我切换到 PDO 之前,我的代码运行良好。在我的帖子中查看我在 ADDiTIONAL 下的代码,以了解更改为 PDO 之前的工作情况。添加等号不知何故没有返回结果而不是正确的结果。
  • 我认为问题是在执行 PDO 时循环遍历 foreach 中定义的结果时我不能使用 $resulting?

标签: php mysql pdo


【解决方案1】:

看起来您的旧代码正在获取一个对象数组,而您的新代码正在获取一个数组数组(由PDO::FETCH_ASSOC 指示)。

因此,虽然 $results2[0]-&gt;position 过去可以工作,但您错误地将其替换为 $row2[0][position]。但是,position 需要在第二种情况下引用,因为它是一个数组索引。

如果您打开了所有错误报告,您会很容易看到这一点。

这同样适用于$row2[0][text]$row2[0][display_name]。除了这些索引上没有引号之外,您可能真的想要$resulting 而不是$row[0],因为$row[0] 每次循环都会为您提供相同的值。所以那些应该改成$resulting['text']$resulting['display_name']

所以用$row2[0]['position'] 替换$row2[0][position] 的所有实例。另外,请听从 John Ruddell 的建议。

【讨论】:

  • +1 nice catch patrick 我以为我已经看到位置设置为某个东西所以我认为它仍然是一个变量
  • 有点想通了...我想将 1 添加到 $row[position] (我在此之前的第一个查询)所以位置变为 2。我正在添加到 $row2[position]这是3.所以现在我需要foreach来获取$row2 [position] == cont的结果(但当我这样做时仍然只返回两个结果中的第一个)。至于[position] vs ['position '] 无论哪种方式都可以——也许是 wordpress 的东西?
  • 好吧,我听从了“位置”的建议并设置为 ==,这很奇怪:我得到了两个结果,但相同的记录只显示了两次/重复,而不是显示两个不同的结果记录。就好像它知道有两个结果,所以我尝试显示两个,但只显示第一个结果两次......
  • 那是因为您显示的是来自$row2[0] 的值,它们始终是相同的。您可能想要的是$resulting['text']$resulting['display_name'](请注意,您也对它们犯了同样的引用错误)。
  • @Patrick Q 就是这样!我知道这是我的 foreach 循环的问题。不知道我可以采用新定义的 $resulting 并执行 $resulting['text']。太好了,谢谢。仅供参考,引号是不必要的。双向工作。如果您作为答案发布,我可以接受
【解决方案2】:

注意:这不是一个答案...这只是我澄清我在 cmets 中所说的内容的一种方式,因为它很难在 cmets 中显示代码。

通用 IF 代码逻辑:

if (true){
    // code will always execute on true
}

if (false){
    // code will never execute on false
}

样本:

$key = "12345";
if($key){
    // will always be executed because this is a true statement. 
}

您的代码:

if ( $row2[0]['position'] = $cont ){
    // will always execute because the assignment is true
}

现在: 除了所有这些.. 如果您在使用 == 运行它时没有发生任何事情,这意味着计数不等于 $row[0][position],因此它是一个错误的语句,并且 if 中的代码不会被执行。

建议:

尝试在 if 语句之前添加 echo $cont;echo $row2[0]['position']; 以查看发生了什么。

【讨论】:

  • 哥奇亚。这是有道理的,但为什么它会在我上面看到的原始代码中完美运行?除了我不得不为 PDO 重写 foreach 部分之外,什么都没有改变......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-27
  • 2020-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
相关资源
最近更新 更多