簡體   English   中英

使用PHP Prepared Statement和Int順序遍歷mysql查詢

[英]Loop through mysql query with PHP Prepared Statement and order by 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次,將會更高),並從特定的ref_id中選擇名稱和z值。 由於此循環經過12次,因此我從所有12個ref_id中獲得了z值。 問題是我無法對我退出的查詢進行排序,因為它一次只能提取一個查詢。 嗯,我需要它來獲取所有12個z值(以及以后的z值),並且仍然能夠通過z值對輸出進行排序。 最好只循環查詢一次。 有任何想法嗎? 提前致謝。

更新:

$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++;

編寫一個查詢並讓服務器對它進行排序會更容易嗎? 像這樣

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(因此更有效)的利益,它可以讓你訂購的整個結果集的任何方式都可以。

嘗試將結果放入數組中,然后對數組進行排序:

$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可以執行您想要的操作,根據數組標簽對信息進行排序(在本例中為ref_id)

然后,您只需遍歷現在排序的結果和輸出。 非常簡單,應該很快。 我建議您不要循環遍歷sql查詢。 您應該盡量減少對數據庫的查詢。 希望這可以幫助! 如果您有任何問題,請告訴我。

暫無
暫無

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

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