Home  >  Article  >  Backend Development  >  PHP if.. elseif...else 问题

PHP if.. elseif...else 问题

WBOY
WBOYOriginal
2016-06-23 14:39:071429browse

本帖最后由 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("/(>|>|=)/i", $param)){//
分支能进入

Array
(
    [where] => name>10
)
为什么  $param 要赋值给 $sql_param_list["field"] ?
你的 $param 是 "name>10" 里面并没有“,”
只有 if(preg_match("/\b(".$where_field.")\b/i", $param)||preg_match("/(>|>|=)/i", $param)){//
分支能进入

代码修改过了 $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 指令的文法范式
你应该逐次读取以空格符分隔的子串,判断它属于哪个语法成分
并且 SQL 指令的每一节都是有特定标识的

if(false!==strpos($param,",")){//判断是否存在“,”
那就更不对了,单个名字不会有“,”的

按照 SQL 指令的文法范式
你应该逐次读取以空格符分隔的子串,判断它属于哪个语法成分
并且 SQL 指令的每一节都是有特定标识的


恩 规则是判断是否有",",有直接定义为field 并给每个键值加“`”。没有判断包含where的,之后其他sql语句关键字。单个的字符串直接给field 并加“`”。

练习中,如果过有好的建议,请联系我,谢谢



 }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!");     }   }

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Previous article:php/gtk 如何安装Next article:PHP+MYSQL乱码问题