PHP if.. elseif...else の問題

WBOY
WBOYオリジナル
2016-06-23 14:39:071455ブラウズ

この投稿は xytianshiwx によって最終編集されました: 2013-12-08 10:09:44

    <?php $field_func="COUNT|AVG|FIRST|LAST|MAX|MIN|SUM|TOP"; $where_field="Where|or|xor|and|in"; $param="name"; $sql_param_list=array(); if(false!==strpos($param,",")){//判断是否存在“,”     	    $sql_param_list["field"] = $param;     	}else{			 if(preg_match("/\b(".strtolower($field_func).")\b\((\*|[a-zA-Z_`])+\)/i", $param)){			     	       $sql_param_list["field"] =$param;			     	    }elseif(preg_match("/\b(".$where_field.")\b/i", $param)||preg_match("/(>|>|=)/i", $param)){//判断where			     	    	$sql_param_list["where"] =$param;			     	    				     	    }elseif(preg_match("/\b(order|limit|group|)\b/i", $param,$param_name)){//判断order|limit|group			     	         switch ($param_name[0]){			     	           case "order" : $sql_param_list["order"] =$param;			     	           break;			     	           case "limit" : $sql_param_list["limit"] =$param;			     	           break;			     	           case "group" : $sql_param_list["group"] =$param;			     	           break;			     	          			     	         }			     	    }else{			     	       $sql_param_list["field"] =$param;			     	    }     	}	         	print_r($sql_param_list);


$param には $sql_param_list["field"] の値が割り当てられていませんか? ?
論理的な間違いですか、それとも何かアドバイスをお願いします。 ! !

ディスカッションへの返信 (解決策)

Array
(
[where] => name>10
)
$param を $sql_param_list["field"] に割り当てる必要があるのはなぜですか?
$param は "name>10" で、その中に "," はありません
あるのは if(preg_match("/b(".$where_field.")b/i", $param)||preg_match( "/(> ;|> フィールド"]?
$param は "name>10" で、その中に "," はありません

あるのは if(preg_match("/b(".$where_field.")b/i", $param)||preg_match( "/(> ;|>|=)/i", $param)){//

ブランチは
を入力できます
コードは、主に 1 つの文字または文字列が出現する場合に $param="name" に変更されました。 $sql_param_list[ "field"] に値 $param を直接与える

 }elseif(preg_match("/\b(order|limit|group|)\b/i", $param,$param_name)){//判断order|limit|group==> "/\b(order|limit|group)\b/i",  //正则多了个或


if(false!==strpos($param,",")){//「,」があるかどうかを判断する
つまり偶数さらに間違っているのは、単一の名前は存在しません ","

SQL コマンドの文法パラダイムによれば、

スペースで区切られた部分文字列を 1 つずつ読んで、それがどの文法コンポーネントに属しているかを判断する必要があります

そして、SQL の各セクションコマンドには特定の識別子があります


if (false!==strpos($param,",")){//「,」があるかどうかを判断します
それはさらに間違っており、単一の名前には「,」は含まれません

SQL 命令の文法パラダイムによると
スペースで区切られた部分文字列を 1 つずつ読み取って、それがどの文法コンポーネントに属しているかを判断する必要があります
SQL 命令の各セクションには特定の識別子があります


規則は次のとおりですフィールドとして直接定義されている「,」があるかどうかを判断し、各キー値に「`」を追加します。 where およびその他の SQL ステートメントのキーワードを含む判定はありません。単一の文字列がフィールドに直接与えられ、「`」が追加されます。

練習中に、何か良い提案があれば、私に連絡してください、ありがとうございます



 }elseif(preg_match("/\b(order|limit|group|)\b/i", $param,$param_name)){//判断order|limit|group==> "/\b(order|limit|group)\b/i",  //正则多了个或


ありがとうございます 正規表現を読んだだけなので、まだ慣れていません

/**    * 参数设定    *     *      (1)参数为字符串    *          1、带有“,”的如“id,name”或不带逗号的单个字符如“name”    *            定义为field参数。    *          2、带有\b(count|avg)\b\((\*|[a-zA-Z_])+\)等sql    *          2、字符串中带有where、in、>、<、=、like、or、and 定义为where.    *          3、字符串中带有 order by定义为order。    *          4、字符串中带有 limit 定义为limit    *       (2)参数为数组    *            一维数组:如array("name","id"),定义为field    *                   如array("name"=>"admin","id"="1")键名定义为where。    * @param string/array $param     */   protected function setSqlParam($param){            //P($param);     $field_func="COUNT|AVG|FIRST|LAST|MAX|MIN|SUM|TOP";     $where_field="Where|>|<|=|or|xor|and|in";     if(is_string($param)){//判断是否为字符串     	if('*'==$param){     	   $this->sql_param_list["field"] = '*';     	}elseif(false!==strpos($param,",")){//判断是否存在“,”     	   $field = explode(",", $param);     	   array_walk($field,array($this,"setKey"));//加反引号     	   $field = implode(",",$field);     	   $this->sql_param_list["field"] = $field;     	}else{     		//P($param);     	    if(preg_match("/\b(".strtolower($field_func).")\b\((\*|[a-zA-Z_`])+\)/i", $param)){     	    	$this->sql_param_list["field"] =$param;     	    	//break;     	    }elseif(preg_match("/(".$where_field.")/i", $param)||preg_match("/(>|<|=)/i", $param)){//判断where     	    	$this->sql_param_list["where"] =$this->safe($param);     	    	//break;     	    }elseif(preg_match("/\b(order|limit|group)\b/i", $param,$param_name)){//判断order|limit|group     	         switch ($param_name[0]){     	           case "order" : $this->sql_param_list["order"] =$param;     	           break;     	           case "limit" : $this->sql_param_list["limit"] =$param;     	           break;     	           case "group" : $this->sql_param_list["group"] =$param;     	           break;     	                	         }     	    }else{     	    	P($param);     	       $this->sql_param_list["field"] =$param;     	    }     	    //P($param);     	}     }elseif(is_array($param)){//判断是否为数组     	 if(count($param)==1){     	 	$key=array_keys($param);     	 	$values=array_values($param);     	 	$fields = $key[0];     	    if(is_integer($fields)){     	    	if(preg_match("/(".$where_field.")/i", $values[0])){     	    	   $this->sql_param_list["where"]=$values[0];     	    	}else{     	    	  $this->sql_param_list["field"]=self::setKey($values[0]);     	    	}     	    }else{     	    	  $this->sql_param_list["where"]=self::setKey($fields)."={$param[$key[0]]}";     	    }            //P($param);     	 }else{     	    P($param);     	 }     }else{//非法输入        exit("ERROR!");     }   }

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。