0

ユーザーが指定した2つの日付の間に特定の日付を入れるために使用したphpのスニペットがあります

if($start_date!="" && $end_date!=""){
$query[]="submit_time BETWEEN '$start_date' and '$end_date'";
}

文字列が処理された後、それが機能するのはなぜですか。ただし、これを行うための例外的な方法は次のとおりです。

if($start_date!="" && $end_date!=""){
$query[]="submit_time BETWEEN '".$start_date."' and '".$end_date."'";
}

両方の方法が機能する理由と、どちらが最適かを説明できる人はいますか? 私は今日、最初の方法でそれを行うべきだと言われましたが、私は常に文字列から変数を分離しています。何か案は?

またはおそらくより良い例:

$sql="SELECT * FROM $tbl_name WHERE submit_time BETWEEN 
'$start_date' and '$end_date'";

VS

$sql="SELECT * FROM $tbl_name WHERE submit_time BETWEEN 
'".$start_date."' and '".$end_date."'";
4

4 に答える 4

4

ナイターが正しい方法です。それが唯一のチェックである場合は、SQL インジェクションの対象になります。

準備済みステートメントを使用する必要があります。

http://php.net/manual/en/pdo.prepare.php

一般的な文字列補間について話しているだけの場合、私sprintfはそれがはるかに読みやすく、型変換を行うと思うので、私ははるかに好みます:

$name = 'John Doe';
sprintf("Hello %s - How are you today", $name);

いかなる場合でも、ユーザーが指定した開始日と終了日を SQL で使用しないでください。

于 2013-01-09T20:45:15.070 に答える
3

実際には...これらのバージョンのどれも本当に最良の解決策ではありません。プリペアドステートメントを使用し、このクエリのパラメータとして開始日と終了日を指定した方がはるかに優れています。PDOを使用する場合、次のようになります。

$stmt = $db->prepare('SELECT * FROM somewhere WHERE submit_time BETWEEN :startdate AND :enddate');
$stmt->bindParam(':startdate', $start_date);
$stmt->bindParam(':enddate', $end_date);
$stmt->execute();

このようにして、クエリパーサーが変数にSQL構文が含まれているかどうかを評価する必要がないため、クエリを混乱させることがなく、実行も高速化されます。

あなたの質問の残りに答えるために:それはきれいなコードを書くことの問題です。文字列への変数の埋め込みは、構文の強調表示を提供するエディターで簡単にわかるように、ちょっと面倒に見えます。文字列に追加する配列要素がある場合は、特に厄介になります。

于 2013-01-09T20:48:23.777 に答える
0

それらの間に文字通り違いはありません、それはただ個人的な好みです。実際にはプリペアドステートメント(PDO)を使用する必要がありますが、少なくとも変数をmysql_real_escape_string()でラップして、より安全にします。しかし、PDOはその方法です。

$start_date = mysql_real_escape_string($start_date);
$end_date = mysql_real_escape_string($end_date);

$sql="SELECT * FROM $tbl_name WHERE submit_time BETWEEN 
'$start_date' and '$end_date'";
于 2013-01-09T20:48:52.167 に答える
0

私は常に最初の方法を使用してきましたが、それはあなたのコーディングとは関係なく、選択の問題だと思います. しかし、それは私の意見です..待って他の人に会いましょう

于 2013-01-09T20:44:56.543 に答える