¿Cómo puedo usar PDO para recuperar una matriz de resultados en PHP?
Estoy editando mi script de búsqueda después de leer sobre ataques de inyección SQL . Estoy intentando obtener la misma funcionalidad de mi script usando PDO en lugar de una conexión MySQL normal. He estado leyendo otras publicaciones sobre DOP, pero no estoy seguro. ¿Estos dos scripts ofrecerán la misma funcionalidad?
Con DOP:
$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);
Con MySQL normal:
$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);
Sigo con el ejemplo habitual a utilizar.
while($i < $numrows){
$row = mysql_fetch_array($result);
para crear una matriz de resultados coincidentes de la base de datos. ¿Cómo hago esto con PDO?
Echa un vistazo al PDOStatement.fetchAll
método. También puedes usarlo fetch
en un patrón iterador.
Ejemplo de código para fetchAll
, de la documentación de 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);
Resultados:
Array
(
[0] => Array
(
[NAME] => pear
[COLOUR] => green
)
[1] => Array
(
[NAME] => watermelon
[COLOUR] => pink
)
)
Hay tres formas de recuperar varias filas devueltas por una declaración PDO.
La más sencilla es simplemente iterar sobre la propia declaración PDO:
$stmt = $pdo->prepare("SELECT * FROM auction WHERE name LIKE ?")
$stmt->execute(array("%$query%"));
// iterating over a statement
foreach($stmt as $row) {
echo $row['name'];
}
Otra es recuperar filas usando el método fetch() dentro de una declaración while familiar :
$stmt = $pdo->prepare("SELECT * FROM auction WHERE name LIKE ?")
$stmt->execute(array("%$query%"));
// using while
while($row = $stmt->fetch()) {
echo $row['name'];
}
Pero para la aplicación web moderna deberíamos tener las interacciones de nuestra base de datos separadas de la salida y, por lo tanto, el método más conveniente sería recuperar todas las filas a la vez usando el método fetchAll() :
$stmt = $pdo->prepare("SELECT * FROM auction WHERE name LIKE ?")
$stmt->execute(array("%$query%"));
// fetching rows into array
$data = $stmt->fetchAll();
O, si primero necesita preprocesar algunos datos, use el bucle while y recopile los datos en una matriz manualmente:
$result = [];
$stmt = $pdo->prepare("SELECT * FROM auction WHERE name LIKE ?")
$stmt->execute(array("%$query%"));
// using while
while($row = $stmt->fetch()) {
$result[] = [
'newname' => $row['oldname'],
// etc
];
}
Y luego envíelos en una plantilla:
<ul>
<?php foreach($data as $row): ?>
<li><?=$row['name']?></li>
<?php endforeach ?>
</ul>
Tenga en cuenta que PDO admite muchos modos de recuperación sofisticados, lo que permite que fetchAll() devuelva datos en muchos formatos diferentes .