0

私の URL は、「inventory.php?sorting=1」などです。ページは正常に読み込まれますが、情報が正しく表示されません。

mysql_connect("localhost","user","pass"); 
mysql_select_db("database"); 

if ($sorting == 1){
$result = mysql_query("select * from vehicles ORDER BY year DSC");
}
elseif ($sorting == 2){
$result = mysql_query("select * from vehicles ORDER BY make DSC");
}
elseif ($sorting == 3){
$result = mysql_query("select * from vehicles ORDER BY miles DSC");
}
elseif ($sorting == 4){
$result = mysql_query("select * from vehicles ORDER BY downpay DSC");
}
elseif ($sorting == 5){
$result = mysql_query("select * from vehicles ORDER BY pricepay DSC");
}
elseif ($sorting == 6){
$result = mysql_query("select * from vehicles ORDER BY pricecash DSC");
}
else {
$result = mysql_query("select * from vehicles");
}

while($r=mysql_fetch_array($result))
4

9 に答える 9

8

フィールド名をGET変数として使用しないのはなぜですか?

$sortField = $_GET['sorting'];
// Ensure we don't get any SQL injection:
$validFields = array('year', 'make', 'miles' ... 'pricecash');


$sql = "select * from vehicles";

if(in_array($sortField, $validFields)){
    $sql .= ' ORDER BY ' . $sortField .' DESC';
}

mysql_query($sql);

次に、inventory.php?sorting=yearなどを使用してページにアクセスします。

これにより、URLが読みやすく予測可能になり、新しいスイッチケースを作成しなくても、配列に追加するだけで新しいフィールドをサポートできるようになります。

于 2009-12-10T10:07:05.070 に答える
5

$sortingと交換する必要があります$_GET["sorting"]

だけでなく:

switchステートメントを使用する方が良い考えではないでしょうか?

switch($_GET["sorting"]{
    case 1:
    $result = mysql_query("select * from vehicles ORDER BY year DSC");
    break;
case 2:

于 2009-12-10T09:56:49.983 に答える
4

簡単な答え: に置き換える$sortingか、コードの先頭に$_GET["sorting"]追加します。$sorting = $_GET['sorting'];

長い回答: 昔、register_globalsを使用して、URL パラメーターを自動的に変数として表示していました。これは多くのセキュリティ上の問題を引き起こすため (上記のリンクには例が含まれています)、最終的にデフォルト (PHP 4.2.0) でオフになりました。PHP 6 では、このオプションはなくなりました。$_GETしたがって、またはを介し​​て URL GET パラメータに明示的にアクセスする必要があります$_REQUEST

別の方法として、 import_request_variablesコマンドを使用して、URL パラメーターをローカル変数に明示的にインポートすることもできます。

于 2009-12-10T09:56:32.900 に答える
3

そしてそれをより良くするために、あなたはこれをすることができます:

$sortBy = '';
switch($_GET["sorting"]{
  case 1:
    $sortBy = 'year';
    break;
  case 2:
    $sortBy = 'make';
    break;
  //...
}  

if(!empty($sortBy)) {
  $result = mysql_query('select * from vehicles ORDER BY ' . $sortBy . ' DSC');
}
else {
  $result = mysql_query('select * from vehicles');
}

このように、いつか変更する必要がある場合は、ある時点でクエリを変更するだけで済みます。

于 2009-12-10T10:11:18.260 に答える
2

$_GET 配列から $sorting 変数を取得する必要があります。また、次のような switch ステートメントとして書き直します。

switch($_GET['sorting'])
{
  case 1:
    $result = mysql_query("select * from vehicles ORDER BY year DSC");
  brek;

  case 2:
    $result = mysql_query("select * from vehicles ORDER BY make DSC");
  break;

  ...

  default:
    $result = mysql_query("select * from vehicles");
  break;
}
于 2009-12-10T10:00:25.163 に答える
2

いくつかありますか

$sorting = $_GET['sorting'];

あなたのコードのどこかに?その値は自動的には取得されません。

于 2009-12-10T09:57:17.320 に答える
2

コードの先頭にこの行を追加します。

$sorting = $_REQUEST['sorting'];
于 2009-12-10T09:57:37.143 に答える
2

使用しない理由switch:

switch ($sorting) {
    case 1:
        $result = mysql_query("select * from vehicles ORDER BY year DSC");
        break;
    case 2:
        $result = mysql_query("select * from vehicles ORDER BY make DSC");
        break;
    // ...
    default:
        $result = mysql_query("select * from vehicles");
        break;
}

また、次のもの$sortingが割り当てられていることを確認してください。

$sorting = $_GET['sorting']; // Place somewhere before the switch
于 2009-12-10T09:59:03.030 に答える
2

または のいずれかで入ることができる場合は$_GET['sorting']orを使用できますが、これを行わないのはなぜですか?$_REQUEST['sorting']getpost

$query = "SELECT * FROM `vehicles`";

$sort_values = array( 1 => 'year', 'make', 'miles', 'downpay', 'pricepay', 'pricecash' );
$sort_number = $_GET['sorting'];
if( $sort_number <= count($sort_values) ) {
    $query .= " ORDER BY `{$sort_values[ $sort_number ]}` DESC";
}

$result = mysql_query($query);

1 =>配列の一部は、クエリのリストに 1 インデックスを付けたためであることに注意してください。if ステートメント
の部分の理由もその理由です。インデックスを 0 にした場合は、 を使用するだけです。<=<

まだそうは思えないかもしれませんが、書くコードを減らす方法を試してみる価値があることがすぐにわかるでしょう。配列を使用すると、コードをコピーして貼り付ける$result = mysql_query(...);必要がなくなり (繰り返し .

データベースから列名を直接取得して、このコードに二度と触れないようにすることもできます。

于 2009-12-10T11:03:20.833 に答える