我正在尝试使用while循环显示属于登录用户的所有食谱。我注意到,让我们说,用户有4个食谱,第一个不会显示,导致表中只出现3个食谱。如果用户有3个配方,则不会显示第一个配方,导致只显示2个配方,依此类推。
我做了我的研究,发现这是因为第一行将被忽略,因此不会显示。
有没有人可以建议我应该对循环做出什么样的修正以解决这个问题?我的代码涉及在表格中显示,这就是为什么我仍然无法弄清楚应该做什么尽管看了在其他已经发布和回答的问题上。
非常感谢!
<?php
// 0: Instead of hard coding I shall declare the value first
$userid = $_SESSION['userid'];
// 1: Connect to forumdb database
$mysqli = new mysqli("localhost", "root", null, "recipedb") or exit("Error connecting to database");
// 2: Prepare the statement to select recipename,recipeid,,imagefile belonging to the $userid from recipe table
$stmt = $mysqli->prepare("Select recipename,recipeid,imagefile from recipe where userid=?");
// 3: Bind the values
$stmt->bind_param("s", $userid);
// 4: Execute the statement
$stmt->execute();
// TODO 5: bind results into $recipename,$recipeid and $imagefile
$stmt->bind_result($recipename, $recipeid, $imagefile);
if ($stmt->fetch() == null) {
echo "You did not have any recipes yet.<br />";
}
else {
echo "<table style=width:100% >";
echo "<tr><td><b>Recipe</b></td><td><b>Actions</b></td></tr>";
// Use while loop to fetch messages and put in a <table>
// if
while ($stmt->fetch()) {
echo "<tr>";
// 6: In 1st <td>, display recipename,recipeid,imagefile
echo "<td><b>$recipename</b><br /><b>Recipe ID:</b>$recipeid<br /> <img src='images/$imagefile' height='125' width='125' > </td>";
// 7: In 2nd <td>, display View hyperlink
// The View hyperlink links to recipedetails.php
// The delete hyperlink links to deleterecipes.php
echo "<td> <a href='recipedetails.php?recipeid=$recipeid'>View</a> ";
echo "<a href='deleteconfirmation.php?recipeid=$recipeid'>Delete</a> ";
echo "</tr>";
}
echo "</table>";
}
// 8: close the statement
$stmt->close();
// 9: close $mysqli
$mysqli->close();
?>
答案 0 :(得分:3)
如你所说,当你这样做时:
if($stmt->fetch()==null)
代码获取第一行。如果它不存在,则触发条件。否则,它继续,当你开始“真实地”获取行时,第一个已被提取。
您可以做的是检查返回的行数:
$stmt->store_result();
if ($stmt->num_rows == 0) {
echo "You did not have any recipes yet.<br>";
}
答案 1 :(得分:0)
......即使这有点老了。问题是,如果有结果,你会获取2次(比较中有一个,而while循环开始时有一个)。因此,第一张唱片被曝光。而不是使用&#34;而#34;循环a&#34; do while&#34;避免这种情况,因为下一次提取发生在循环结束时。