[英]PHP Mysql select is only showing one row
我目前正在尝试制作电视连续剧的页面。 该页面以某种方式仅显示了seasons
一行,这在我的数据库中为5。
$sql = "SELECT * FROM `shows` WHERE url='".dburl($_GET["url"])."'";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
// General info about the TV show here
$sql = "SELECT * FROM seasons WHERE `show`='".$row["id"]."' ORDER BY number ASC";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while($seasons = $result->fetch_assoc()) {
// The seasons
$sql= "SELECT * FROM episodes WHERE `show`='".$row["id"]."' AND `season`='".$seasons["number"]."' ORDER BY number DESC";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while($episodes = $result->fetch_assoc()) {
// The episodes, sorted by season
}
}
}
}
}
}
我忽略了什么变化吗? episodes
部分工作得很好,它显示了一个季节中的所有情节。
您正在覆盖外循环使用的$result
变量。 只需使用一个新变量:
$sql = "SELECT * FROM seasons WHERE `show`='".$row["id"]."' ORDER BY number ASC";
$seasons_result = $conn->query($sql);
if ($seasons_result->num_rows > 0) {
while($seasons = $seasons_result->fetch_assoc()) {
我建议您在一个mysql查询中获取所有数据,使用适当的变量转义,并且代码将比您获得的代码更简单,更具可读性。 然后,也许您会犯更少的错误,但是编码更好:
$mysqli = new mysqli("localhost", "my_user", "my_password", "my_db");
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$sql = "SELECT * FROM `shows` sh
JOIN `seasons` se.show ON sh.id
JOIN `episodes` e ON e.show = se.id AND e.season = e.number
WHERE url=?
ORDER BY se.number, e.number";
/* Prepare statement */
$stmt = $conn->prepare($sql);
if($stmt === false) {
trigger_error('Wrong SQL: ' . $sql . ' Error: ' . $conn->errno . ' ' .$conn->error, E_USER_ERROR);
}
/* Bind parameters. Types: s = string, i = integer, d = double, b = blob */
$stmt->bind_param('s', dburl($_GET["url"]));
/* Execute statement */
$stmt->execute();
/* Fetch result to array */
$res = $stmt->get_result();
while($row = $res->fetch_array(MYSQLI_ASSOC)) {
array_push($a_data, $row);
}
/* close statement */
$stmt->close();
}
/* close connection */
$mysqli->close();
理由或解释:
切勿在SQL中连接或插入数据
请勿通过串联来构建包含用户数据的SQL字符串:
$ sql =“ SELECT * FROM用户所在的用户名='”。 $ username。 “';”;
或插值,基本相同:
$ sql =“选择*来自用户的用户名='$用户名';”;
如果“ $ username”来自一个不受信任的来源(并且您必须假定它来自,因为您无法轻易在源代码中看到它),它可能包含诸如“”的字符,这将使攻击者可以执行与查询完全不同的查询。包括删除整个数据库等。使用准备好的语句和绑定参数是一个更好的解决方案。 PHP的mysqli和PDO功能包括此功能(请参见下文)。
从OWASP: PHP安全表
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.