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