Sql sorgusu yalnızca ilk satırı yazdırma

2 Cevap php

Ben php kodlama yaşıyorum ve kod bir mysql db ek veri getirmek için bir dizi veri alır. Ben iki farklı tablodan veri gerekir, çünkü ben while döngüleri iç içe kullanabilirsiniz. Ama her Aşağıdaki kodu yalnızca echo ("a:" yazdırır $ data3 [2]; veya echo.. "B:" $ data3 [2] ;) bir kez:

foreach($stuff as $key)
{
    $query3 = "SELECT * FROM foobar WHERE id='$key'";
    $result3 = MySQL_query($query3, $link_id);

    while ($data3 = mysql_fetch_array($result3))
    {
    	$query4 = "SELECT * FROM foobar_img WHERE id='$data3[0]'";
    	$result4 = MySQL_query($query4, $link_id);

    	while ($data4 = mysql_fetch_array($result4))
    	{	
    		$x += 1;
    		if ($x % 3 == 0)
    		{
    			echo "a: " . $data3[2];
    		}
    		else
    		{
    			echo "b: " . $data3[2];
    		}
    	}
    }
}

2 Cevap

Birincisi ve en önemlisi, SQL geliştirmek:

SELECT
    img.*
FROM
    foobar foo
    INNER JOIN foobar_img img ON
        foo.id = img.id
WHERE
    foo.id = $key

Yalnızca bir dizi yineleme yapmak zorunda kalacak.

Ayrıca, aslında sadece bir satır seçerek konum, bu yüzden bir satır tükürerek beklenen davranış olduğu görülmektedir.

Ayrıca, kullanarak SQL enjeksiyon kendinizi önlemek mysql_real_escape_string() lütfen:

$query3 = "SELECT * FROM foobar WHERE id='" . 
     mysql_real_escape_string($key) . "'";

Update: Dan gibi kinayeli olarak, sonuç erkene almak için MySQL konsolda bu sorguyu çalıştırmak için lütfen, bu yüzden sizinle oynarken biliyorum. Eğer bir ID sorgu sınırlamak zaman, muhtemelen tek bir satır geri çekiyoruz. Söyleniyor, ben çok $ anahtarlar $ şeylere nasıl hiçbir fikrim yok, ama o zamanlar üzerinde spin eğer, o zaman biri olacak.

Sen $ malzeme yineleme ve SQL için bir IN yan tümcesi dışında inşa daha iyi olabilir:

$key_array = "";
foreach($stuff as $key)
{
    $key_array .= ",'" . mysql_real_escape_string($key) . "'";
}
$key_array = substr($key_array, 1);

...

WHERE foo.id IN ($key_array)

Bu yerine DB SELECT sorguları bir demet gönderme, sana geri tam listesi ile ayarlanan bir sonuç verecektir. Tür DB olmak ve mümkün olduğunda set-tabanlı işlemler kullanın lütfen. MySQL bunu takdir edecektir.

Ben de size metin birincil tuşlarını kullanarak konum gibi görünür işaret edecektir. Tamsayı, artışlı anahtarları PK ait olarak en iyi çalışır, ve ben çok onları kullanmanızı öneririz!

Eğer bu iki tablo arasında JOIN kullanmalısınız. Bu doğru yolu SQL kullanmak için, ve çok daha hızlı çalışacak. Döngü içinde ekstra bir sorgu yaparken loop-invariant code, bir döngü içinde koyarak gibi, kötü bir uygulamadır.