2014-03-05 57 views
0

我有這樣一段代碼:遍歷MySQL查詢用PHP預處理語句和順序由INT

$item_number = 0; 
$rowsize = 12; 

    for ($i = 0; $i < $rowsize; $i++) { 

     $stmt = $mysqli->stmt_init(); 
     $stmt->prepare('SELECT z, name FROM house_room1 INNER JOIN objects ON house_room1.object_id=objects.object_id WHERE house_room1.ref_id = ? ORDER BY z'); 
     $stmt->bind_param('i', $i 
     ); 
     if ($stmt->execute()) { 
      $stmt->bind_result($z, $name); 
       while($stmt->fetch()) { 
        echo '<li id="item-' . $item_number . '" class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>' . $name . '</li>'; 
         } 
       } 
       else { 
        echo 'Something went terribly wrong' . $mysqli->error; 
         } 
       $stmt->close(); 
       //$n++; 
       $item_number++; 
      } 

它通過一個查詢循環12次(目前12,將以更高),並選擇一個名稱和AZ來自特定ref_id的值。由於該循環經歷了12次,我從所有12個ref_id中獲得了z值。問題是我不能排序查詢,因爲它一次只取出一個查詢。嗯,我需要它得到所有12(及更多)的z值,並仍然能夠通過z值對輸出進行排序。最好只循環查詢一次。有任何想法嗎?提前致謝。

UPDATE:

$item_number = 0; 

    $i = 12; 

    $stmt = $mysqli->stmt_init(); 
    $stmt->prepare('SELECT z, name 
    FROM house_room1 
    INNER JOIN objects ON house_room1.object_id=objects.object_id 
    WHERE house_room1.ref_id < ? 
    ORDER BY z'); 
    $stmt->bind_param('i', $i 
    ); 
     if ($stmt->execute()) { 
     $stmt->bind_result($z, $name); 
     while($stmt->fetch()) { 
      echo '<li id="item-' . $item_number . '" class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>' . $name . '</li>'; 
     } 
    } 
    else { 
     echo 'Something went terribly wrong' . $mysqli->error; 
    } 
    $stmt->close(); 
    $item_number++; 
+1

是否有一個原因,你是限制到具體的ref ID的?你能包括你的表格列嗎?此外,你可以編輯你的問題,縮進不那麼嚴重? –

+0

我試着用縮進大聲笑idc發生了什麼,呃我會在一秒內修復,ref_id的不受限制,可以通過時間增加。 – owwyess

+2

任何時候你在循環內部都有一個查詢,某些事情就會消失「非常錯誤」 – Strawberry

回答

0

嘗試放置結果到一個數組,然後訂購數組:

$item_number = 0; 
$rowsize = 12; 

$itemArray = array(); 
$finalArray = array(); 
$results = 0; 

    for ($i = 0; $i < $rowsize; $i++) { 

     $stmt = $mysqli->stmt_init(); 
     $stmt->prepare('SELECT z, name FROM house_room1 INNER JOIN objects ON house_room1.object_id=objects.object_id WHERE house_room1.ref_id = ? ORDER BY z'); 
     $stmt->bind_param('i', $i 
     ); 
     if ($stmt->execute()) { 
      $stmt->bind_result($z, $name); 
       while($stmt->fetch()) { 


       $results = 1; 
       $itemArray['number'] = $item_number; 
       $itemArray['name'] = $name; 
       $itemArray['ref_id'] = $z; 
       array_push($finalArray, $itemArray); 

         } 
       } 
       else { 
        echo 'Something went terribly wrong' . $mysqli->error; 
         } 
       $stmt->close(); 
       //$n++; 
       $item_number++; 
      } 

if($results == 1){ 
aasort($finalArray,"ref_id"); 

foreach($finalArray as $arr){ 
echo '<li id="item-' . $arr['number'] . '" class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>' . $arr['name'] . '</li>'; 
} 

} 

//create a function for sorting 
function aasort (&$array, $key) { 
    $sorter=array(); 
    $ret=array(); 
    reset($array); 
    foreach ($array as $ii => $va) { 
     $sorter[$ii]=$va[$key]; 
    } 
    asort($sorter); 
    foreach ($sorter as $ii => $va) { 
     $ret[$ii]=$array[$ii]; 
    } 
    $array=$ret; 
} 

所以基本上我添加到您的代碼,是兩個數組變量:
itemArray =是數組你,我們正在創建結果
finalArray =是我們將所有itemArrays推到的數組。這是你正在創建一個多維數組,我們可以稍後進行分類。

然後我們設置變量$ results,這將確保結果被發現,否則我們將不運行代碼。

功能aasort你想要做什麼,通過現在然後排序信息accorrding到數組變量(在這種情況下REF_ID)

您只需循環有序的結果和輸出。非常簡單,應該很快。儘管如此,我建議不要循環執行SQL查詢。您應該嘗試儘可能少地查詢數據庫。希望這可以幫助!如果您有任何問題,請告訴我。

+0

uhm,這可能對我很有趣,因爲我需要這些值連接到一個jquery可排序函數uhmm,這個問題我沒有提供,因爲我不知道它是重要的 – owwyess

+0

如果你想的話,我們可以去聊天,我可以爲您提供必要的代碼?嗯,如果這是可能的,謝謝 – owwyess

+1

這樣做,你可以添加一個簡單的命令ID到李元素和排序與jQuery。如果需要,你實際上可以用jquery對整個列表進行排序。 – liveandream

1

那豈不是更容易編寫一個查詢,並讓服務器排序呢?事情是這樣的......

SELECT z, name 
FROM house_room1 
    INNER JOIN objects ON house_room1.object_id=objects.object_id 
WHERE house_room1.ref_id < ? 
ORDER BY z 

這具有一個查詢,而不是12(因此更有效)的利益,它可以讓你訂購結果集,任何方式都可以。

+0

這是我正在尋找的,但我現在用for循環做什麼?我通過結果得到了一些令人困惑的 – owwyess

+0

循環來回顯它們。 –

+0

當您在($ stmt-> fetch()){} 時通過 循環搜索結果時,您將獲得與現在相同的所有信息。 – Kryten