34211


prepareしたSQLにデータを実際にセットしようとしても、プレースホルダーにセットされません。

例えば、以下のコードでは、

[code]

    $db = new DB();
    $db->get("users",array($field, "=" , "ken");
    
[/code]

[code]

    SELECT * FROM users where name = "ken"
    
[/code]

というSQLを作りたいのですが、コード中のコメントのbindValue前でもvindValue後のvar_dumpでも、

[code]

    object(PDOStatement)#6 (1) { ["queryString"]=> string(38) "SELECT * FROM 　　
    users WHERE username = ?" } 
    
[/code]

となっていて、? がkenに置き換わりません。  
どのようにしたら良いでしょうか？  
お願いします。

DBクラス

[code]

    public function query($sql , $params = array()){
    
    $this->_error = false;
    if($this->_query = $this->_pdo->prepare($sql)){
      $x = 1;
      if(count($params)){
        foreach($params as $param){
          //bindvalue前
          var_dump($this->_query);
          $this->_query->bindValue($x,$param,PDO::PARAM_STR);
          $x++;
          //bindvalue後
          var_dump($this->_query);
        }
      }
      if($this->_query->execute()){
        $this->_results = $this->_query->fetchAll(PDO::FETCH_OBJ);
        $this->_count = $this->_query->rowCount();
      }else{
        $this->_error = true;
      }
    }
    return $this;
    }
    
    public function action($action,$table, $where = array()){
     if(count($where) === 3){
      $operators = array('=', '>', '<' ,'>=' ,'<=');
      $field = $where[0];
      $operator = $where[1];
      $value = $where[2];
    
      if(in_array($operator, $operators)){
        $sql = "{$action} FROM {$table} WHERE {$field} {$operator} ?";
        if(!$this->query($sql, array($value))->count()){
          return $this;
        }
      }
    }
    return false;
    }
    
    
    public function get($table, $where){ 
      return $this->action("SELECT *",$table, $where);
    }
    
[/code]


CC BY-SA 3.0
2017-04-22T08:38:11.340
34209
2017-04-22T11:18:38.623
22721
question
php pdo
bindValueできない


その状態できちんと `bindValue()` できているのではないでしょうか？

プレースホルダにバインドした値はクエリとは別に保持され、別々にDBドライバに送信されます。ですから **クエリ中の`?`
が置き換えられた様子をPHPで確認することはできません**。プレースホルダに対応したRDBMSであればDB側のログにもやはり `?`
のまま出力されるでしょう。

文字列としてSQL中に埋め込む場合、一旦文字列として埋め込んで、DB側でまた文字列を解析して、という無駄な処理を行わなければいけません。また埋め込みロジックにバグがあればSQLインジェクションなどの攻撃を許してしまいます。プレースホルダを使ったパラメタライズドクエリはパラメータを別途渡すことで、これらの問題を解決しています。


CC BY-SA 3.0
2017-04-22T11:18:38.623
34211
2017-04-22T11:18:38.623
8000
34209
answer