本帖最后由 xytianshiwx 于 2013-12-08 10:09:44 编辑

解决方案 »

  1.   

    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)){//
    分支能进入
      

  2.   


    代码修改过了 $param="name",主要是出现单个字符或字符串时,直接给$sql_param_list["field"]赋值为$param
      

  3.   

     }elseif(preg_match("/\b(order|limit|group|)\b/i", $param,$param_name)){//判断order|limit|group
    ==> "/\b(order|limit|group)\b/i",  //正则多了个或
      

  4.   

    if(false!==strpos($param,",")){//判断是否存在“,”
    那就更不对了,单个名字不会有“,”的按照 SQL 指令的文法范式
    你应该逐次读取以空格符分隔的子串,判断它属于哪个语法成分
    并且 SQL 指令的每一节都是有特定标识的
      

  5.   

    恩 规则是判断是否有",",有直接定义为field 并给每个键值加“`”。没有判断包含where的,之后其他sql语句关键字。单个的字符串直接给field 并加“`”。练习中,如果过有好的建议,请联系我,谢谢
      

  6.   


    /**
        * 参数设定
        * 
        *      (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!");
         }
       }