2012-08-07 3 views
4

J'ai été old school en utilisant mysql_query et je commence maintenant avec PDO. Qui est genial! Mais dans mes anciens scripts, j'avais construit un générateur de requête dynamique, et j'ai du mal à le transférer à l'aide de PDO.PDO Dynamic Query Building

Si quelqu'un peut me donner une direction ce serait génial!

Voici la théorie de celui-ci.

  1. I ont un réseau de
  2. les champs et les valeurs DB (sur plaquette).
  3. Créer la chaîne de requête au produit d'une transaction PDO valide

Voici une partie de ce que je suis en train de faire.

public $dbFields; // This is an array of the fields plus VALUES 

public function select($where, $limit) { 
    // This is what I **had** before 
    $query = "SELECT ". implode(", ", $this->dbFields) ." FROM ". $this->table." WHERE ". $where ." ". $limit.""; 

    // Now i need to convert that to PDO 
    $this->connection->beginTransaction(); 

    # START Query 
    $select = $this->connection->prepare("SELECT {$this->fieldNames} FROM {$this->table}"); 

    // I need to BIND my params and values, but i'm not sure the best route to take when I have a WHERE clause that includes, "AND"/"OR" operators. 

    # EXECUTE the query 
    $select->execute(); 

    $this->connection->commit(); 
} 

Voilà ce que je HAD avant

$results = $db->select("userId = 111 OR userId = 222"); 

Mais ce que je suis penser je dois faire est d'utiliser quelque chose comme

$results = $db->select(array("userId"=>111, "userId"=>222)); 

Je sais que c'est un grand ordre, et j'espère que cela a du sens dans ce que j'essaie de faire, mais toute aide pour essayer de construire ces requêtes serait grandement apprec Iated.

Répondre

1

requêtes Vous aurez besoin d'un séparent le paramètre $params de votre méthode select. J'ai pris la liberté de fournir des valeurs par défaut pour les paramètres de la méthode. Comme les notes @userXxxx, vous n'avez pas besoin d'une transaction pour faire un SELECT.

<?php 

class db { 

    public $connection; //PDO 
    public $dbFields; // This is an array of the fields plus VALUES 

    public function select($where = '1', $params = array(), $limit = '', $fetchStyle = PDO::FETCH_ASSOC) { //fetchArgs, etc 
     $fields = implode(', ', $this->dbFields); 

     //create query 
     $query = "SELECT $fields FROM {$this->table} WHERE $where $limit"; 

     //prepare statement 
     $stmt = $this->connection->query($query); 

     $stmt->execute($params); 

     return $stmt->fetchAll($fetchStyle); 
    } 

    //... 
} 


$where = 'userId IN(:userId1, :userId2)'; 
$params = array(':userId1' => 111, ':userId2' => 2222); 
$db->select($where, $params); 

Notes:

  • Si vous voulez vraiment, vous pouvez ajouter des paramètres de méthode pour correspondre avec toute la souplesse de PDOStatement::fetchAll.
  • Je ne suis pas sûr de savoir ce que vous voulez dire à propos de $dbFields étant "fields plus VALUES". Peux-tu expliquer?

[Modifier]

Vous pouvez jeter un oeil à la docs/examples pour PDOStatement::execute, puisque cela semblait être là où votre confusion a ses racines - en particulier, le paramètre de la méthode $input_parameters .

-1

Que pensez-vous de cela?

public function select($where, $limit) { 
    $query = "SELECT ". implode(", ", $this->dbFields) ." FROM ". $this->table." WHERE ". $where ." ". $limit.""; 
    $this->connection->query($query); 
} 

//Use what you had before: 
$results = $db->select("userId = 111 OR userId = 222"); 

Je ne sais pas pourquoi vous voulez utiliser la transaction (pour base tout ou rien ou attraper des exceptions et rollback) ou préparés (pour l'envoi de requêtes multiples) ...

+0

Manquant une déclaration de retour? – EthanB