bir mysql sorguda iki tablo sorgu

3 Cevap php

im iki ayrı tablodan veri alma sorun yaşıyorsanız

şimdiye kadar ben bu var

<? 
include('config.php'); 
$xid = $_GET['xid'];

$result = mysql_query("SELECT * FROM `config`") or trigger_error(mysql_error()); 
while($row = mysql_fetch_array($result)){ 
foreach($row AS $key => $value) { $row[$key] = stripslashes($value); } 

$result = mysql_query("SELECT * FROM `utinfo` WHERE `xid` = $xid") or trigger_error(mysql_error()); 
while($row2 = mysql_fetch_array($result)){ 
foreach($row2 AS $key => $value) { $row2[$key] = stripslashes($value); } 
$un = urldecode($row2['un']);
};

switch ($row['module'])
{
case 1:
  echo "Function 1 for user $uid on account $un";
  break;
case 2:
  echo "Function 2 for user $uid on account $un";
  break;
case 3:
  echo "Function 3 for user $uid on account $un";
  break;
default:
  echo "No module defined.";

};
};
?>

Yapılandırma tablo yapılandırma modülleri adında bir satır vardır ve 1, biri 2 girişleri, diğer 3 ile doldurulur. Yani ben davayı 1 ve sonra davayı 3 görmem gerektiğini. Fakat almak her im varsayılan echo.

3 Cevap

(This is not an answer to the OP, but something you really should care about, so I think it's worth writting it)

Bu kod bir muazzam SQL injection var gibi görünüyor.

Sayfanızı çağrı normal şekilde "xid=5" URL, kullanıcı # 5 bilgi almak gibi bir şey olurdu.

Şimdi, birisi "xid=5 or 1=1" vermek varsayalım. Sonuçlanan sorgu olacaktır:

SELECT * FROM `utinfo` WHERE `xid` = 5 or 1=1

Koşul her zaman doğrudur; Eğer resultset boyunca yineleme gibi, bir çıkış olarak TÜM kullanıcıların bilgi almak istiyorum.

Diğer bir olasılık, "xid=5; delete from utinfo;"; Bu sorguyu verecek olan:

SELECT * FROM `utinfo` WHERE `xid` = 5; delete from utinfo;

İşte :-( masanıza boşaltmak istiyorum


You must always escape / check / sanitize / whatever you data before putting them in a SQL query, especially (but not only) if they come from a user of the application.

For strings, see the mysql_real_escape_string function.
For data that sould be integers, you could use intval (worst case, if data was not valid, you'll get 0, which might get no result from the DB, but, at least, won't break it ^^ )

Başka bir çözüm hazırlanmış deyimleri kullanmak olacaktır; ancak bu mysql_* fonksiyonu mevcut değildir: Eğer geçmek zorunda ya

Neyse, yeni bir uygulama için, kullanmak gerekir mysql_*: o eski ve mysqli ve PDO olsun yeni functionnalities / iyileştirmeler almaz ...

stripslashes () dizeleri kullanılır. Sizin durum değerleri tamsayı. Burada bir tür uyuşmazlığı var gibi görünüyor?

İlk cevap yazın uyumsuzlukları konusunda muhtemelen doğru, aşağıdaki kodu kullanarak sorunu çözmek gerekir:

switch ((integer) $row['module'])

See the following: http://us.php.net/manual/en/language.types.type-juggling.php#language.types.typecasting

Alternatif olarak, bu deneyebilirsiniz:

settype($row['module'], "integer");

switch ($row['module'])

See: http://us.php.net/manual/en/function.settype.php

Ben de sadece bu gerçekten bir tamsayı olduğunu kontrol etmek için sayfanın üzerine $ row ['modül'] değerini echo'ing öneririm.