2

mysql データベースからの結果をフィルタリングするために、この php コードを作成しました。それは非常にうまく機能しますが、これが望ましい結果を達成するための最も効率的な方法 (または言語の適切な使用) ではないことは確かです。私はコードを書くのが「上手」になるように最善を尽くしています。

$filter = "";

if (isset($_POST['submit']))
{
$aircraft_reg = "";
$prefix = "";
$part_number = "";
$flight_control = "";

if(!empty($_POST['aircraft_reg']))
    {
    $aircraft_reg = "aircraft_reg = '" . $_POST['aircraft_reg'] . "'";
    }
if(!empty($_POST['prefix']))
    {
    $prefix = "prefix = '" . $_POST['prefix'] . "'";
    }
if(!empty($_POST['part_number']))
    {
    $part_number = "part_number = '" . $_POST['part_number'] . "'";
    }
if(!empty($_POST['flight_control']))
    {
    $flight_control = "flight_control = '" . $_POST['flight_control'] . "'";
    }   
if ($aircraft_reg != "" && ($prefix != "" || $part_number != "" || $flight_control != ""))
    {
    $a = " AND ";
    }
else
    {
    $a = "";
    }
if ($prefix != "" && ($part_number != "" || $flight_control != ""))
    {
    $b = " AND ";
    }
else
    {
    $b = "";
    }
if ($part_number != "" && $flight_control != "")
    {
    $c = " AND ";
    }
else
    {
    $c = "";
    }
if ($aircraft_reg != "" || $prefix != "" || $part_number != "" || $flight_control != "")
    {
    $filter = "WHERE " . $aircraft_reg . $a . $prefix . $b . $part_number . $c . $flight_control;
    }
}

    $result = mysql_query("SELECT * FROM installed $filter ORDER BY aircraft_reg , part_number, date_installed ASC");
4

5 に答える 5

2

次のパターンに従うだけです。

$result = mysql_query("
        SELECT * 
        FROM installed 
        WHERE  
            ".($_POST['aircraft_reg']?"aircraft_reg=" .mysql_real_escape_string($_POST['aircraft_reg']):"1" )." AND     
            ...
        ORDER BY aircraft_reg , part_number, date_installed ASC");

別の選択肢:

foreach($_POST as $key => $val)
    if($key!="submit" and $val)
        $filters[] = "$key='".mysql_real_escape_string($val)."' ";


$result = mysql_query("
    SELECT * 
    FROM installed 
    ".(isset($filters)?"WHERE ".implode("AND ",$filters):"")."      
    ORDER BY aircraft_reg , part_number, date_installed ASC");
于 2012-10-09T12:43:38.810 に答える
0

ActiveRecordなどの定評のあるものを使用することをお勧めします。

http://www.phpactiverecord.org/

車輪の再発明をする必要はありません(これが純粋に学習のためである場合を除いて、その場合は続けてください!)

...これが純粋に学習用である場合は、使用している$_POSTなどのREQUESTデータをmysql_real_escape_stringなどでエスケープすることを忘れないでください。

于 2012-10-09T12:28:49.600 に答える
0

素早い:

  1. array_key_existsを使用して、何かが入っているかどうかを確認します$_POST
  2. $_POSTSQLに直接値を入れないで、エスケープしてください。あなたがグーグルするときのより多くの情報SQL injection attack
  3. 最初に入力を検証/サニタイズしてから、一度にクエリを作成します。

    if (array_key_exists("partnumber", $_POST) {
         $part_number = validate_partnumber($_POST['partnumber']);
         $part_number = escape_for_db($part_number);
    }
    $q = ".... WHERE part_number='$part_number' ....";
    

それ以外は、それほど悪くはありません。

于 2012-10-09T12:29:48.067 に答える
0

条件演算子は より時間の複雑さが少ないため、これを試すことができますif()-else()。さらに、変数の使用が少ないほどメモリ割り当てが少なくなるため、使用したものよりも高速で最適化されます。別のこととして、mysql_real_escape_string()SQL インジェクションの防止を使用します。

$filter = "";
if (isset($_POST['submit']))
{
    $condition_count = 0;

    if(!empty($_POST['aircraft_reg']))
    {
        $filter = " WHERE aircraft_reg = '" . mysql_real_escape_string($_POST['aircraft_reg']) . "'";
        $condition_count++;
    }
    if(!empty($_POST['prefix']))
    {
        $condition_count > 0?$filter .= " AND prefix = '" . mysql_real_escape_string($_POST['prefix']) . "'":$filter .= " WHERE prefix = '" . mysql_real_escape_string($_POST['prefix']) . "'";
        $condition_count++;
    }
    if(!empty($_POST['part_number']))
    {
        $condition_count > 0?$filter .= " AND part_number = '" . mysql_real_escape_string($_POST['part_number']) . "'":$filter .= " WHERE part_number = '" . mysql_real_escape_string($_POST['part_number']) . "'";
        $condition_count++;
    }
    if(!empty($_POST['flight_control']))
    {
        $condition_count > 0?$filter .= " AND flight_control = '" . mysql_real_escape_string($_POST['flight_control']) . "'":$filter .= " WHERE flight_control = '" . mysql_real_escape_string($_POST['flight_control']) . "'";
        $condition_count++;
    }
}

$result = mysql_query("SELECT * FROM installed ".$filter." ORDER BY aircraft_reg , part_number, date_installed ASC");
于 2012-10-09T12:44:06.110 に答える
0
if (!isset($_POST['submit'])) exit;

$aircraft_reg = $_POST['aircraft_reg'];
$prefix = $_POST['prefix'];
$part_number = $_POST['part_number'];
$flight_control = $_POST['flight_control'];

$result = mysql_query("
    SELECT * 
    FROM installed 
    where 
        aircraft_reg = if('$aircraft_reg' = '', aircraft_reg, '$aircraft_reg')
        and
        prefix = if('$prefix' = '', prefix, '$prefix')
        and
        part_number = if('$part_number' = '', part_number, '$part_number')
        and
        flight_control = if('$flight_control' = '', flight_control, '$flight_control')
    ORDER BY aircraft_reg , part_number, date_installed
    ");

これが本当の場合は、ユーザー入力をサニタイズすることを忘れないでください。そうしないと、簡単に SQL インジェクションの犠牲者になります。

于 2012-10-09T12:57:57.397 に答える