循环时如何输出结果

时间:2015-05-06 14:24:21

标签: php mysql while-loop prepared-statement

当我在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."  ";
    }
}

2 个答案:

答案 0 :(得分:3)

使用数组选项非常简单 - 首先需要在循环开始之前声明数组,如下所示:

$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,它应该是类似的。

答案 1 :(得分:3)

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

然后

继续在循环下连接字符串,最后回显:

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

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

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