web-dev-qa-db-fra.com

Comment utiliser correctement un objet PDO pour une requête SELECT paramétrée

J'ai essayé de suivre les instructions de PHP.net pour effectuer des requêtes SELECT mais je ne suis pas sûr du meilleur moyen de s'y prendre.

J'aimerais utiliser une requête SELECT paramétrée, si possible, pour renvoyer le ID dans une table où le champ name correspond au paramètre. Cela devrait retourner un ID car il sera unique.

Je voudrais ensuite utiliser ce ID pour un INSERT dans une autre table. Je vais donc devoir déterminer si cela a réussi ou non.

J'ai également lu que vous pouvez préparer les requêtes en vue de leur réutilisation, mais je ne savais pas comment cela aiderait.

85
Joe Phillips

Vous sélectionnez des données comme ceci:

$db = new PDO("...");
$statement = $db->prepare("select id from some_table where name = :name");
$statement->execute(array(':name' => "Jimbo"));
$row = $statement->fetch(); // Use fetchAll() if you want all results, or just iterate over the statement, since it implements Iterator

Vous insérez de la même manière:

$statement = $db->prepare("insert into some_other_table (some_id) values (:some_id)");
$statement->execute(array(':some_id' => $row['id']));

Je vous recommande de configurer PDO pour qu'il lève des exceptions en cas d'erreur. Vous obtiendrez alors un PDOException si l'une des requêtes échoue - inutile de vérifier explicitement. Pour activer les exceptions, appelez-le juste après avoir créé le $db objet:

$db = new PDO("...");
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
158
troelskn

Je travaille avec PDO récemment et la réponse ci-dessus est tout à fait juste, mais je voulais simplement documenter que les éléments suivants fonctionnent également.

$nametosearch = "Tobias";
$conn = new PDO("server", "username", "password");
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sth = $conn->prepare("SELECT `id` from `tablename` WHERE `name` = :name");
$sth->bindParam(':name', $nametosearch);
// Or sth->bindParam(':name', $_POST['namefromform']); depending on application
$sth->execute();
16
SmashCode

Vous pouvez utiliser les méthodes bindParam ou bindValue pour préparer votre déclaration. Cela rend les choses plus claires à première vue au lieu de $check->execute(array(':name' => $name)); Surtout si vous liez plusieurs valeurs/variables.

Cochez l'exemple clair et facile à lire ci-dessous:

$q = $db->prepare("SELECT id FROM table WHERE forename = :forename and surname = :surname LIMIT 1");
$q->bindValue(':forename', 'Joe');
$q->bindValue(':surname',  'Bloggs');
$q->execute();

if ($q->rowCount() > 0){
    $check = $q->fetch(PDO::FETCH_ASSOC);
    $row_id = $check['id'];
    // do something
}

Si vous attendez plusieurs lignes supprimez le LIMIT 1 et changez la méthode de récupération en fetchAll:

$q = $db->prepare("SELECT id FROM table WHERE forename = :forename and surname = :surname");// removed limit 1
$q->bindValue(':forename', 'Joe');
$q->bindValue(':surname',  'Bloggs');
$q->execute();

if ($q->rowCount() > 0){
    $check = $q->fetchAll(PDO::FETCH_ASSOC);
    //$check will now hold an array of returned rows. 
    //let's say we need the second result, i.e. index of 1
    $row_id = $check[1]['id']; 
    // do something
}
12
Gillian Lo Wong

Une réponse un peu complète est ici avec tout prêt à l'emploi:

    $sql = "SELECT `username` FROM `users` WHERE `id` = :id";
    $q = $dbh->prepare($sql);
    $q->execute(array(':id' => "4"));
    $done= $q->fetch();

 echo $done[0];

Ici $dbh Est un connecteur PDO db, et basé sur id de la table users, nous obtenons le username en utilisant fetch();

J'espère que cela aidera quelqu'un, profitez-en!

6
Domuta Marcel

Méthode 1: Méthode de requête USE PDO

$stmt = $db->query('SELECT id FROM Employee where name ="'.$name.'"');
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);

Obtenir le nombre de lignes

$stmt = $db->query('SELECT id FROM Employee where name ="'.$name.'"');
$row_count = $stmt->rowCount();
echo $row_count.' rows selected';

Méthode 2: Instructions avec paramètres

$stmt = $db->prepare("SELECT id FROM Employee WHERE name=?");
$stmt->execute(array($name));
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

Méthode 3: Paramètres de liaison

$stmt = $db->prepare("SELECT id FROM Employee WHERE name=?");
$stmt->bindValue(1, $name, PDO::PARAM_STR);
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

**bind with named parameters**
$stmt = $db->prepare("SELECT id FROM Employee WHERE name=:name");
$stmt->bindValue(':name', $name, PDO::PARAM_STR);
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

or
$stmt = $db->prepare("SELECT id FROM Employee WHERE name=:name");
$stmt->execute(array(':name' => $name));
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

Vous voulez en savoir plus, regardez ceci lien

3
Sudhir