PHP Mysql select仅显示一行

PHP Mysql select仅显示一行,php,mysql,Php,Mysql,我目前正在尝试制作一个电视连续剧的页面。不知怎的,页面只显示了季节的一行,在我的数据库中是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 inf

我目前正在尝试制作一个电视连续剧的页面。不知怎的,页面只显示了
季节的一行,在我的数据库中是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

                    }
                }

            }
        }

    }
}

有什么变化我忽略了什么吗?
剧集
部分工作得非常好,它显示了一季中的所有剧集。

您正在覆盖外部循环使用的
$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=“从用户名为“”的用户中选择*”$用户名。"';";

或者插值,本质上是相同的:

$sql=“从用户名为“$username”;”的用户中选择*

如果“$username”来自不受信任的来源(您必须假定 它有,因为你不容易在源代码中看到),它可以 包含允许攻击者执行的字符,如 与预期的查询非常不同,包括删除 使用准备好的语句和绑定参数的整个数据库等 一个更好的解决方案。PHP的和 功能包括此功能(请参见 下)


来自OWASP:

请注意,这段代码非常糟糕,请尽量不要像您这样在查询内部、查询和循环内部执行查询,这是非常糟糕的性能,如果您从与某个字段相关的不同表中获取信息,请使用JOIN,这是一个本机SQL运算符,请尝试不要使用mysql,而是使用mysqli和准备好的查询。您的查询很容易被黑客攻击,因为您使用的url参数没有正确的验证。回答这个问题,这就是我建议的真正问题为了惩罚这种糟糕的编码,没有其他人会复制这种想法。需要一个mysql查询来获取所有信息,然后通过数组循环,而不是嵌套查询循环,我甚至没有提到他没有转义变量,这是一个非常糟糕的程序,这不是个人的问题,Hugo,我只是想让你知道最好的方法是什么,我相信你应该先学习最佳实践,这样你才不会习惯坏的实践