0

我的网址是这样的:“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 更具可读性、可预测性,并且意味着您可以通过将新字段添加到数组中来支持它们,而无需编写新的 switch case。

于 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

有没有一些

$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 变量。我还将它重写为这样的 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

您可以使用$_GET['sorting']or$_REQUEST['sorting']如果它可以通过getor进入post,但为什么不这样做呢?

$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 回答