欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

PHP if.. elseif...else 问题

程序员文章站 2022-03-07 22:28:13
...
本帖最后由 xytianshiwx 于 2013-12-08 10:09:44 编辑
    |>|=)/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、>、"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|>|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("/(>|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!");     }   }