En el post Método PDO::query para obtener resultados con MySQL mostré como hacer un query y mostrar los resultados, ahora vamos a ir a algo un poco mas interesante que es obtener información basado en un ID de empleado. Nuestro objetivo es que con el ID del empleado nos muestre su nombre. La información será proporcionada a través de un campo de texto en una forma HTML.
Nombre de Empleado:
Para el post utilizamos la Base de Datos creada en Método PDO::query para obtener resultados con MySQL, si aún no la tienes puedes visitar el post y descargar los archivos.
El método PDO::prepare() nos permite preparar un query con los datos que queremos enviar a este.
En vez de hacer un query concatenado como se hacía anteriomente en el MySQL antiguo:
1 | SELECT nombre FROM empleado WHERE id_empleado = 2 |
Ahora vamos a utilizar Named Placeholders (Parametro con Nombre) que van a repesentar los valorque vamos a ligar. los Named Placedholders estan dentro de nuestro query y se escribe el nombre que queramos empezando con dos puntos (colon).
1 | SELECT nombre FROM empleado WHERE id_empleado = :id |
Entonces nuestro código para hacer el query y obtener los resultados es el siguiente:
1 2 3 4 5 | $sql = 'SELECT nombre FROM empleado WHERE id_empleado = :id'; $stmt = $conn->prepare($sql); $stmt->bindParam(':id',$_POST['id'], PDO::PARAM_INT); $stmt->execute(); $result = $stmt->fetchColumn(); |
PDO::PARAM_INT, es para ser mas explicito en los datos que les estamos enviado. Algunos tipos de datos que se manejan son:
1 2 3 | PDO::PARAM_INT: Integer (whole number) PDO::PARAM_LOB: Binary (such as an image, Word document, or PDF file) PDO::PARAM_STR: String (text) |
Sin embargo no se ve ninguno para un punto flotante, por lo tanto el 3er argumento es opcional, así que lo puedes dejar sin argumento.
Si no queremos utilizar PDO::bindingParam podemos enviar la información directa a execute en forma de arrelgo:
1 2 3 4 | // prepare statement $stmt = $conn->prepare($sql); // execute query by passing array of variables $stmt->execute(array(':name' => $_POST['name'], ':pwd' => $_POST['pwd'])); |
Si esto te parecio mejor que te parece evitar incluso usar Named Placeholders y solo indicar con signo de pregunta.
1 | SELECT nombre FROM empleado WHERE id_empleado = ? |
Y para enviar los datos un método aún mas facil
1 2 3 | $sql = 'SELECT nombre FROM empleado WHERE id_empleado = ?'; $stmt = $conn->prepare($sql); $result = $stmt->execute(array($_POST['id'])); |
De esta manera podemos ver algunos métodos para enviar parametros a través de PDO::prepare(). Los códigos donde se utiliza esto estos ejemplos son:
phpParameters-03.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | <?php require_once 'Connection.simple.php'; $result = ""; $conn = dbConnect(); // If 'buscar' is in the array $_POST proceed to make the query. if (array_key_exists("search",$_POST)) { // Create the query with Named Placeholders $sql = 'SELECT nombre FROM empleado WHERE id_empleado = :id'; // we have to tell the PDO that we are going to send values to the query $stmt = $conn->prepare($sql); // Now we bind the params $stmt->bindParam(':id',$_POST['id'], PDO::PARAM_INT); // Now we execute the query passing an array toe execute(); $stmt->execute(); // Extract the values from $result $result = $stmt->fetchColumn(); if (empty($result)) { $result = "No se encontraron resultados !!"; } } else { } ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>Query data sending an ID</title> <meta http-equiv="X-UA-Compatible" content="IE=9,crome" /> <meta name="copyright" content="Datasoft Engineering 2012"/> <meta name="author" content="Reedyseth"/> <meta name="description" content="Query data sending an ID" /> <style type="text/css"> body {font-family: Arial, Helvetica, sans-serif;} </style> </head> <body> <fieldset style="width:480px" > <legend>Busqueda de Empleado</legend> <form action="" method="post"> <div> <label for="id">Id de empleado:</label> <input type="text" name="id" id="id"/> <input type="submit" name="search" value="Buscar" /> </div> </form> </fieldset> <p><strong>Nombre de Empleado</strong>: <?php echo $result;?></p> </html> |
phpParameters-04.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | <?php require_once 'Connection.simple.php'; $result = ""; $conn = dbConnect(); // If 'buscar' is in the array $_POST proceed to make the query. if (array_key_exists("search",$_POST)) { // Create the query $sql = 'SELECT nombre FROM empleado WHERE id_empleado = ?'; // we have to tell the PDO that we are going to send values to the query $stmt = $conn->prepare($sql); // Now we execute the query passing an array toe execute(); $result = $stmt->execute(array($_POST['id'])); // Extract the values from $result $result = $stmt->fetchColumn(); if (empty($result)) { $result = "No se encontraron resultados !!"; } } else { } ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>Query data sending an ID</title> <meta http-equiv="X-UA-Compatible" content="IE=9,crome" /> <meta name="copyright" content="Datasoft Engineering 2012"/> <meta name="author" content="Reedyseth"/> <meta name="email" content="ibarragan@behstant.com"/> <meta name="description" content="Query data sending an ID" /> <style type="text/css"> body {font-family: Arial, Helvetica, sans-serif;} </style> </head> <body> <fieldset style="width:480px" > <legend>Busqueda de Empleado</legend> <form action="" method="post"> <div> <label for="id">Id de empleado:</label> <input type="text" name="id" id="id"/> <input type="submit" name="search" value="Buscar" /> </div> </form> </fieldset> <p><strong>Nombre de Empleado</strong>: <?php echo $result;?></p> </html> |
Como podemos observar existe varias formas para obtener información enviando parametros con PDO, mi forma personal de trabajar es con la versión simplificada, ya que me enfoco mas en logica que en estar poniendo nombre en los sql.
UPDATE – 29-May-2015
El siguiente código es para enseñar como extraer todos los datos de una fila. Ahora en vez de usar fetchColumn() utilizaremos fetch() para obtener la fila completa.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | <?php require_once 'Connection.simple.php'; $result = ""; $conn = dbConnect(); // If 'buscar' is in the array $_POST proceed to make the query. if (array_key_exists("search",$_POST)) { // Create the query $sql = 'SELECT * FROM empleado WHERE id_empleado = ?'; // we have to tell the PDO that we are going to send values to the query $stmt = $conn->prepare($sql); // Now we execute the query passing an array toe execute(); $result = $stmt->execute(array($_POST['id'])); // Extract the values from $result $result = $stmt->fetch(); if (empty($result)) { $result = "No se encontraron resultados !!"; } //var_dump($result); } ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>Query data sending an ID</title> <meta http-equiv="X-UA-Compatible" content="IE=9,crome" /> <meta name="copyright" content="Datasoft Engineering 2012-2015"/> <meta name="author" content="Reedyseth"/> <meta name="description" content="Query data sending an ID" /> <style type="text/css"> body {font-family: Arial, Helvetica, sans-serif;} </style> </head> <body> <fieldset style="width:480px" > <legend>Busqueda de Empleado</legend> <form action="" method="post"> <div> <label for="id">Id de empleado:</label> <input type="text" name="id" id="id"/> <input type="submit" name="search" value="Buscar" /> </div> </form> </fieldset> <!-- Obtener la información del arreglo de PHP --> <?php if( !empty($result) ) { ?> <p><strong>ID</strong>: <?php echo $result['id_empleado'];?></p> <p><strong>Nombre de Empleado</strong>: <?php echo $result['nombre'];?></p> <p><strong>Email</strong>: <?php echo $result['email'];?></p> <p><strong>Telefono</strong>: <?php echo $result['telefono'];?></p> <?php } ?> </html> |
Como ya es costrumbre dejo los código fuente para que lo descarguen: