2017-09-29 13 views
0

私はプログラミングのアマチュアで、私の小さなプロジェクトで作業していますが、自分のmysql出力用のフィルタを作成したいときに窮地に陥っています。PHPとMYSQLを使用したフィルタ

すべての検索入力フィールドを入力して送信すると、すべて正常にフィルタリングされた結果が表示されます。しかし、私は1つのフィールドを残して何も表示されません(他のコマンドのみ)AND条件を使用しています。 ORを使用して空白のままにしておくと、必須フィールドに何が埋め込まれているかを気にせずにすべての結果が表示されます。

フィールドのいずれかが空の場合でも結果を表示する方法はありますか?私はここでstackoverflowで別のポストからコードを再生しようとしましたが、私は本当にあまり経験していないと私のコードの中でこれを使用する方法を見つけることができないように運がまだありません。ここでは以下

if(isset($_POST["profilename"]) && $_POST["profilename"] != "") 
$sql .= " AND profilename = '". $_POST["profilename"] ."'"; 

あなたが見ていると私はフィルタリングが働いてしまうので、編集ができるかを提案することができれば、私のコードです。

<select class="form-control" id="Select1" name="departure"> 
<select class="form-control" id="Select2" name="destination"> 
<select class="form-control" id="Select3" name="layover"> 

...

<?php 
include_once("connect.php"); 

if (isset($_GET['submit'])) { 
$departure = mysqli_real_escape_string($connection, $_GET['departure']); 
$destination = mysqli_real_escape_string($connection, $_GET['destination']); 
$layover = mysqli_real_escape_string($connection, $_GET['layover']); 



$result = mysqli_query($connection, "SELECT * FROM crud 
WHERE departure LIKE '$departure%' 
AND kam LIKE '$kam' 
AND layover LIKE '$layover' 
ORDER BY id DESC"); 



if($make = mysqli_num_rows($result) > 0){ 
while($r = mysqli_fetch_assoc($result)){ 
echo '<div style="display:block;"'.$r['departure'].'</div>'; 
echo '<div style="display:block;"'.$r['kam'].'</div>'; 
echo '<div style="display:block;"'.$r['layover'].'</div>'; 
//following code.. 
} 
}else{ 
echo'<h4>No match found!</h4>'; 

print ($make); 
} 
mysqli_free_result($result); 
mysqli_close($connection); 
} 

?> 

例えば:DestinationDepartureを濾過し、Layover空のままに - > ANY Layoverと希望Departure and Destinationの結果を返す必要があります。 または第2の例:LayoverDestinationを入力しますが、Departureを空白にすると、Destination and Layoverの検索がANY Departureとなります。

可能であれば、私のコードと可能であればどうすればいいのか教えてください。 本当にありがとう!このような

答えて

0

それぞれのAND条件のそれぞれで、OR条件で各入力を空の文字列と照合することができます。

"SELECT * FROM crud 
WHERE ('$departure' = '' OR departure LIKE '$departure%') 
AND ('$kam' = '' OR kam LIKE '$kam') 
AND ('$layover' = '' OR layover LIKE '$layover') 
ORDER BY id DESC" 

このように、入力パラメータのいずれかが指定されない場合、状態の対応する部分は、例えば、と解釈され、('' = '' OR departure LIKE '$departure%')''は関係なく、常に''に等しいので、すべての行については真と評価しますLIKE比較の

いくつかのワイルドカード文字を使用しないで、LIKEの比較は基本的に=のように動作します(例:kam LIKE '$kam'kam = '$kam'と同じ行に一致します)。ですから、単に=を使用するか、またはそれらを有効にするためにいくつかのワイルドカードを追加してください。

第2に、このようにSQLに値を連結する代わりにprepared statementを使用することを検討してください。連結アプローチは、コードをSQLインジェクションやさまざまな迷惑なエラー(たとえ文字列をエスケープしても)に対して脆弱にします。

+0

完璧な、この作品とソリューションは非常に簡単でした! :)私はSQLインジェクションに脆弱ではないので、私のコードで何を変えるべきかについて具体的な助言もありますか?私はそれを防ぐために私が何を変えることができるかわからない。どうもありがとう! –

0

何か:

$result = mysqli_query($connection, "SELECT * FROM crud 
WHERE (departure LIKE '$departure%' OR departure is null) 
AND kam LIKE '$kam' 
AND (layover LIKE '$layover' OR departure is null) 
ORDER BY id DESC"); 
0

のはさておき、「ユーザの入力を使用してクエリを構築いけない」を入れてみましょう。

このパスに移動する場合は、条件を使用してクエリを段階的に作成できます。

$query = "SELECT * FROM crud WHERE "; 
if (!empty($departure)) { 
    $query .= "departure LIKE '$departure%' AND "; 
} 
if (!empty($destination)) { 
    $query .= "destination LIKE '$destination%' AND "; 
} 
if (!empty($layover)) { 
    $query .= "layover LIKE '$layover' AND "; 
} 
$query .= "1 ORDER BY id DESC"; 

あなたは$のクエリ文字列にいくつかの選択肢となってしまいます。

NOTHING SELECTED: 
SELECT * FROM crud WHERE 1 ORDER BY id DESC 

SOMETHING SELECTED: 
SELECT * FROM crud WHERE departure LIKE '$departure%' AND layover LIKE '$layover' AND 1 ORDER BY id DESC 

ALL SELECTED: 
SELECT * FROM crud WHERE departure LIKE '$departure%' AND destination LIKE '$destination%' AND layover LIKE '$layover' AND 1 ORDER BY id DESC 

これは、それをカバーする必要があります。 良い日をお過ごしください

関連する問題