【问题标题】:how to output result outside while loop如何在while循环外输出结果
【发布时间】:2015-05-06 14:24:21
【问题描述】:

当我在 while 循环中回显输出时,它给了我我期望的所有结果。 然而,当我在外面回声时,我只得到一个。我知道如果我使用一个数组,它会给我我期望的结果,但不知道如何。 由于某些未知的原因,我不喜欢数组,并且一直在避免使用它们。

$sql="select concat(p.firstName,' ',p.lastName) as parents 
from parent p,
parentstudent ps,
student s
where p.parent_id = ps.parent_id
and s.student_id = ps.student_id
and p.parent_id IN ('".$_SESSION['list'][1]."','".$_SESSION['list'][2]."','".$_SESSION['list'][3]."','".$_SESSION['list'][4]."' )";

$result = $conn->query($sql);
if($result->num_rows > 0) {
while($row = $result->fetch_object()) {
        echo $participants = $row->parents."  ";
    }
}

【问题讨论】:

  • 避免数组?为什么?它们很有用
  • 在编程中避免使用数组?你确定吗?
  • 也许我需要一个比php.net更好的来源。
  • 希望您对函数没有任何反对意见 :-) 这就是说您的问题的答案很明显:$row 是您的 fesched 对象项在对其进行迭代时的值。在 while 循环之外,该值是循环迭代的最后一个值。
  • “出于某种未知原因” - 请问,这是什么原因?为什么要将输出累积到数组中?如果您只需要打印该值,请在循环内执行。

标签: php mysql while-loop prepared-statement


【解决方案1】:

使用数组选项非常简单——你首先需要在循环开始之前声明你的数组,像这样:

$arr = array();

我们这样做是为了确保$arr 保持在while 循环内外的范围内。然后在循环中,您将项目添加到数组中,如下所示:

$arr[] = $row->parents;

结合这个,我们得到我们的代码:

$arr = array();
$result = $conn->query($sql);
if($result->num_rows > 0) {
while($row = $result->fetch_object()) {
    $arr[] = $row->parents;
}

print_r($arr);

如果在构建数组后,您想重新访问每个元素/父值,您只需再次遍历数组,您可以这样做:

foreach($arr as $parent) {
    echo $parent . " ";
}

或者,您可以通过使用implode() 将数组的所有元素连接在一起,打印出您在循环中打印的相同字符串:

print implode(" ", $arr);

要创建绑定到父级的准备好的语句,我们还需要构建一个占位符数组 - 我们可以使用array_fill() 来完成此操作。 $arr 的每个元素都需要一个占位符,我们可以这样实现:

$placeholders = array_fill(0, count($arr), "?");

这表示从第一个(第 0 个)元素开始构建一个数组,其元素数量与 $arr 相同,并用问号填充它(pdo 占位符 - 我认为这是你想要使用的? )

然后我们可以像这样构建我们准备好的语句(假设 PDO):

$stmt = $pdo->prepare('select .... where X IN (' . implode(",", $placeholders) . ')');

这将构建一个类似于
select .... where X IN ( ?, ?, ?, ... ? ) 的语句。 不管你的数组中有多少占位符。

然后您可以执行该语句,并将其传递给 $arr 以填充这些占位符:

$stmt->execute($arr);

如果你改用mysqli,应该是类似的。

【讨论】:

  • 有时你只需要一个例子。谢谢!我想我也可以按如下方式分配值:$arr[0]; $arr[1]; $arr[2]; $arr[3]
  • 这就是你直接访问特定元素的方式,是的
  • 谢谢!我想将我的查询转换为准备好的语句以防止注入。我的 IN(values) 来自会话列表。我尝试将连接会话存储到 $variable 以用作 $stmt->bind_param("s", $variable);但无济于事。
【解决方案2】:

如果您根本不需要数组(为什么不呢?),那么只需创建一个字符串容器,

然后在循环下不断连接字符串,最后回显:

$participants = ''; // initialize
while($row = $result->fetch_object()) {
    $participants .= $row->parents . "  ";
               // ^ concat
}
echo $participants;

您当前代码中的问题是每个循环 $participants 都会被覆盖:

echo $participants = $row->parents."  ";
             //    ^ overwrites it every iteration

【讨论】:

    猜你喜欢
    • 2014-06-20
    • 2012-11-15
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    • 2018-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多