-1

最初の配列を使用して 2 番目に 2 つのデータベース クエリを実行しようとしていますが、ページの読み込みが停止する理由を知っている人はいますか?

$query = $this->db->query("SELECT category_id FROM listings WHERE listing_id = '1' LIMIT 1");
foreach ($query->result() as $row)
{
    $query2 = $this->db->query("SELECT listing_title FROM listings WHERE listing_type =     '".$row->category_id."' ORDER BY RAND() LIMIT 2");
    foreach ($query2->result() as $row)
    {
        echo $row->listing_title;
    }
}
4

3 に答える 3

2

内側のループで外側の $row を上書きしています

$query = $this->db->query("SELECT category_id FROM listings WHERE listing_id = '1' LIMIT 1");
foreach ($query->result() as $row)
{
    $query2 = $this->db->query("SELECT listing_title FROM listings WHERE listing_type =     '".$row->category_id."' ORDER BY RAND() LIMIT 2");
    foreach ($query2->result() as $row2) // <--- $row2 not $row
    {
        echo $row2->listing_title;
    }
} 
于 2013-03-12T01:22:21.493 に答える
0

これを試して:

(prepare ステートメント、prepare() 関数などを利用します)

$query = "SELECT category_id FROM listings WHERE listing_id = '1' LIMIT 1;";
$query2 = "SELECT listing_title FROM listings WHERE listing_type = :categoryId ORDER BY RAND() LIMIT 2;";

$db = $this->db;

$statement = $db->prepare($query);
$statement->execute();
$statement->setFetchMode(PDO::FETCH_ASSOC);
while($row = $statement->fetch())
{
    $categoryId = $row['category_id'];

    $statement2 = $db->prepare($query2);
    $statement2->execute(array(':categoryId' => $categoryId));
    $statement2->setFetchMode(PDO::FETCH_ASSOC);
    while($row2 = $statement2->fetch())
    {
        $listingTitle = $row2['listing_title'];
        echo $listingTitle;
    }
}
于 2013-03-12T01:42:09.673 に答える
0

これはあまり良いコードではありません。foreachSelect クエリに があるのにループを使用するのはなぜLimit 1ですか?

list_id=1 (LIMIT 1) のカテゴリ ID を使用するため、コードは次のように短縮できます。

SELECT listing_title FROM listings WHERE listing_id=1 ORDER BY RAND() LIMIT 2

また、ORDER BY RAND()大きなテーブルでは大きなリソース キラーです。結果を順序付けするためのより適切な方法を見つけることをお勧めします。

編集:私が使用する完全なコード:

$db=$this->db; //Just so we don't have to keep referencing $this (assuming you are not in a class)

$sql="SELECT listing_title 
FROM listings 
WHERE listing_id=? 
ORDER BY RAND() 
LIMIT 2";

$statement=$db->prepare($sql);
$statement->execute(array(1));

while($result=$statement->fetchObject()){
    echo $result->listing_title;
}
于 2013-03-12T01:42:23.143 に答える