<?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);
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" で、その中に "," はありません
ブランチは
を入力できます
コードは、主に 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", //正则多了个或
そして、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!"); } }