簡體   English   中英

PHP Mysql select僅顯示一行

[英]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的mysqliPDO功能包括此功能(請參見下文)。

從OWASP: PHP安全表

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM