2011-10-17 10 views
0

PHPを使用して次のMySQLクエリを実行し、$_GET()のすべての要素が空の文字列の場合は、volunteersテーブルのすべてのレコードが返されます。空のパラメータを使用してPHP検索スクリプトを実行すると、MySQLテーブル全体が返されます

$first = $_GET['FirstName']; 
$last = $_GET['LastName']; 
$middle = $_GET['MI']; 

$query = "SELECT * FROM volunteers WHERE 0=0"; 

if ($first){ 
    $query .= " AND first like '$first%'"; 
} 

if ($middle){ 
    $query .= " AND mi like '$middle%'"; 
} 

if ($last){ 
    $query .= " AND last like '$last%'"; 
} 

$result = mysql_query($query); 

空のパラメータは、結果が空$resultが返されるということで、このスクリプトに送信できるようにすることの最もエレガントな方法は何ですか?

+0

これはあなたの本当のソースコードである場合は、SQLインジェクションの重要な問題を抱えているの除去です。 –

答えて

1

行うには、そのクエリのために何もない場合は(潜在的に)高価なクエリを実行しているポイントはありません。代わりに無用語が検索されなかっされるのを防ぐために別のクエリを思い付くしようとしているのない用語がありませんのであれば、ただですべての検索を実行しないでください:あなたの現在のコードで

$where = ''; 
... add clauses ... 
if ($where !== '') { 
    $sql = "SELECT ... WHERE $where"; 
    ... do query ... 
} else { 
    die("You didn't enter any search terms"); 
} 
2

私の解決策:

$input = Array(
    'FirstName' => 'first', 
    'LastName' => 'last', 
    'MI'  => 'mi' 
); 

$where = Array(); 
foreach($input as $key => $column) { 
    $value = trim(mysql_escape_string($_GET[$key])); 
    if($value) $where[] = "`$column` like '$value%'"; 
} 
if(count($where)) { 
    $query = "SELECT * FROM volunteers WHERE ".join(" AND ", $where); 
    $result = mysql_query($query); 
} 
+0

'$ where'が空の場合、末尾の' WHERE'節がエラーを投げますか? – Josh

+0

@Chaseはいそれはエラーを返します – hex4

+0

@Chase fixed :) – Peter

0

を、すべてが空である場合には、 WHERE 0 = 0 SQLを取得します。これは、テーブル内のすべての行に対してTRUEです。

あなたがしなければならないのは、if文...

+0

ユーザが空のフィールドを提出する場合、 "if"文が必要です。私はむしろクライアント側でこの入力を検証しません。 – Keyslinger

+0

あなたは自分自身と矛盾しています: "空のパラメータをこのスクリプトに送ることを可能にする最もエレガントな方法は何ですか?" – hex4

関連する問題