本帖最後由 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", //正則多了個或
謝謝 剛看Regex,還不熟悉
/** * 參數設定 * * (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!"); } }