2017-07-12 51 views
0

我有下面的代碼:PHP /庫MySQLi:讀取行之前while循環

<html> //This is using bootstrap, but nevermind, has nothing todo with question... 
<body> 
    <?php 
     echo "<div class=\"list-group\">".PHP_EOL; 
     $connection = mysqli_connect('...'); 
     if(mysqli_connect_errno()) { 
      die('Connection Error'); 
     } 
     $connection->set_charset("utf8"); //$bid is a var declared before 
     $getcom = $connection->query("SELECT * FROM hilde_comments WHERE Refer_ID LIKE '$bid' ORDER BY Comment_ID DESC LIMIT 10"); 
     if ($getcom->num_rows > 0) { 
      while ($row = $getcom->fetch_array(MYSQLI_ASSOC)) { 
       $getacc = $connection->query("SELECT * FROM hilde_accounts WHERE adress_id LIKE '$row["Account_adress"]'"); 
       if ($getacc->num_rows > 0) { 
        $accinf = $getacc->fetch_array(MYSQLI_ASSOC); 
        echo "<div class=\"list-group-item\">".PHP_EOL; 
        echo "<h4 class=\"list-group-item-heading\"><a href='".$accinf["link"]."' alt=\"Click here!\">".$accinf["email"]."</a></h4>".PHP_EOL; 
        echo "<p class=\"list-group-item-text\">".$row["Comment"]."</p></div>".PHP_EOL; 
       } else { 
        echo "Information ".$row["Account_UID"]." failed."; 
       } 

      } 
      $getcom->close(); 
      $getacc->close(); 
      $connection->close(); 
      echo "</div>"; 
     } else { 
      $getcom->close(); 
      $connection->close(); 
      echo("<div class=\"list-group-item list-group-item-danger\">Text not found</div>"); 
     } 
    ?> 
</body> 
</html> 

當然,這是不行的(如某人在我previous question指出)。但是爲了繼續,我需要兩個查詢的結果來回顯,就像你在我的例子中看到的那樣。如何存儲第一個查詢的結果,並在我的while循環中實際使用它們作爲ASSOC?

在此先感謝球員,

VicStudio

+1

你的第一個查詢在'$ row'變量中的結果是不是已經? – Sugar

+0

@ClémentMalet是的,但我不能在第一個查詢處於活動狀態時啓動第二個查詢(並且尚未關閉) – VicStudio

+1

您能發佈真實的代碼嗎?我猜你在第二個查詢中使用了'$ row'並覆蓋了第一個查詢。你也可以用1個查詢和一個'join'來完成這一切。 – chris85

回答

1

沒有理由爲什麼你不能使用多個查詢。在執行另一個查詢之前,您不需要完成一個查詢。

$getcom = $connection->query("..."); 
while ($row = $getcom->fetch_array(MYSQLI_ASSOC)) { 
    $getacc = $connection->query("..."); 
    while ($row2 = $getacc->fetch_array(MYSQLI_ASSOC)) { 
     echo $row2["Name"]." and ".$row["Adress"]; 
    } 
} 

編輯現在,真正的代碼已經被添加,我可以看到,問題就在這裏:

$getacc = $connection->query("SELECT * FROM hilde_accounts WHERE adress_id LIKE '$row["Account_adress"]'"); 

你混的報價。您可能在該查詢中遇到mysqli錯誤(或者PHP發生語法錯誤)。你應該真的使用這個參數化查詢,但如果你使用變量這種方式,打斷你的字符串:

$getacc = $connection->query("SELECT * FROM hilde_accounts WHERE adress_id LIKE '" . $row["Account_adress"] . "'"); 

,將工作,只要有一個在地址沒有'。請記住,這種代碼是等待發生的SQL注入攻擊,請切換到使用參數化查詢。

+0

什麼是參數化查詢? – VicStudio

+0

請參閱文檔頁面[PDO](https://stackoverflow.com/documentation/php/5828/pdo/2685/preventing-sql-injection-with-parameterized-queries#t=201707121732587176923)和[for mysqli]( https://stackoverflow.com/documentation/php/2784/php-mysqli/11958/prepared-statements-in-mysqli#t=20170712173313227615)。 – rickdenhaan

+0

謝謝!您幫助了很多,不僅在我的問題上,而且在我的網頁安全系統中! :) – VicStudio