2016-08-12 14 views
1

クエリの価格帯を定義する変数は2つあります。私が解決しようとしている問題は、これらが設定されていない場合です。その場合、すべての行を表示したい(下境界がNULLの場合は1から、上境界がNULLの場合はmax(価格)まで)。MySQLi:入力が空の場合は価格帯を選択

私はifnullで試しましたが、成功しませんでした。

$priceFrom = $_POST['priceFrom']; 
$priceTo = $_POST['priceTo']; 

if(is_null($priceFrom) || is_null($priceTo)){ 
    $priceFrom = 0; 
    $priceTo = 0; 
} 
$mass = array(); 
foreach($data as $current){ 
$sql = "SELECT p.price, 
    p.type, 
    p.area, 
    p.floor, 
    p.construction, 
    p.id as propertyID, 
    CONCAT(u.name, ' ',u.family) as bname, 
    p.type as ptype, 
    n.name as neighborhoodName, 
    CONCAT(o.name,' ',o.surname,' ',o.family) as fullName 
    FROM `property` p 
    LEFT JOIN `neighbour` n ON p.neighbour = n.id 
    RIGHT JOIN `owners` o ON p.owner = o.id 
    LEFT JOIN users u ON p.broker = u.id 
    WHERE `neighbour`= '$current' 
    AND `price` BETWEEN ifnull('$priceFrom', '1') AND ifnull('$priceTo','2000000') 
    ";} 
+1

試してみてください。 – 1000111

+0

サンプルデータも役立ちます。 – Steven

+0

自分の投稿を編集してコードを追加してください。 – andrags

答えて

1

SQLインジェクション

^くださいGoogleのこと!あなたのコードはです。あなたのデータが盗まれたり、削除することができます...

あなたはtake proper countermeasures to SQL injectionになりmysqli_real_escape_string()

さらに良いことに、少なくとも、あなたの入力をサニタイズしてプリペアドステートメントを使用してクエリをパラメータ化する必要があります!


(下記のコードのように)私は最善のアプローチは、変数の値に基づいてクエリを変更することにより、ロジックを処理することだと思う:

$sql = "SELECT p.price, 
    p.type, 
    p.area, 
    p.floor, 
    p.construction, 
    p.id as propertyID, 
    CONCAT(u.name, ' ',u.family) as bname, 
    p.type as ptype, 
    n.name as neighborhoodName, 
    CONCAT(o.name,' ',o.surname,' ',o.family) as fullName 
    FROM `property` p 
    LEFT JOIN `neighbour` n ON p.neighbour = n.id 
    RIGHT JOIN `owners` o ON p.owner = o.id 
    LEFT JOIN users u ON p.broker = u.id 
    WHERE `neighbour`= :current "; //note: ending white space is recommended 

    //lower boundary clause -- if variable null - no restriction 
    if(!is_null($priceFrom){ 
     sql = sql . " AND `price` >= :priceFrom "; // note: whitespace at end and beginning recommended 
    } 

    //upper boundary -- better than to set it to an arbitrary "high" value 
    if(!is_null($priceTo)){ 
     sql = sql . " AND `price` <= :priceTo "; // note: whitespace at end and beginning recommended 
    } 

このアプローチは、任意のすることができます上限値:深刻なインフレ、異なる通貨、または突然コードを使用して住宅を売却し、200,000を超える価格の商品がある場合は、外出してコードを変更する必要はありませんそれは...

実行時にパラメータをバインドする必要があります当然のクエリngの:

$stmt = $dbConnection->prepare(sql); 
$stmt->bind_param('current', $current); 
if(!is_null($priceFrom)){ 
    $stmt->bind_param('priceFrom', $priceFrom); 
} 
if(!is_null($priceTo)){ 
    $stmt->bind_param('priceTo', $priceTo); 
} 
//execute and process in same way 
$stmt->execute(); 

することにも注意してください:あなたのコードからを、あなたがループ内でクエリを発行しているようです。それは悪い習慣です。 >コードの配列や他の場所からJOIN

  • を使用する - - >より良い要素
  • ため IN句を使用する上で、あなたのデータは、ループがDBから

    • を来る場合

      を使用すると、1つのクエリですべてのデータを取得できます。これは、コードと結果の整理と維持の両方で、一般的にはほとんどの場合、より優れたパフォーマンスを発揮します。

    +0

    ありがとう。これは私のために働いた。 – andrags

    関連する問題