PHP if.. elseif...else 问题 本帖最后由 xytianshiwx 于 2013-12-08 10:09:44 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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 指令的每一节都是有特定标识的 恩 规则是判断是否有",",有直接定义为field 并给每个键值加“`”。没有判断包含where的,之后其他sql语句关键字。单个的字符串直接给field 并加“`”。练习中,如果过有好的建议,请联系我,谢谢 /** * 参数设定 * * (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!"); } } PHP串口密码键盘开发安全 php上传视频文件怎么实现 SMTP邮件操作类 发有邮件 中文内容是乱码 谢谢大家帮忙看看吧!谢谢了!(菜鸟问题!) 请大家帮忙看一下,为什么都执行完毕了,还报错啊? fopen和file_get_contents用的是什么端口? 急购php+mysql的OA办公自动化系统 新闻发布系统的最终问题,请看 如何用脚本语言做一个守护程序,让它在apache启动后就运行? 前台页面数据传到PHP后台处理再传回来怎样显示 彭和平垃圾回收机制 求PHP编程经典书籍
(
[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
==> "/\b(order|limit|group)\b/i", //正则多了个或
那就更不对了,单个名字不会有“,”的按照 SQL 指令的文法范式
你应该逐次读取以空格符分隔的子串,判断它属于哪个语法成分
并且 SQL 指令的每一节都是有特定标识的
/**
* 参数设定
*
* (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!");
}
}