我很困惑为什么第一个0结果没有被迭代。有人可以解释原因并告诉我需要做些什么来显示[0]的结果吗?
Here is my Array:
array(3) { [0]=> string(3) "390" [1]=> string(3) "377" [2]=> string(3) "382" }
注意如何通过foreach显示[0]结果。最后两个[1]和[2]显示正常。
您可以在此处查看此结果: http://www.rotaryswing.com/swingviewer/videos.php
<?php
//iterate through video IDS in our DB
foreach ($pieces as $key => $v) {
$sql ="SELECT id, video_name, link, phase FROM videos WHERE id=?";
if ($stmt = $mysqli->prepare($sql)) {
$stmt->bind_param("i", $v);
if ($stmt->execute()) {
$stmt->bind_result($id, $vid_name, $vid_link, $phase);
while ($stmt->fetch()) {
echo "<a style=\"font-size: 14px;\" href='http://www.rotaryswing.com/golf- instruction/video/rst-index.php?cat=$phase&subcat=Rotary%20Swing%20Tour&video=$id&id=$vid_link&name=$vid_name' target=\"blank\">$vid_name</a><br>";
}
}
else {
trigger_error("SQL query failed: " . $stmt->error, E_USER_ERROR);
}
}
}
?>
当我回复这些碎片时,它回复得很好。
<?php echo $pieces[0] . "<br/>";?>
<?php echo $pieces[1] . "<br/>";?>
<?php echo $pieces[2] . "<br/>";?>
答案 0 :(得分:1)
您可以在阵列中使用WHERE IN
:
# create the correct amount of ?
$placeholder = implode(', ', array_fill(0, count($pieces), '?'));
$sql ="SELECT id, video_name, link, phase FROM videos WHERE id IN ({$placeholder})";
if ($stmt = $mysqli->prepare($sql))
{
# add at the begin the type of your array the field types
array_unshift($pieces, implode('', array_fill(0, count($pieces), 'i')));
# bind the field type and each value
call_user_func_array(array($stmt, 'bind_param'), $pieces);
if ($stmt->execute())
{
$stmt->bind_result($id, $vid_name, $vid_link, $phase);
while ($stmt->fetch())
{
?>
<a style="font-size: 14px;" href="http://www.rotaryswing.com/golf-instruction/video/rst-index.php?cat=<?php echo $phase; ?>&subcat=Rotary%20Swing%20Tour&video=<?php echo $id; ?>&id=<?php echo $vid_link; ?>&name=<?php echo $vid_name; ?>" target="blank"><?php echo $vid_name; ?></a><br>
<?php
}
}
else
{
trigger_error("SQL query failed: " . $stmt->error, E_USER_ERROR);
}
}
使用 call_user_func_array(array($stmt, 'bind_param'), $pieces);
,我们将每个字段类型和参数绑定到bind_param
。
使用$placeholder = implode(', ', array_fill(0, count($pieces), '?'));
我们使用$pieces
拥有的正确占位符数量创建字符串,因此如果$pieces
有4个ID,则会创建一个类似于此?, ?, ?, ?
的字符串然后在IN ({$placeholder})
使用array_unshift($pieces, implode('', array_fill(0, count($pieces), 'i')));
我们创建并附加所有类型作为数组的第一个元素。
答案 1 :(得分:0)
像Dagon所说的那样,将查询置于循环之外。
使用如下查询:
SELECT id, video_name, link, phase FROM videos WHERE id IN (?)
然后您可以发送一个查询并立即获取所有数据。
使用$v = implode(',',$pieces);
获取IN ()
的内容。
使用implode永远不会导致数组元素丢失。