[英]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.