2016-06-28 20 views
0

私は自分のデータベースとしてmysqlを使用しており、サーバー側の言語としてphpを使用しています。 選択クエリを使用してデータベースからデータを選択できることがわかっています。 以下の例は重要です!mysqlの動的選択クエリですか?

  1. は、給与> 10000 など..........今

テーブルから選択し、名前、給与

  • 表から選択名
  • テーブルから選択します*テーブルの異なる選択クエリに対して、異なる選択方法が必要です。なぜなら、select *はすごく時間がかかるので毎回良いものではないからです。

    さて、私の質問は、私たちが(例で示した...)私たちの要求を実現することが可能な単一のテーブルの動的単一getメソッドを書く方法ですか?

    私は、関数の引数にパラメータの配列を渡します。 PHPで

    public get($arr) 
    { 
        //code goes here 
    } 
    

    私は$のARRを取得したいと動的SQLを変更したいが...

  • 答えて

    2

    によって..上記のようにいずれかを選択し、単純なクエリに参加したくありませんここで

    public get($arrfield, $arrtable, $arrwhere) 
    { 
        $str = "SELECT " . $arrfield . " FROM " . $arrtable . " WHERE " . $arrwhere; 
    
        return $str; 
    
        // You can return the query string or run the query and return the results 
    } 
    
    +0

    コードはSQLインジェクションを受けやすいです。 –

    +0

    認められています。 OPの要件を満たすために、私は可能な限り一般的なものにしました。より具体的なケースでは、準備されたステートメントとバインドされた変数を使用する関数を記述することができます。 –

    0

    が動的query.Pleaseの構造が必要なvalidation.YouはPARAMに基づいalso.On追加「または」句できる追加することです:あなたはそれをしたいどのように、あなたはこのような何かを行うことができますあなたはそれを行うことができます。

    public SelectTable($arrfield, $table, $arrwhere, $arrgroup) 
    { 
        if(!empty($arrfield)) 
        { 
        $fields = implode('`,`',$arrfield); 
        } 
        else 
        { 
         $fields = '*'; 
        } 
    
        if(!empty($arrwhere)) 
        { 
         foreach($arrwhere as $fieldName=>$fieldValue) 
         { 
          if(is_array($fieldValue)) 
          { 
           $cond .= "`fieldName` in (". implode(',',$fieldValue)); 
          } 
          else 
           $cond .= "`fieldName` = '" . addslashes($fieldValue)."'"; 
         } 
        } 
        else 
        { 
         $cond = '1'; 
        } 
        if(!empty($arrgroup)) 
        { 
         $groupBy .= " group by "; 
         foreach($arrgroup as $field=>$value) 
         { 
          $groupBy .= $field . " " . $vale; 
         } 
        } 
    } 
    $str = "SELECT " . $fields . " FROM " . $table . " WHERE " . $cond . $groupBy; 
    
        return $str; 
    
        // You can return the query string or run the query and return the results 
    } 
    
    +0

    このコードはSQLインジェクションを受けやすいです。 –

    +0

    私はすでに必要なバリデーションを実装するために言及していますが、これは単に関数をどのように作成するかの考えです。 –

    +0

    ちょうど言っても役に立たない。 –

    2

    同様信託私は、任意のコストで回避する必要があることすぎ大変な仕事ではありませんすべての3つのクエリを記述します。

    貴重なSQL言語をわかりにくく解釈しないようにしてください。あなたのアプローチの無数のセキュリティ侵害を言うまでもなく。

    あなたが考えるべきであることは、パラメータを使用できるようにする機能です。したがって、よりよいこの

    function mysqli($mysqli, $query, $params, $types = NULL) 
    { 
        $statement = $mysqli->prepare($select); 
        $types = $types ?: str_repeat('s', count($params)); 
        $statement->bind_param($types, ...$params); 
        $statement->execute(); 
        return $statement; 
    } 
    

    のように私達の機能を作成しているとして、あなたのすべてのクエリを実行し、唯一の代わりに変数

    • select * from tableのプレースホルダを提供する:
      あなたはこの
    • ようなクエリを必要とすることは決してないだろう
    • select name from table

      $names = mysqli($db, "select name from table")->get_result->fetch_all(); 
      
    • `名を選択し、テーブルから給与:

      $stmt = mysqli($db, "select name from table where salary > ?", [10000]); 
      $names = $stmt->get_result->fetch_all(); 
      

    う - クエリ自体は、少なくともコード部分です。あなたの懸念事項は、SQLではなく、クエリを実行してデータを取得するために使用されるPHPコードの無駄な部分でなければなりません。