Bir dizi kullanarak MySQL sorgusu

3 Cevap php

Ben bir dizi kullanarak bir MySQL veritabanını sorgulamak için çalışıyorum ama sorun yaşıyorum!

Ben müşteri olarak adlandırılan bir tablo, ben kimin 'sektör' sütunu $ sectorlink eşit olduğu tüm satırları 'isim' seçmek mümkün olmak istiyorum var.

Ben o zaman benim bir sonraki sorgu gerçekleştirmek böylece bir diziye bütün isimleri koymak istiyorum: kimin 'müşteri' sütun adlarının ilk sorgudan döndürülen birine eşit olan başka bir tablodan tüm satırları seçin. Bu ölümcül bir SQL hatası verir, çünkü ben yanlış bir şey yapıyorum. Ben tüm değişkenleri ile karıştırılmamalıdır alıyorum!

$ Sectorlink $ ve bağlantı bu kodun dışında tanımlanan tek değişkenlerdir

Herhangi bir öneriniz?

$query1 = "SELECT name FROM clients WHERE sector = '$sectorlink'";
$clientresult = mysql_query($query1, $connection) or trigger_error("SQL", E_USER_ERROR);

while($row = mysql_fetch_array($clientresult)){

foreach($row AS $key => $value){$temp[] = '"'.$value.'"';}
$thelist = implode(",",$temp);

$query = "SELECT count(*) FROM studies WHERE client IN ($row) ORDER BY (date) desc";
$result = mysql_query($query, $connection) or trigger_error("SQL", E_USER_ERROR);

}

3 Cevap

İkinci sorgu $thelist değil $row kullanmanız gerektiğini ve bunun dışında while döngü olmalıdır. Tek bir satır işlenirken foreach döngü gereksizdir. Bir basit $row adını erişebilirsiniz $row[0]. Böyle bir şey (denenmemiş):

$query1 = "SELECT name FROM clients WHERE sector = '$sectorlink'";
$clientresult = mysql_query($query1, $connection) or trigger_error("SQL", E_USER_ERROR);

while($row = mysql_fetch_array($clientresult)){
    $temp[] = '"'.$row[0].'"';
}

$thelist = implode(",",$temp);
$query = "SELECT count(*) FROM studies WHERE client IN ($thelist) ORDER BY (date) desc";
$result = mysql_query($query, $connection) or trigger_error("SQL", E_USER_ERROR);

Caution: kod SQL injection attacks karşı son derece savunmasız olduğunu unutmayın. Bu test veya iç gelişimi için iyidir ama bu kod Fort Knox web sitesi çalışıyor olacak eğer biraz onu düzeltmek istiyorum gidiyoruz. Sadece bir Bilginize. :-)

Birkaç şey. Önce orada gereksiz bir döngü var. Deneyin:

while (list($name) = mysql_fetch_row($clientresult)) {

    $temp[] = $name;
}

Geçici dizi oluşturmak.

İkincisi, IN fıkra parçaları dizeleri, böylece içeriye patlamak zaman, tırnak içinde her değeri içine gerekir:

$thelist = "'". implode("','", $temp) . "'";

Son olarak, sorguda sizi $row IN bendine geçiyoruz, geçen edilmelidir $thelist:

$query = "SELECT count(*) FROM studies WHERE client IN ($thelist) ORDER BY date desc";
$result = mysql_query($query, $connection) or trigger_error("SQL", E_USER_ERROR);

Yani tamamen:

$query1 = "SELECT name FROM clients WHERE sector = '$sectorlink'";
$clientresult = mysql_query($query1, $connection) or trigger_error("SQL", E_USER_ERROR);

while (list($name) = mysql_fetch_row($clientresult)) {

    $temp[] = $name;
}

$thelist = "'". implode("','", $temp) . "'"; 

$query = "SELECT count(*) FROM studies WHERE client IN ($thelist) ORDER BY date desc";
$result = mysql_query($query, $connection) or trigger_error("SQL", E_USER_ERROR);

Ben bir birleşim ile bir sorguda bunu yaparken daha iyi olurdu bekliyoruz:

$query = "SELECT COUNT(*)  FROM `studies` INNER JOIN `clients` on studies.client = clients.name WHERE clients.sector = '$sectorlink' ORDER BY studies.date DESC";
$result = mysql_query($query, $connection) or trigger_error("SQL", E_USER_ERROR);