簡體   English   中英

PHP SQL While循環不起作用

[英]PHP SQL While loop not working

我有一個代碼,應該從favourites夾中獲取所有用戶的收藏favourites ,然后使用該信息從menus獲取信息以將其顯示為圖片。

它所要做的就是顯示用戶的收藏夾,但此刻僅在其收藏夾中有很多時才顯示一張圖片。

<?php
$con=mysqli_connect("localhost","UN","PW","DB");

// Check connection
if (mysqli_connect_errno()) {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
$id=$_SESSION['user']['id'];
$result = mysqli_query($con,"SELECT * FROM favourites WHERE user='$id'");

while($row = mysqli_fetch_array($result)) {
    $code=$row['gamecode'];
    $con=mysqli_connect("localhost","UN","PW","DB");
    // Check connection
    if (mysqli_connect_errno()) {
        echo "Failed to connect to MySQL: " . mysqli_connect_error();
    }

    $result = mysqli_query($con,"SELECT * FROM menus WHERE code='$code'");

    while($row = mysqli_fetch_array($result)) {
?>
<a href="<?php echo $row['link']; ?>">
<img src="<?php echo $row['picture']; ?>" alt="<?php echo $row['game']; ?>"      height="120" width="150" class="fade"></a>
<?php
    }
    mysqli_close($con);
}

mysqli_close($con);

?>

通過重新連接到循環中的數據庫來殺死查詢

$con = mysqli_connect(...) // connection #1
$result = mysqli_query(...);
while($row = mysqli_fetch($result)) {
   $con = mysqli_connect(...); // connection #2

當您再次連接時,您將終止原始連接,這將終止您的查詢。

除非您需要使用不同的憑據連接兩次,否則無需第二次連接。 一個連接可以處理多個查詢。

順便說一句,如果您使用了不同的連接句柄變量,例如

$con = mysqli_connect(...);
    $othercon = mysqli_connect(...);

您不會有問題。 您可以具有多個連接,但不能使用相同的單個變量。

您有兩個MySQL連接,它們具有相同的變量名$con以及$result$row 因此,我只是在內部循環中更改了變量名,以使它們不會沖突,並且所有變量都應該工作; $con_inside$result_inside$row_inside

我還添加or die(mysqli_error()); mysqli_query行,因此如果查詢mysqli_query ,可以返回錯誤。

<?php
$con = mysqli_connect("localhost","UN","PW","DB");

// Check connection
if (mysqli_connect_errno()) {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

$id = $_SESSION['user']['id'];

$result = mysqli_query($con, "SELECT * FROM favourites WHERE user='$id'") or die(mysqli_error());

while ($row = mysqli_fetch_array($result)) {

  $code = $row['gamecode'];

  $con_inside = mysqli_connect("localhost","UN","PW","DB");

  // Check connection
  if (mysqli_connect_errno()) {
    echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

  $result_inside = mysqli_query($con_inside, "SELECT * FROM menus WHERE code='$code'") or die(mysqli_error());

  while($row_inside = mysqli_fetch_array($result_inside)) {
?>

  <a href="<?php echo $row_inside['link']; ?>">
  <img src="<?php echo $row_inside['picture']; ?>" alt="<?php echo $row_inside['game']; ?>" height="120" width="150" class="fade"></a>

<?php
  }

  mysqli_close($con_inside);

}

mysqli_close($con);

此外,這是代碼的稍作修改的版本,應該可以更好地工作。 我從循環中刪除了內部數據庫連接,並將其設置在腳本的頂部。 不必在每個循環上都重置連接。 另外,我使用mysqli_stmt_bind_param添加了行,這是使用mysqli_*查詢而不是設置字符串的首選方式。 還使用mysqli_free_result釋放每個循環上的查詢內存。 這些雖然很小,但它們合起來會帶來更好的代碼。

<?php

// Main DB connection.
$con = mysqli_connect("localhost","UN","PW","DB") or die(mysqli_connect_error());

// Inside DB connection.
$con_inside = mysqli_connect("localhost","UN","PW","DB") or die(mysqli_connect_error());

// Set the $id variable.
$id = $_SESSION['user']['id'];

// Set the query string.
$query = "SELECT * FROM favourites WHERE user='$id'";

// Bind the values to the query.
mysqli_stmt_bind_param($query, 's', $id);

// Get the result.
$result = mysqli_query($con, $query) or die(mysqli_error());

// Roll through the results.
while ($row = mysqli_fetch_array($result)) {

  // Set the $code variable.
  $code = $row['gamecode'];

  // Set the query string.
  $query_inside = "SELECT * FROM menus WHERE code='$code'";

  // Bind the values to the query.
  mysqli_stmt_bind_param($query_inside, 's', $code);

  // Get the result.
  $result_inside = mysqli_query($con_inside, $query_inside) or die(mysqli_error());

  // Roll through the results.
  while($row_inside = mysqli_fetch_array($result_inside)) {
?>

  <a href="<?php echo $row_inside['link']; ?>">
  <img src="<?php echo $row_inside['picture']; ?>" alt="<?php echo $row_inside['game']; ?>" height="120" width="150" class="fade"></a>

<?php
  }

  // Free the result set.
  mysqli_free_result($result_inside);

  // Close the connection.
  mysqli_close($con_inside);

}

// Free the result set.
mysqli_free_result($result);

// Close the connection.
mysqli_close($con);

查看它是否可以使用不同的結果變量和僅一個數據庫連接來工作。

<?php
$con=mysqli_connect("localhost","UN","PW","DB");
// Check connection
if (mysqli_connect_errno()) {  echo "Failed to connect to MySQL: " . mysqli_connect_error(); }
$id = $_SESSION['user']['id'];
$result1 = mysqli_query($con,"SELECT * FROM favourites WHERE user='$id'");
while($row = mysqli_fetch_array($result1)) {
    $result2 = mysqli_query($con,"SELECT * FROM menus WHERE code='".$row['gamecode']."");
    while($row2 = mysqli_fetch_array($result2)) { ?>
<a href="<?php echo $row2['link']; ?>">
<img src="<?php echo $row2['picture']; ?>" alt="<?php echo $row2['game']; ?>"      height="120" width="150" class="fade"></a>
<?php }
}
mysqli_close($con);
?>

暫無
暫無

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

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