2016-11-03 4 views
-2

bindParam()のパラメータの数をOOPフレンドリでもっと見るために使用していたこのIFを変換する方法は考えられません。 ここでswitchステートメントを使用する以外のことができますか? とにかく彼のIFを持つのは良いOOPの練習ですか?IFをより多くのOOPに変換する方法

おそらくアドホック多型?私はいけないとして、ここで

class MySQL_Query { 

    protected $dbh; 

    public function __construct($dbh) { 
     $this->dbh = $dbh; 
    } 

    public function SelectQuery($query, $param) { 

     $PDOStatement = $this->$dbh->PDO->prepare($query); 

     if (isset($param[3])) { 
      $PDOStatement->bindParam($param[0], $param[1], $param[2], $param[3]); 
     } elseif (isset($param[2])) { 
      $PDOStatement->bindParam($param[0], $param[1], $param[2]); 
     } else { 
      $PDOStatement->bindParam($param[0], $param[1]); 
     } 

     $PDOStatement->execute(); 

     $result = array(); 

     while ($row = $statement->fetch(PDO::FETCH_NAMED)) { 
      $result[] = $row; 
     } 

     return $result; 

    } 

} 

EDIT私の解決策は、私がIFを削除する方法を求めていたものである」彼らはPDO::PARAM_STRとして扱われ、あなたがそれを変更することはできませんので、直接​​へのparamsを通過したいです。ここで私は醜いを排除する方法ですIF私はそれをternary IFに翻訳しました。

$PDOStatement->bindParam( $param[0], //parameter 
          $param[1], //variable with value 
          !empty($param[2]) ? $param[2] : null, //data_type 
          !empty($param[3]) ? $param[3] : null, //length 
          !empty($param[4]) ? $param[5] : null //driver_options 
         ); 
+2

は、あなただけの '$ PDOStatement->実行($のPARAM)に' $ param'を渡すことができませんでした; 'ステートメントを? – Darren

+0

4つのパラメータを使用する場合はどうなりますか?パラメータを配列として渡し、直接渡すか、ループで実行します。 (配列を直接 'execute()'に渡すことができます – junkfoodjunkie

答えて

1

PDOStatement::executeパラメータ

名前パラメータパラメータ

/* Execute a prepared statement by passing an array of insert values */ 
$calories = 150; 
$colour = 'red'; 
$sth = $dbh->prepare('SELECT name, colour, calories 
    FROM fruit 
    WHERE calories < :calories AND colour = :colour'); 
$sth->execute(array(':calories' => $calories, ':colour' => $colour)); 

INクエリ

を使用してパラメータの可変数命名

/* Execute a prepared statement by passing an array of insert values */ 
$calories = 150; 
$colour = 'red'; 
$sth = $dbh->prepare('SELECT name, colour, calories 
    FROM fruit 
    WHERE calories < ? AND colour = ?'); 
$sth->execute(array($calories, $colour)); 

の配列を受け付け

/* Execute a prepared statement using an array of values for an IN clause */ 
$params = array(1, 21, 63, 171); 
/* Create a string for the parameter placeholders filled to the number of params */ 
$place_holders = implode(',', array_fill(0, count($params), '?')); 

/* 
    This prepares the statement with enough unnamed placeholders for every value 
    in our $params array. The values of the $params array are then bound to the 
    placeholders in the prepared statement when the statement is executed. 
    This is not the same thing as using PDOStatement::bindParam() since this 
    requires a reference to the variable. PDOStatement::execute() only binds 
    by value instead. 
*/ 
$sth = $dbh->prepare("SELECT id, name FROM contacts WHERE id IN ($place_holders)"); 
$sth->execute($params); 

ソース:PDOStatement::execute docs

+0

最後の追加のための投票を受けました – Darren

+1

@Darrenええ、それは特にトリッキーなクエリです - 特に人々がどのように一般的にそれを必要としているかを確認してください – naomik

+0

ありがとうしかし、私はPDO :: execute()にパラメータを直接渡すと、デフォルトでPDO :: PARAM_STRとしてすべてのパラメータを扱います。パラメータを定義する際に正しいデータ型と長さを指定したいのは、私のためのコードを読んでください。 –

関連する問題