2012-06-06 70 views
16

Solo estoy editando mi script de búsqueda después de leer sobre los ataques de inyección de SQL. Estoy tratando de obtener la misma funcionalidad de mi script usando PDO en lugar de una conexión regular de mysql. Así que he estado leyendo otras publicaciones sobre DOP, pero no estoy seguro. ¿Estos dos scripts darán la misma funcionalidad?¿Cómo usar PDO para obtener matriz de resultados en PHP?

Con PDO:

$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 regular:

$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); 

voy con el ejemplo regular para utilizar

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

para crear una matriz de búsqueda de resultados de la base de datos. ¿Cómo hago esto con PDO?

+0

¿Cómo funciona la versión 'mysql_ *'? Está utilizando '$ query' antes de declararlo ... – deceze

+0

El código" normal "no funcionará. Estableces '$ query' después de establecer' $ sql'. – Polynomial

+0

posible duplicado de [¿Cómo puedo usar correctamente un objeto PDO para una consulta Select] (http://stackoverflow.com/questions/767026/how-can-i-properly-use-a-pdo-object-for-a -select-query) – Polynomial

Respuesta

44

Eche un vistazo al método PDOStatement.fetchAll. También puede usar fetch en un patrón de iterador.

Ejemplo de código para fetchAll, a partir 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 
     ) 
) 
+11

'\ PDO :: FETCH_ASSOC' y' \ PDO :: FETCH_NUM' le permiten definir el modo de búsqueda. '\ PDO :: FETCH_ASSOC' devolverá solo' field => value' array, mientras que '\ PDO :: FETCH_NUM' devolverá matriz con solo las teclas numéricas y' \ PDO :: FETCH_BOTH' devolverá resultados como en la respuesta. Esta constante se debe pasar al método '-> fetchAll()' en este caso. –

+0

@FARID Publicar una nueva pregunta. – Polynomial

-2
$st = $data->prepare("SELECT * FROM exampleWHERE example LIKE :search LIMIT 10"); 
+3

Agregue una explicación de por qué el OP debe probar su respuesta y cómo resuelve el problema. –

1

Hay tres maneras para acarrear múltiples filas devueltas por la declaración DOP.

La más simple es sólo para iterar sobre PDOStatement sí:

$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 mediante FETCH método() dentro de una sentencia familiarizado mientras:

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

pero para el moderno aplicación web deberíamos tener nuestras iteraciones de datbase separadas de salida y así el método más conveniente sería obtener 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(); 

y luego almacenarlas en una plantilla:

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

Tenga en cuenta que es compatible con DOP many sophisticated fetch modes, allowing fetchAll() to return data in many different formats.

Cuestiones relacionadas