2017-09-08 15 views
0

SQL問合せに複数のwhere句がある複数のif条件があります。複数のif文にSQL where節を使用するにはどうすればいいですか

if(empty($pincode) && !empty($data) && $flag==true) {  
       $dql = "SELECT s.instaffiliation,i.institutename,i.institutefeerange,i.instituterating, 
       a.addressline1,a.addressline2,i.instituterating, 
       i.instituteteachingtimings,s.instdescription,s.insttype, 
       s.insteligibilitycriteria,u.instlogo,u.instbrochure 
       FROM Edufaction\Bundle\EdufactionBundle\Entity\Institute i 
       INNER JOIN i.instsummary s 
       INNER JOIN i.address a 
       INNER JOIN i.insturl u 
       WHERE s.instaffiliation IN('')  
       ORDER BY i.instituterating";  
     } 
if(empty($pincode) && !empty($data) && $flag==false) { 
       $dql = "SELECT s.instaffiliation,i.institutename,i.institutefeerange,i.instituterating, 
       a.addressline1,a.addressline2,i.instituterating, 
       i.instituteteachingtimings,s.instdescription,s.insttype, 
       s.insteligibilitycriteria,u.instlogo,u.instbrochure 
       FROM Edufaction\Bundle\EdufactionBundle\Entity\Institute i 
       INNER JOIN i.instsummary s 
       INNER JOIN i.address a 
       INNER JOIN i.insturl u 
       WHERE s.instaffiliation IN($data)  
       ORDER BY i.instituterating";   
     } 
if(!empty($pincode) && !empty($data)) { 
       $dql = "SELECT s.instaffiliation,i.institutename,i.institutefeerange,i.instituterating, 
       a.addressline1,a.addressline2,i.instituterating, 
       i.instituteteachingtimings,s.instdescription,s.insttype, 
       s.insteligibilitycriteria,u.instlogo,u.instbrochure 
       FROM Edufaction\Bundle\EdufactionBundle\Entity\Institute i 
       INNER JOIN i.instsummary s 
       INNER JOIN i.address a 
       INNER JOIN i.insturl u 
       WHERE s.instaffiliation IN($data) 
       AND a.pincode IN($pincode)  
       ORDER BY i.instituterating";      
    }      
if(!empty($data) && !empty($reqfee) && $flag==false) { 
       $dql = "SELECT s.instaffiliation,i.institutename,i.institutefeerange,i.instituterating, 
       a.addressline1,a.addressline2,i.instituterating, 
       i.instituteteachingtimings,s.instdescription,s.insttype, 
       s.insteligibilitycriteria,u.instlogo,u.instbrochure 
       FROM Edufaction\Bundle\EdufactionBundle\Entity\Institute i 
       INNER JOIN i.instsummary s 
       INNER JOIN i.address a 
       INNER JOIN i.insturl u 
       WHERE s.instaffiliation IN($data) 
       AND i.institutefeerange IN($reqfee) 
       ORDER BY i.instituterating";   
     } 

ここで、複数のif条件に基づく条件は、複数の条件と同じです。 if条件を使用して複数のwhere句で一度に1つのクエリを適用するにはどうすればよいですか? 誰か助けてください。事前に感謝します

+0

多分私だけですが、私は本当にあなたが求めていることを理解するのに苦労しています - あなたは明確にする/言い換えることができますか? – Bananaapple

+1

あなたの構文は実際に正しく見えません。異なるテーブル間に結合 "ON"句はありません。また、次の結合表 "i.instSummary"、 "i.Address"などの基礎として "i"エイリアスを省略しているように見えます。また、MySQLとSQL Serverのタグもリストされています。それ。 – DRapp

+0

ここで@DRappクエリは正常に動作しています 'i'はinstituteテーブルのエイリアスを意味します。ここで私はWHERE if条件(if empty($ pincode)&&!empty($ data))s.instaffiliation IN($ data)else s.instaffiliation IN($ data)とa.pincode IN pincode) – somesh

答えて

1

あなたはコードを単純化しようとしているようです。そのような場合は、文字列の単純な連結で行うことはできますが、SQLインジェクションへのエクスポージャーは実際にはありません。フィールドと結合のプライマリリストはすべて同じで、順序はbyです。そのため、クエリの最初の部分をwhere句までの文字列に組み込みます。 NOW

$dql = "SELECT 
       s.instaffiliation, i.institutename, i.institutefeerange, 
       i.instituterating, a.addressline1, a.addressline2, 
       i.instituterating, i.instituteteachingtimings, s.instdescription, 
       s.insttype, s.insteligibilitycriteria, u.instlogo, u.instbrochure 
      FROM 
       Edufaction\Bundle\EdufactionBundle\Entity\Institute i 
       INNER JOIN i.instsummary s 
       INNER JOIN i.address a 
       INNER JOIN i.insturl u 
      WHERE "; 

、特定の適格条件ごとにどこの基準を追加

if(empty($pincode) && !empty($data) && $flag==true) 
{ 
    $dql = $dql + "s.instaffiliation IN('') "; 
} 
if(empty($pincode) && !empty($data) && $flag==false) 
{ 
    $dql = $dql + "s.instaffiliation IN($data)"; 
} 
if(!empty($pincode) && !empty($data)) 
{ 
    $dql = $dql + "s.instaffiliation IN($data) 
       AND a.pincode IN($pincode) "; 
} 
if(!empty($data) && !empty($reqfee) && $flag==false) 
{ 
    $dql = $dql + "s.instaffiliation IN($data) 
       AND i.institutefeerange IN($reqfee) "; 
} 

そして最後に、句

$dql = $dql + "ORDER BY i.instituterating";   

によってオーダーのタックは、あなたがしようとしているものに、この近いですあなたのコードを簡素化しますか?

+0

非常に良い解決策@DRapp私は同じコードを追加していますが、なぜエラーを表示しているのかわかりません。私は取得リソースを読み込めませんでした:サーバーは、500(内部サーバーエラー) のリストアページ:488エラー – somesh

+0

の状態で応答しました申し訳ありません申し訳ありません私は今、ソリューション@Militaru、DRappの作業精細感ありました – somesh

+0

また、同じクエリを複数回実行すると、そのビューを 'VIEW'にしてビューにフィルタリングすることができます。 –

1
$query_string = "SELECT rows FROM table INNER JOIN "; 

// Here you validate your variables and build your correct WHERE clause 

if(empty($pincode) && !empty($data) && $flag==true) { 
    $query_string .= " WHERE s.instaffiliation IN('') "; 
} 

// and so on for every case 

$query_string .= "ORDER BY row ASC "; 

// Now you will have a sigle correct query string 
関連する問題