2009-04-20 17 views
80

He intentado seguir las instrucciones de PHP.net para hacer consultas SELECT, pero no estoy seguro de la mejor manera de hacerlo.¿Cómo puedo usar correctamente un objeto PDO para una consulta SELECCIONADA parametrizada?

Me gustaría utilizar una consulta parametrizada SELECT, si es posible, para devolver el ID en una tabla donde el campo name coincide con el parámetro. Esto debería devolver uno ID porque será único.

Me gustaría utilizar ese ID para un INSERT en otra tabla, así que tendré que determinar si fue exitoso o no.

También leí que puede preparar las consultas para su reutilización, pero no estaba seguro de cómo esto ayuda.

Respuesta

153

selecciona datos de la siguiente manera:

$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 

Se inserta de la misma manera:

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

recomiendo que configure DOP a lanzar excepciones en caso de fallo. A continuación, obtendrá un PDOException si alguna de las consultas falla - No es necesario verificarlo explícitamente. Para encender excepciones, llamar a esto sólo después de haber creado el objeto $db:

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

Supongo que usted quiere decir PDOStatement donde tiene un nuevo PDO (...), ¿verdad? –

+1

no. PDO es la clase de conexión (probablemente debería haber sido llamada PdoConnection en su lugar). La conexión puede crear PdoStatements. Usted llama a setAttribute() en el objeto de conexión, no a las declaraciones individuales. (Alternativamente, puede pasarlo al constructor) – troelskn

+1

esto podría ser útil: '$ db = new PDO ('mysql: dbname = your_database; host = localhost', 'junior', '444');' –

16

He estado trabajando con DOP últimamente y la respuesta anterior es completamente correcto, pero sólo quería documentar que las siguientes obras también.

$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

No, no es así, ya que no ha seleccionado qué base de datos usar. –

+3

Eso debería estar realmente en la cadena "servidor", que en realidad debería ser un DSN en forma de "{driver}: dbname = {db_name}; host = {server}" reemplazando los valores de llave con cualquier conexión que necesite – thorne51

5

Un poco corta respuesta completa está aquí con todo listo para su uso:

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

echo $done[0]; 

Aquí es $dbh DOP conector db, y en base a id de la mesa users Hemos obtener el username usando fetch();

Espero que esto ayude a alguien, ¡disfruta!

+0

O use 'fetchColumn()' para evitar que '[0]' sea necesario. Además, recuerde usar 'LIMIT 1' en el SQL. – rybo111

9

Puede usar los métodos bindParam o bindValue para ayudarlo a preparar su resumen. Hace las cosas más claras a primera vista en lugar de hacer $check->execute(array(':name' => $name)); Especialmente si está vinculando múltiples valores/variables.

Comprobar el ejemplo claro, fácil de leer a continuación:

$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 usted está esperando varias filas eliminar el LIMIT 1 y cambiar el método de captación 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 
} 
+0

¿Por qué el voto a favor? por favor explique –

+0

No estoy seguro. Parece una respuesta válida para mí. Creo que sería beneficioso usar 'myname' en lugar de 'name' y también usar múltiples params en lugar de solo uno. –

+0

@GillianLoWong ¿Qué significa '' check = $ q-> fetch (PDO :: FETCH_ASSOC); if (! Empty ($ check)) { $ row_id = $ check ['id']; // hacer algo } 'do? – Abdul

2

Método 1 : USE el método de consulta PDO

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

Conseguir recuento de filas

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

Método 2: Declaraciones con los parámetros

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

Método 3: Parámetros de Bind

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

¿Quieres saber más vistazo a este link

+2

Por favor, elimine el Método 1. Permite la inyección de mysql. – Tomahock

-2

si está utilizando la codificación en línea en una sola página y no usar Uy que ir con este ejemplo completo, será seguro de ayudar a

//connect to the db 
$dbh = new PDO('mysql:host=localhost;dbname=mydb', dbuser, dbpw); 

//build the query 
$query="SELECT field1, field2 
FROM ubertable 
WHERE field1 > 6969"; 

//execute the query 
$data = $dbh->query($query); 
//convert result resource to array 
$result = $data->fetchAll(PDO::FETCH_ASSOC); 

//view the entire array (for testing) 
print_r($result); 

//display array elements 
foreach($result as $output) { 
echo output[field1] . " " . output[field1] . "<br />"; 
} 
+0

Si bien este fragmento de código puede resolver el problema, no explica por qué o cómo responde la pregunta. Por favor [incluya una explicación para su código] (// meta.stackexchange.com/q/114762/269535), ya que eso realmente ayuda a mejorar la calidad de su publicación. Recuerde que usted está respondiendo la pregunta a los lectores en el futuro, y es posible que esas personas no sepan los motivos de su sugerencia de código. ** Marcadores/revisores: ** [Para respuestas de solo código como este, downvote, no eliminar!] (// meta.stackoverflow.com/a/260413/2747593) –

+0

Entonces, ¿qué debo eliminar? auto –

+0

No, exactamente lo contrario. Me encontré con esta publicación en [Low Quality Posts Queue] (// stackoverflow.com/review/low-quality-posts), así que la última parte de mi comentario fue decirle a las personas que ** no ** voten para eliminar . (En cambio, la sugerencia de votar negativamente tenía la intención de provocar votos vencidos provisionales, que se eliminarían después de que su publicación haya sido editada). Como mencioné en mi comentario anterior, sería mejor si añadiera una explicación de por qué sugirió el código que hizo. . Además, esta pregunta se refiere a consultas parametrizadas, pero 'field> 6969' se ve codificado en lugar de parametrizado. –

-2

exactamente después de la línea prepareline añadir a continuación código

echo $statement->queryString; 
Cuestiones relacionadas