php
  • mysql
  • arrays
  • loops
  • 2012-11-10 75 views 3 likes 
    3

    希望有人可以幫助解決這個問題,這已經讓我瘋狂了很多年。我很新的MySQL/PHP。來自內部的多個mysql查詢for循環

    我有一個數組[$ Booklist],它由一系列引用Books表中的BookID的數字組成。然後我查詢數據庫以獲得與每個ID相關的詳細信息:

    for($s=0;$s<$smax+1;$s++){ 
        $sql="SELECT * FROM Books WHERE BookID = '$Booklist[$s]' "; 
        $result=mysql_query($sql) or exit(); 
    
        while($row = mysql_fetch_array($result)) 
        { 
        $Title[$s]=$row['Title']; 
        $Author[$s]=$row['Author']; 
        $Publisher[$s]=$row['Publisher']; 
        $Year[$s]=$row['Year']; 
        } 
    } 
    

    這工作正常。但我從來不喜歡從php for循環運行多個查詢。

    重要的是,允許$ Booklist數組中的重複BookID。並且必須保留$ Booklist數組中的ID的順序(帶有重複項),以便$ Title和$ Author數組的內容具有正確的順序,包括重複項。希望是有道理的!

    我試着這樣做:

    $sql="SELECT * FROM Books WHERE BookID IN ('".join("','", $Booklist)."') 
    ORDER BY FIELD(BookID, '".join("','", $Booklist)."')"; 
    $s=0; 
        while($row = mysql_fetch_array($result)) 
        { 
        $Title[$s]=$row['Title']; 
        $Author[$s]=$row['Author']; 
        $Publisher[$s]=$row['Publisher']; 
        $Year[$s]=$row['Year']; 
        $s++; 
        } 
    

    但它意味着$書目任何重複的$標題,$作者等均未反映,所以我報廢了。

    我的問題是 - 是否有更好的解決方案,以查詢循環內的mysql查詢?或者,從for循環運行多個mysql查詢有問題嗎? - 堅持這一點更簡單嗎?

    謝謝!

    +1

    [請不要使用mysql_ *函數。](http://stackoverflow.com/questions/12859942/why-shouldnt-i-use-mysql-function-in-php) –

    +0

    好點,謝謝。 – animal

    +0

    看看我的答案。我認爲這是你需要的 –

    回答

    2

    我認爲你需要的是以下內容。它做了一個查詢,然後根據同時使用$booklist變量的順序由您查詢返回的數據創建的4列:

    $sql = "SELECT * FROM Books WHERE BookID IN ('".join("','", array_map('mysqli_real_escape_string',$Booklist))."')"; 
    $result = mysqli_query($sql) or exit(); 
    $rows = array(); 
    while ($row = mysqli_fetch_array($result)) { 
        $rows[$row['BookId']] = $row; 
    } 
    
    $i = 0; 
    foreach ($Booklist as $bookId) { 
        if (isset($rows[$bookId])) { 
         $Title[$i]  = $rows[$bookId]['Title']; 
         $Author[$i] = $rows[$bookId]['Author']; 
         $Publisher[$i] = $rows[$bookId]['Publisher']; 
         $Year[$i]  = $rows[$bookId]['Year']; 
         $i++; 
        } 
    } 
    

    另外請注意,我說mysqli_real_escape_string防止SQL注入

    +0

    輝煌。我認爲這是對的。謝謝。在做綠色勾號之前,我會做更多的測試來確認。但我認爲你已經破解了它。 – animal

    +0

    哦。感謝您指出mysqli_real_escape的方式。讚賞。 – animal

    +1

    是的,它工作正常。非常感謝。感覺非常好,擺脫那些醜陋的循環查詢。 [只要我有15個聲望,我就會+1]。 – animal

    1

    我不確定我是否知道問題出在您的代碼上,但是這對您有用嗎?我只是把檢索到的書放在一個數組中。重複的書應該都在那裏。

    $books = array(); 
    $sql="SELECT * FROM Books WHERE BookID IN ('".join("','", $Booklist)."')"; 
    while($row = mysqli_fetch_array($result)){ 
        $books[] = $row; 
    } 
    
    +0

    [請不要使用mysql_ *函數。他們將被棄用。](http://stackoverflow.com/questions/12859942/why-shouldnt-i-use-mysql-function-in-php) –

    +0

    行...編輯... – Jean

    +0

    謝謝。但是最好使用[prepared statements](http://php.net/manual/en/mysqli.prepare.php)。 –

    相關問題