Php 动态创建PDO查询语句并根据用户输入绑定参数

Php 动态创建PDO查询语句并根据用户输入绑定参数,php,dynamic,pdo,Php,Dynamic,Pdo,我试图创建一个函数,该函数接受post中的用户输入数组,并动态生成查询语句和绑定参数。到目前为止,我能够使用引用列表创建查询语句,但是绑定参数有问题,因为我需要编写一大块开关块才能使其工作。我用的是CodeIgniter /* user input array sample array ("title" => "abc", "year" => ["start"=>1999, "end"=>2010] ) */ class Listin

我试图创建一个函数,该函数接受post中的用户输入数组,并动态生成查询语句和绑定参数。到目前为止,我能够使用引用列表创建查询语句,但是绑定参数有问题,因为我需要编写一大块开关块才能使其工作。我用的是CodeIgniter

/* user input array sample
   array ("title" => "abc",
          "year"  => ["start"=>1999, "end"=>2010]
   )
*/


class Listing extends CI_model {

  private ref_list = [
    'title'    => 'title LIKE :title',
    'year'     => "(year BETWEEN :start AND :end)" 
  ]

  private clause_list = [] // to be generated
  private param_list = [] // to be generated



  function query_create ( array $post_input ) {

    foreach ($post_input as $post_key => $post_value ) {

      // for clause list
      foreach ($this->ref_list as $ref_key => $ref_value ){
        if ($post_key == $ref_key ) {
          $this->clause_list[] = $ref_value;          
        }
      }

      // for param list
      switch($post_key) {
        case "title":
          $value = $post_value;

          $this->param_list[] = [":title", "%{$value}%", PDO::PARAM_STR];
          break;

        case "year":
          $start = $post_value['start'];
          $value = $post_value['end'];

          $this->param_list[] = [":start", "%{$start}%", PDO::PARAM_INT];
          $this->param_list[] = [":end", "%{$end}%", PDO::PARAM_INT];
          break;
      }

    }


    /* loop through clause list array to create query statement */

    $select_string = "SELECT * FROM song ";
    $clause_string = "WHERE ".implode ("AND", $this->clause_list);
    $query_stmt = $select_string . $clause_string


    /* bind param in PDO */

    if (is_array($this->param_list) && !empty($this->param_list)){
        foreach ($this->param_list as $index) {
            $bind   = $index[0];                
            $value  = &$index[1];
            $param  = $index[2];

            $query->bindParam ($bind, $value, $param);
        }
    }


  }

}

正如您所看到的,当发布更多输入时,开关块可能会变得巨大,我能做些什么来缩短它吗?

使用
bindValue
,而不是
bindParam
。但这不是我的问题。看看这个问题:我正在寻找一种方法来缩短那个大开关语句,或者摆脱它。类似于bind参数的引用数组,然后是一个循环,如果post键匹配,则分配这些值。因此,在将来,我只需要向引用中添加新的bind param值,而不是向switch语句中添加大量重复代码。除非将所有参数转换为SQL的方式有一个共同的模式,否则不可能缩短它。