2016-04-04 105 views
1

Bir süredir bunu çözmeye çalıştım ve bir çözüme gelmedim.Birleştirilmiş Tabloda POST-Değişken başına SQL'de arama

Mobil Cihazlarla dolu bir tablodan okurum ve bunları listeler ve kullanıcıya Movile Device Name (Kullanıcı Adı) ve Username (Kullanıcı Adı) başına listeyi arama olanağı tanır.

Bu benim Kod geçerli: bir User-ID içermiyor masa satırlar boş bırakılır ise, sürece tbl_mobdev.mobdev_user bir User-ID içerdiğinden amaçlandığı gibi

 SELECT 
     * 
    FROM 
     tbl_mobdev 
    LEFT JOIN 
     tbl_mobdev_type ON mobdev_type_id = mobdev_type 
    LEFT JOIN 
     tbl_marke ON marke_id = mobdev_type_marke 
    LEFT JOIN 
     tbl_user ON tbl_user.id = mobdev_user 
    WHERE 
     CONCAT(tbl_marke.marke_name,' ',tbl_mobdev_type.mobdev_type_bezeichnung) LIKE '%".$_POST['marke_name']."%' 
    AND 
     CONCAT(tbl_user.name,' ',tbl_user.vorname) LIKE '%".$_POST['user']."%' 
    AND 
     mobdev_aktiv = '1' 
    ORDER BY 
     ".$_GET['sort']." ".$_GET['sort2']." 

Her şey çalışır.

Bunun için herhangi bir Çözüm?

Düzenleme: "süzgeç" tbl_user için SOL JOIN yerleştirme çözüm çalışmıyor. Her satırda aşağıdaki gibi bir SQL gösterilecektir. LIKE yalnızca bir eşleşme içermiyorsa, eşleşen olmayan sonuçlar birleştirilmez, satır filtrelenmez.

SELECT mobdev_id, mobdev_type_bezeichnung, marke_name, tbl_user.name AS user_name, tbl_user.vorname AS user_vorname 
FROM tbl_mobdev 
LEFT JOIN tbl_mobdev_type ON mobdev_type_id = mobdev_type 
LEFT JOIN tbl_marke ON marke_id = mobdev_type_marke 
LEFT JOIN tbl_user ON tbl_user.id = mobdev_user 
AND CONCAT(tbl_user.name, ' ', tbl_user.vorname) LIKE '%%' 
WHERE CONCAT(tbl_marke.marke_name, ' ', tbl_mobdev_type.mobdev_type_bezeichnung) LIKE '%%' 
AND mobdev_aktiv = '1' 
ORDER BY marke_name ASC 
LIMIT 0 , 30 

Düzenleme2: SQL'in aşağıdaki şekilde ayarlanması, davranış değiştirilmedi.

SELECT mobdev_id, mobdev_type_bezeichnung, marke_name, tbl_user.name AS user_name, tbl_user.vorname AS user_vorname 
FROM tbl_mobdev 
LEFT JOIN tbl_mobdev_type ON mobdev_type_id = mobdev_type 
LEFT JOIN tbl_marke ON marke_id = mobdev_type_marke 
LEFT JOIN tbl_user ON tbl_user.id = mobdev_user 
AND CONCAT(tbl_user.name, ' ', tbl_user.vorname) LIKE '%G%' 
WHERE CONCAT(tbl_marke.marke_name, ' ', COALESCE(tbl_mobdev_type.mobdev_type_bezeichnung, '')) LIKE '%%' 
AND mobdev_aktiv = '1' 
ORDER BY marke_name ASC 
LIMIT 0 , 30 

$ _POST ['kullanıcı'] ile eşleşen satırlar hala filtrelenmiyor.

Bulanıklaştırılmış adlara sahip davranışların örnek resmini yükledim, soldaki resim herhangi bir filtre olmadan seç, sağdaki resim gerçek bir Kullanıcıyla (Bulanık, ancak mobdev_id ile aynı adı taşıyan bir addır) seç 3' . Gördüğünüz gibi

http://fs5.directupload.net/images/160404/tmdbyzws.png

, diğer beş satır onlar filtreyle eşleşen olmadığı için onları tamamen gitmiş istiyorum. katılır sadece olmadan, hala orada.

Edit3: Eh, şimdi ben yaptım ... ne yazık ki PHP kullanarak oldukça kirli bir şekilde. omeone bunun için daha iyi bir çözüm ile geliyor lütfen bana bildirin.

$query = " 
    SELECT 
     mobdev_id, 
     mobdev_type_bezeichnung, 
     marke_name, 
     tbl_user.name AS user_name, 
     tbl_user.vorname AS user_vorname 
    FROM 
     tbl_mobdev 
    LEFT JOIN 
     tbl_mobdev_type ON mobdev_type_id = mobdev_type 
    LEFT JOIN 
     tbl_marke ON marke_id = mobdev_type_marke 
    LEFT JOIN 
     tbl_user ON tbl_user.id = mobdev_user 
    WHERE 
     CONCAT(tbl_marke.marke_name,' ',tbl_mobdev_type.mobdev_type_bezeichnung) LIKE '%".$_POST['marke_name']."%' 
     "; 
if($_POST['user']) 
{ 
    $query .= " 
     AND 
      CONCAT(tbl_user.name,' ',tbl_user.vorname) LIKE '%".$_POST['user']."%' 
     "; 
} 
$query .= " 
    AND 
     mobdev_aktiv = '1' 
    ORDER BY 
     ".$_GET['sort']." ".$_GET['sort2']." 
    "; 
+0

"SOL ET" olduğunda, gerçek sağa katılma davranışını elde etmek için tüm sağdaki tablo koşullarını "ON" cümlelerine koyun. (WHERE’de, normal iç katılım sonucu elde edersiniz.) – jarlh

+1

Bu kodu asla kullanmayın !! Cehennem gibi bir SQL Enjeksiyon Kapısı var! Kullanıcı girişinizi nasıl aldığınıza ve doğruladığınıza dair önce yeniden düşünün, hazırlanmış ifadeleri kullanın !!! Ama asla bir sorguda bir POST veya GET Var kullanmayın! –

+0

Bu tavsiye için teşekkürler, ancak bu bir uluslararası koddur, bunu kullanan kişiler de kaynak kodunu doğrudan değiştirebilir. – Daniel

cevap

1

sorun

CONCAT(tbl_user.name,' ',tbl_user.vorname) LIKE '%".$_POST['user']."%' 

Kişisel SOL ana sorgusu o satırda bir değer olup olmadığını bağımsız dönmek sağlayacak tbl_user KATIL'ı uyumludur. Bununla birlikte, belirli bir WHERE yan tümcesi satırı etkin bir şekilde geçersiz kılar; tbl_user.name veya tbl_user.vorname boşsa, sonuç her zaman yanlış olur.

Böyle bir şey yapmam gerekirse, genellikle testi JOIN bildiriminin ON yan tümcesine koyarım. Bu şekilde, JOINed tablosunu var olduğu yerde filtreler, ancak olmadığı yerde sorun yaratmaz.

SELECT 
    md.mobdev_id, 
    mdt.mobdev_type_bezeichnung, 
    m.marke_name, 
    u.name AS user_name, 
    u.vorname AS user_vorname 
FROM 
    tbl_mobdev md 
     LEFT JOIN tbl_mobdev_type mdt 
      ON mdt.mobdev_type_id = md.mobdev_type 
     LEFT JOIN tbl_marke m 
      ON m.marke_id = mdt.mobdev_type_marke 
     LEFT JOIN tbl_user u 
      ON u.id = md.mobdev_user 
      AND CONCAT(u.name,' ',u.vorname) LIKE '%".$_POST['user']."%' 
WHERE 
    CONCAT(m.marke_name,' ',COALESCE(mdt.mobdev_type_bezeichnung,'')) 
      LIKE '%".$_POST['m.marke_name']."%' 
    AND md.mobdev_aktiv = '1' 
ORDER BY 
    ".$_GET['sort']." ".$_GET['sort2']." 

İki tarzında metin - -

  • Rene M. Yukarıda söylediği gibi bu kod bir SQL Enjeksiyon ise gerektiğinde tbl_user sağlamalıdır

    Örnek sorgu metni süzdüğü ama hiçbir şey belirtilen olmayacağım zaman Güvenlik açığı.Mevcut uygulamasından dolayı güvenli olabilir, ancak yine de onu açmayacağım; Bu uygulamayı veya kod parçasını alan ve daha sonra tam denetim yapmadan çevrimiçi olarak hareket ettirme şansı önemsiz değildir ve daha sonra bir sorunla karşılaşırsınız. Doğru şekilde yapın - SQL Injection güvenlik açıklarını kodda bırakmayın.

  • Lütfen tablo adlarınızı yazınız! Her tablo isminde her tablo isminin tam olarak yazıldığı sorgu, onu çok hantal hale getirir.
+0

Bu cevap için teşekkürler. Bu daha önce aklıma geldi, Bu çözümle ilgili sorun, filtrelenmesi gereken satırların filtrelenmemesi. Sadece $ _POST ['user'] içinde olandan bağımsız olarak her satırı gösterir. Sadece SOL JOIN çalışmasını durdurur. – Daniel