web-dev-qa-db-fra.com

Comment utiliser PDO pour récupérer un tableau de résultats en PHP?

Je suis en train de modifier mon script de recherche après avoir pris connaissance des attaques par injection SQL. J'essaie d'obtenir la même fonctionnalité de mon script en utilisant PDO au lieu d'une connexion mysql normale. Donc, j'ai lu d'autres articles sur PDO mais je ne suis pas sûr. Ces deux scripts vont-ils donner la même fonctionnalité?

Avec AOP:

$pdo = new PDO('mysql:Host=$Host; dbname=$database;', $user, $pass);
$stmt = $pdo->prepare('SELECT * FROM auction WHERE name = :name');
$stmt->bindParam(':name', $_GET['searchdivebay']);
$stmt->execute(array(':name' => $name);

Avec mysql régulier:

$dbhost = @mysql_connect($Host, $user, $pass) or die('Unable to connect to server');

@mysql_select_db('divebay') or die('Unable to select database');
$search = $_GET['searchdivebay'];
$query = trim($search);

$sql = "SELECT * FROM auction WHERE name LIKE '%" . $query . "%'";



if(!isset($query)){
echo 'Your search was invalid';
exit;
} //line 18

$result = mysql_query($trim);
$numrows = mysql_num_rows($result);
mysql_close($dbhost);

Je continue avec l'exemple régulier à utiliser

while($i < $numrows){
$row = mysql_fetch_array($result);

créer un tableau de résultats correspondants à partir de la base de données. Comment puis-je faire cela avec PDO?

26
Bundy

Regardez le PDOStatement.fetchAll méthode. Vous pouvez également utiliser fetch dans un modèle d'itérateur.

Échantillon de code pour fetchAll, dans la documentation PHP:

<?php
$sth = $dbh->prepare("SELECT name, colour FROM fruit");
$sth->execute();

/* Fetch all of the remaining rows in the result set */
print("Fetch all of the remaining rows in the result set:\n");
$result = $sth->fetchAll(\PDO::FETCH_ASSOC);
print_r($result);

Résultats:

Array
(
    [0] => Array
        (
            [NAME] => pear
            [COLOUR] => green
        )

    [1] => Array
        (
            [NAME] => watermelon
            [COLOUR] => pink
        )
)
63
Polynomial

Il existe trois façons d'extraire plusieurs lignes renvoyées par une instruction PDO.

Le plus simple consiste simplement à itérer sur PDOStatement lui-même:

$stmt = $pdo->prepare("SELECT * FROM auction WHERE name LIKE ?")
$stmt->execute(array("%$query%"));
// iterating over a statement
foreach($stmt as $row) {
    echo $row['name'];
}

une autre consiste à récupérer des lignes en utilisant la méthode fetch () dans une instruction while connue:

$stmt = $pdo->prepare("SELECT * FROM auction WHERE name LIKE ?")
$stmt->execute(array("%$query%"));
// using while
while($row = $stmt->fetch()) {
    echo $row['name'];
}

mais pour les applications Web modernes, nous devrions séparer nos itérations de la base de données de la sortie. La méthode la plus pratique consiste donc à extraire toutes les lignes à la fois à l'aide de la méthode fetchAll ():

$stmt = $pdo->prepare("SELECT * FROM auction WHERE name LIKE ?")
$stmt->execute(array("%$query%"));
// fetching rows into array
$data = $stmt->fetchAll();

et ensuite les sortir dans un template:

<ul>
<?php foreach($data as $row): ?>
    <li><?=$row['name']?></li>
<?php endforeach ?>
</ul>

Notez que PDO prend en charge de nombreux modes d'extraction sophistiqués, permettant à fetchAll () de renvoyer des données dans de nombreux formats différents .

9