0

4 つの if/else 条件があります。4 つのうち 3 つだけが正常に機能します。条件の値は数値とテキストの組み合わせになります。これが問題の原因です。

これが問題の原因であるかどうかはわかりませんが、これを行う他の方法はありますか。

以下のコードでは、フォームから渡された 2 つの変数の値について言及しています。このシナリオでは、理想的には 3 番目の If 条件に進む必要がありますが、4 番目の If 条件に進みます。

私のphpコードの一部:

    echo "category :".$option." ".$suboption." "; //Values displayed for $option is 4 and $suboption is Nitrogen

    if ($option==0 && $suboption==0)
        $dc=mysql_query("SELECT Ac_code, Prod_desc, Capacity FROM RATEMASTER ORDER BY Ac_code, Prod_desc");
    else{
        if($option==0 && $suboption!=0)
            $dc=mysql_query("SELECT Ac_code, Prod_desc, Capacity FROM RATEMASTER WHERE Prod_desc='$suboption' ORDER BY Ac_code, Prod_desc");
        else{
           if($option!=0 && $suboption!=0)
               $dc=mysql_query("SELECT Ac_code, Prod_desc, Capacity FROM RATEMASTER WHERE Ac_code='$option' AND Prod_desc='$suboption' ORDER BY Ac_code, Prod_desc");
           else{
               if($option!=0 && $suboption==0)
                  $dc=mysql_query("SELECT Ac_code, Prod_desc, Capacity FROM RATEMASTER WHERE Ac_code='$option' ORDER BY Ac_code, Prod_desc");
           }
        }
    }
4

4 に答える 4

1

これは悪いコードです。

  1. if else 条件をあまり使用しないでください。条件に基づいて変数を定義し、switch case を使用するか、else if

  2. 文字列「窒素」を数値 0 と比較しないでください

参照: http://codepad.org/8a4qFgmf

.

   <?php
    $myVar = ('Nitrogen' == 0);
    var_dump($myVar);  // THIS IS TRUE
    ?>
于 2013-01-11T06:22:07.997 に答える
1

はい、コードをクリーンアップできますが、コードに対して、入力が数値とテキストであり、かつ 0 がオプションなしを表し、空の文字列がオプションなしを表す場合 (これは、あなたがしていることのようです)、条件を次のように置き換えます。

if ($option==0 && $suboption==0)
to
if ($empty(option) && empty($suboption))

同様に。

私はこのようなコードを書いたでしょう

$qry = 'SELECT Ac_code, Prod_desc, Capacity FROM RATEMASTER';
$where = ' WHERE ';
$post = ' ORDER BY Ac_code, Prod_desc';
$clause = '';
if(!empty($option))
{
    $clase = $where . " Ac_code='$option'";
    $where = " AND ";
}
if(!empty($suboption))
{
    $clase = $where . " Prod_desc='$suboption'";
}
于 2013-01-11T07:00:44.123 に答える
1

このようなことをもっとやってみませんか (ただし、これはユーザー定義データに対してはまだ安全ではありません (適切にエスケープする必要があります))。

<?php

function array_map_assoc( $callback , $array ){
    $r = array();
      foreach ($array as $key=>$value)
            $r[$key] = $callback($key,$value);
        return $r;
}

function funtimes($option, $suboption) {
  $query = "SELECT Ac_code, Prod_desc, Capacity FROM RATEMASTER%sORDER BY Ac_code, Prod_desc";
  $clause = array("Ac_code" => $option, "Prod_desc" => $suboption);
  $clause = array_filter($clause);
  $where = ' ';
  if (count($clause)) {
    $where = " WHERE " . implode(', ',array_map_assoc(function($k,$v){return "$k='$v'";},$clause)) . " ";
  }
  echo "For option=$option, suboption=$suboption\n";
  echo sprintf($query, $where);
  echo "\n\n";
}

funtimes(0, 0);
funtimes(1, 0);
funtimes(0, 1);
funtimes(1, 1);

出力

For option=0, suboption=0
SELECT Ac_code, Prod_desc, Capacity FROM RATEMASTER ORDER BY Ac_code, Prod_desc

For option=1, suboption=0
SELECT Ac_code, Prod_desc, Capacity FROM RATEMASTER WHERE Ac_code='1' ORDER BY Ac_code, Prod_desc

For option=0, suboption=1
SELECT Ac_code, Prod_desc, Capacity FROM RATEMASTER WHERE Prod_desc='1' ORDER BY Ac_code, Prod_desc

For option=1, suboption=1
SELECT Ac_code, Prod_desc, Capacity FROM RATEMASTER WHERE Ac_code='1', Prod_desc='1' ORDER BY Ac_code, Prod_desc

これで正しいクエリができたので、それを実行するだけです。

于 2013-01-11T06:37:49.273 に答える
0

私は DhruvPathak に同意しますが、コードを少しクリーンアップしたものを次に示します。1 つだけでなく 2 つのものを比較しているため、Switch は最適な選択ではない可能性があります。

//initialize variables
$option = $suboption = 0;

// get option values
//...your code here...

$sql = "SELECT Ac_code, Prod_desc, Capacity FROM RATEMASTER";
if ($option!=0 && $suboption==0) {
   $sql .= " WHERE Ac_code='$option'";
}
elseif($option==0 && $suboption!=0) {
   $sql .= " WHERE Prod_desc='$suboption'";
}
elseif($option!=0 && $suboption!=0) {
   $sql .= " WHERE Ac_code='$option' AND Prod_desc='$suboption'";
}
$sql .= " ORDER BY Ac_code, Prod_desc";
$dc = mysql_query($sql);

GET または POST 経由でオプションとサブオプションの値を取得している場合、これらのクエリは SQL インジェクション攻撃を受けやすいことに注意してください。データのフェッチを行うためのより良い方法もあります。

あなたのフィードバックに基づいて、これは機能しますか?

$sql = "SELECT Ac_code, Prod_desc, Capacity FROM RATEMASTER";
if ($option!=0) {
   $sql .= " WHERE Ac_code='$option'";
   if ( (int)$suboption >= 0 || strlen($suboption) > 1)
      $sql .= " AND Prod_desc='$suboption'";
}
elseif($option==0 && ((int)$suboption >= 0 || strlen($suboption) > 1) ) {
   $sql .= " WHERE Prod_desc='$suboption'";
}
$sql .= " ORDER BY Ac_code, Prod_desc";
于 2013-01-11T06:40:12.003 に答える