繁体   English   中英

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

[英]PHP if-then-else statement not working

我的网址是诸如“ 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))

为什么不只使用字段名称作为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);

然后使用venture.php?sorting = year等访问页面。

这使URL更具可读性,易懂性,并且意味着您只需将新字段添加到数组中即可支持新字段,而无需编写新的切换案例。

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

但是也:

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

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

等等

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

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

或者,您可以使用import_request_variables命令将URL参数显式导入到局部变量中。

为了使它更好,您可以执行以下操作:

$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');
}

这样,如果某天必须更改查询,则只需要在某一点更改它即可。

有一些

$sorting = $_GET['sorting'];

您代码中的某处? 它不会自动获得其价值。

在代码开头添加此行。

$sorting = $_REQUEST['sorting'];

为什么不使用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

您需要从$ _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;
}

如果可以通过getpost $_REQUEST['sorting'] $_GET['sorting']$_REQUEST['sorting'] ,则可以使用它,但为什么不这样做呢?

$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(...);等),并且在需要显示的情况下向表中添加新列几乎毫不费力。更多信息。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM