运行 基于 mysql 查询的多个循环
Running multiple loops based on mysql query
我正在学习 PHP 我正在为电视节目制作个人剧集跟踪器。
我现在的问题是,我不知道如何打印出按季节分隔的 "pretty list"。现在,一个系列的每一集都打印有来自 mysql 查询的循环。这里还有一个 "watched" 函数,我需要用它来检查用户是否在循环中标记了剧集。
如何一次循环一季而不是每一集?我在另一个 "Series" table 中得到了季节的数量 as 和 int 如果这样更容易的话。
// Get episodes from database
$list_sql = "SELECT * FROM episodes WHERE series_id = '".$_GET['id']."' ORDER BY `episodes`.`season` ASC, `episodes`.`season_episode` ASC LIMIT 2000";
$list_query = mysqli_query($con, $list_sql) or die(mysqli_errno($con));
while ($row = mysqli_fetch_assoc($list_query)) {
// GET INFO ON WHEN EPISODE WAS VIEWED
$when_watched_sql = "SELECT date_watched FROM watched WHERE episode_id = '".$row['id']."'";
$when_watched_query = mysqli_query($con, $when_watched_sql);
$when_watched_result = mysqli_fetch_assoc($when_watched_query);
// IS EPISODE WATCHED? If yes, make CHECKBOX CHECKED
$watched_sql = "SELECT watched FROM watched WHERE episode_id = '".$row['id']."' AND watched = '1'";
$watched = mysqli_query($con, $watched_sql);
if(mysqli_num_rows($watched)>0) {
// One row returned, episode is watched
$watched_box = "checked";
} else {
// No rows returned, episode is not watched
$watched_box = "";
}
print("Watched: <input type='checkbox' name='watched[]' value='".$row['id']."' $watched_box /> Season: ".$row['season']." Episode: ".$row['season_episode']." ".$row['name']." <br>");
}
我在这里也可能有很多错误的做事方式,我确实喜欢一些建设性的提示和技巧,以学习如何以正确的方式做这一切。
题外话:
首先,在您的代码中检查该剧集何时被观看,然后检查它是否被观看(根据您的评论)。哪个对我来说没有意义?
所以我建议结合使用 2 个查询:
$watched_sql = "SELECT watched,date_watched FROM watched WHERE episode_id = '".$row['id']."' AND watched = '1'";
如果无论出于何种原因这对您的情况不起作用,我仍然建议您在确定观看日期后检查观看日期:
if(mysqli_num_rows($watched)>0) {
$when_watched_sql = "SELECT date_watched FROM watched WHERE episode_id = '".$row['id']."'";
$when_watched_query = mysqli_query($con, $when_watched_sql);
$when_watched_result = mysqli_fetch_assoc($when_watched_query);
// One row returned, episode is watched
$watched_box = "checked";
} else {
// No rows returned, episode is not watched
$watched_box = "";
}
主题:
我会说你需要得到 $watched_box 作为一个 array.I 似乎不理解你 mysql table 结构所以我有点不对劲.我现在无法测试这些东西,但我想说你需要像这样做:
$i=0;
$watched_box=array();
while ($row = mysqli_fetch_assoc($list_query)) {
// GET INFO ON WHEN EPISODE WAS VIEWED
$when_watched_sql = "SELECT date_watched FROM watched WHERE episode_id = '".$row['id']."'";
$when_watched_query = mysqli_query($con, $when_watched_sql);
$when_watched_result = mysqli_fetch_assoc($when_watched_query);
// IS EPISODE WATCHED? If yes, make CHECKBOX CHECKED
$watched_sql = "SELECT watched FROM watched WHERE episode_id = '".$row['id']."' AND watched = '1'";
$watched = mysqli_query($con, $watched_sql);
if(mysqli_num_rows($watched)>0) {
// One row returned, episode is watched
$watched_box[$i] = "checked";
} else {
// No rows returned, episode is not watched
$watched_box[$i] = "";
}
$i++;
var_dump($i);
我 99% 确定这不是可以立即为您工作的代码,因为我没有完全了解您的数据库结构,也无法对其进行测试。您需要对此进行一些更改,我认为这就是您想要的方式。有一个 计数器 和一个数组。在 while 循环之后尝试 var_dump($watched_box);
,看看它会显示什么
在@Loko 的帮助下,我解决了这个问题。
我最初的问题是如何每季打印一个包含该季所有剧集的列表,而不是仅包含剧集的一大列表。
我对此的解决方案是一个 FOR 循环,它根据 MySQL 数据库中的系列信息中设置的季节数循环遍历 X 个季节。
// Test new print loop (Thanks Loko)
?><form method="post" action="episode_list.php?id=<?php echo $series_id;?>"><?php
// Make a loop that iterates X amount of SEASONS based on mysql count result
$season = $season_count_array['seasons'];
// LOOP, start with season 1, if below $season (Amount of seasons), continue and add 1 to variable until loop reaches amount of seasons
for($seasons = 1; $seasons <= $season; $seasons++) {
$season_episodes_sql = "SELECT * FROM episodes WHERE season = '".$seasons."' AND series_id = '".$_GET['id']."' ORDER BY season_episode";
$season_episodes_query = mysqli_query($con, $season_episodes_sql);
// Loop through episodes of chosen season
while ($row = mysqli_fetch_assoc($season_episodes_query)) {
// Is episode watched?
$watched_sql = "SELECT watched FROM watched WHERE episode_id = '".$row['id']."' AND watched = '1'";
$watched = mysqli_query($con, $watched_sql);
if(mysqli_num_rows($watched)>0) {
// One row returned, episode is watched
$watched_box = "checked";
} else {
// No rows returned, episode is not watched
$watched_box = "";
}
// Allright, let's print
print("Sett: <input type='checkbox' name='watched[]' value='".$row['id']."' $watched_box /> Sesong: ".$row['season']." Episode: ".$row['season_episode']." ".$row['name']." <br>");
}
// Here I can add what I want as a spacer between printed seasons, just a break, for now.
echo '<br>';
}
我正在学习 PHP 我正在为电视节目制作个人剧集跟踪器。 我现在的问题是,我不知道如何打印出按季节分隔的 "pretty list"。现在,一个系列的每一集都打印有来自 mysql 查询的循环。这里还有一个 "watched" 函数,我需要用它来检查用户是否在循环中标记了剧集。
如何一次循环一季而不是每一集?我在另一个 "Series" table 中得到了季节的数量 as 和 int 如果这样更容易的话。
// Get episodes from database
$list_sql = "SELECT * FROM episodes WHERE series_id = '".$_GET['id']."' ORDER BY `episodes`.`season` ASC, `episodes`.`season_episode` ASC LIMIT 2000";
$list_query = mysqli_query($con, $list_sql) or die(mysqli_errno($con));
while ($row = mysqli_fetch_assoc($list_query)) {
// GET INFO ON WHEN EPISODE WAS VIEWED
$when_watched_sql = "SELECT date_watched FROM watched WHERE episode_id = '".$row['id']."'";
$when_watched_query = mysqli_query($con, $when_watched_sql);
$when_watched_result = mysqli_fetch_assoc($when_watched_query);
// IS EPISODE WATCHED? If yes, make CHECKBOX CHECKED
$watched_sql = "SELECT watched FROM watched WHERE episode_id = '".$row['id']."' AND watched = '1'";
$watched = mysqli_query($con, $watched_sql);
if(mysqli_num_rows($watched)>0) {
// One row returned, episode is watched
$watched_box = "checked";
} else {
// No rows returned, episode is not watched
$watched_box = "";
}
print("Watched: <input type='checkbox' name='watched[]' value='".$row['id']."' $watched_box /> Season: ".$row['season']." Episode: ".$row['season_episode']." ".$row['name']." <br>");
}
我在这里也可能有很多错误的做事方式,我确实喜欢一些建设性的提示和技巧,以学习如何以正确的方式做这一切。
题外话:
首先,在您的代码中检查该剧集何时被观看,然后检查它是否被观看(根据您的评论)。哪个对我来说没有意义?
所以我建议结合使用 2 个查询:
$watched_sql = "SELECT watched,date_watched FROM watched WHERE episode_id = '".$row['id']."' AND watched = '1'";
如果无论出于何种原因这对您的情况不起作用,我仍然建议您在确定观看日期后检查观看日期:
if(mysqli_num_rows($watched)>0) {
$when_watched_sql = "SELECT date_watched FROM watched WHERE episode_id = '".$row['id']."'";
$when_watched_query = mysqli_query($con, $when_watched_sql);
$when_watched_result = mysqli_fetch_assoc($when_watched_query);
// One row returned, episode is watched
$watched_box = "checked";
} else {
// No rows returned, episode is not watched
$watched_box = "";
}
主题:
我会说你需要得到 $watched_box 作为一个 array.I 似乎不理解你 mysql table 结构所以我有点不对劲.我现在无法测试这些东西,但我想说你需要像这样做:
$i=0;
$watched_box=array();
while ($row = mysqli_fetch_assoc($list_query)) {
// GET INFO ON WHEN EPISODE WAS VIEWED
$when_watched_sql = "SELECT date_watched FROM watched WHERE episode_id = '".$row['id']."'";
$when_watched_query = mysqli_query($con, $when_watched_sql);
$when_watched_result = mysqli_fetch_assoc($when_watched_query);
// IS EPISODE WATCHED? If yes, make CHECKBOX CHECKED
$watched_sql = "SELECT watched FROM watched WHERE episode_id = '".$row['id']."' AND watched = '1'";
$watched = mysqli_query($con, $watched_sql);
if(mysqli_num_rows($watched)>0) {
// One row returned, episode is watched
$watched_box[$i] = "checked";
} else {
// No rows returned, episode is not watched
$watched_box[$i] = "";
}
$i++;
var_dump($i);
我 99% 确定这不是可以立即为您工作的代码,因为我没有完全了解您的数据库结构,也无法对其进行测试。您需要对此进行一些更改,我认为这就是您想要的方式。有一个 计数器 和一个数组。在 while 循环之后尝试 var_dump($watched_box);
,看看它会显示什么
在@Loko 的帮助下,我解决了这个问题。 我最初的问题是如何每季打印一个包含该季所有剧集的列表,而不是仅包含剧集的一大列表。
我对此的解决方案是一个 FOR 循环,它根据 MySQL 数据库中的系列信息中设置的季节数循环遍历 X 个季节。
// Test new print loop (Thanks Loko)
?><form method="post" action="episode_list.php?id=<?php echo $series_id;?>"><?php
// Make a loop that iterates X amount of SEASONS based on mysql count result
$season = $season_count_array['seasons'];
// LOOP, start with season 1, if below $season (Amount of seasons), continue and add 1 to variable until loop reaches amount of seasons
for($seasons = 1; $seasons <= $season; $seasons++) {
$season_episodes_sql = "SELECT * FROM episodes WHERE season = '".$seasons."' AND series_id = '".$_GET['id']."' ORDER BY season_episode";
$season_episodes_query = mysqli_query($con, $season_episodes_sql);
// Loop through episodes of chosen season
while ($row = mysqli_fetch_assoc($season_episodes_query)) {
// Is episode watched?
$watched_sql = "SELECT watched FROM watched WHERE episode_id = '".$row['id']."' AND watched = '1'";
$watched = mysqli_query($con, $watched_sql);
if(mysqli_num_rows($watched)>0) {
// One row returned, episode is watched
$watched_box = "checked";
} else {
// No rows returned, episode is not watched
$watched_box = "";
}
// Allright, let's print
print("Sett: <input type='checkbox' name='watched[]' value='".$row['id']."' $watched_box /> Sesong: ".$row['season']." Episode: ".$row['season_episode']." ".$row['name']." <br>");
}
// Here I can add what I want as a spacer between printed seasons, just a break, for now.
echo '<br>';
}