PHP if-then-else语句不起作用

时间:2009-12-10 09:54:50

标签: php superglobals

我的网址如下:“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))

9 个答案:

答案 0 :(得分: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更具可读性和可预测性,并且意味着您可以通过将新字段添加到阵列来支持新字段,而无需编写新的切换案例。

答案 1 :(得分:5)

您需要将$sorting替换为$_GET["sorting"]

但是,还有:

使用switch语句会不是更好的主意?

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

答案 2 :(得分:4)

简短回答:将$sorting替换为$_GET["sorting"],或将$sorting = $_GET['sorting'];添加到代码顶部。

长答案:很久以前,register_globals用于自动将网址参数显示为变量。这导致了很多安全问题(上面的链接包含一个例子),所以它最终默认关闭(PHP 4.2.0)。在PHP 6中,此选项不再存在。因此,您需要通过$_GET$_REQUEST明确访问网址GET参数。

作为替代方法,您可以使用import_request_variables命令将URL参数显式导入局部变量。

答案 3 :(得分: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');
}

这样,如果有一天你必须改变它,你只需要在一个点上改变你的查询。

答案 4 :(得分:2)

是否有一些

$sorting = $_GET['sorting'];

代码中的某个地方?它不会自动获得它的价值。

答案 5 :(得分:2)

在代码的开头添加此行。

$sorting = $_REQUEST['sorting'];

答案 6 :(得分: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

答案 7 :(得分:2)

您需要从$ _GET数组中获取$ sorting变量。我也会把它重写为这样的开关语句:

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;
}

答案 8 :(得分:2)

如果$_GET['sorting']$_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 =>,但为什么不这样做呢?

<=

请注意,数组的<部分是因为您为查询列表编制索引 if语句的$result = mysql_query(...);部分的原因也是出于这个原因 - 如果你对其进行0索引,你只需使用{{1}}。

它可能看起来还不像,但你很快就会发现尝试找到编写更少代码的方法是值得的。使用数组意味着您不必复制/粘贴任何代码(重复编写{{1}}等),如果您需要显示更多信息,那么向表中添加新列几乎毫不费力。

甚至可以直接从数据库中获取列名,避免再次触及此代码。