Ver Mensaje Individual
  #1 (permalink)  
Antiguo 08/07/2013, 10:41
Avatar de repara2
repara2
 
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
[APORTE] Leer, insertar, editar y eliminar registros con PHP / MySQL (ultra básico)

Como este tema sigue saliendo ahí va otro ejemplo para los que están aprendiendo. Funciona así:
1. Las funciones de leer, eliminar, editar, insertar y conectar están en un archivo aparte. Se incluye además una función para obtener la lista de departamentos. De esta manera no se hacen llamadas a la DB por ahí, todo está agrupado.
2. Después de conectar, se comprueba si el usuario ha seleccionado una opción y se ejecuta.
3. Se muestran los resultados.
NOTAS:
0. Este ejemplo tiene unicamente fines DIDACTICOS, se entiende que se puede mejorar de muchas maneras. Tomar como un ejemplo en cuanto a técnica y no en cuanto a diseño.
1. Está en MYSQL, quién tenga ganas que lo actualice y mysqli,
2. Esta es una implementación que tiene por objeto mostrar la parte de las funciones, lo demás es indispensable pero se puede hacer mejor.
3. Si aún con los comentarios no se entiende, postear en cualquier momento.
Ahí va, saludos:



1. Dos tablas:

Código MySQL:
Ver original
  1. CREATE TABLE `demo_depts` (
  2.   `depid` INT(11) NOT NULL AUTO_INCREMENT,
  3.   `depname` VARCHAR(32) DEFAULT NULL,
  4.   PRIMARY KEY (`depid`)
  5.  
  6. CREATE TABLE `demo_users` (
  7.   `userid` INT(11) NOT NULL AUTO_INCREMENT,
  8.   `username` VARCHAR(32) DEFAULT NULL,
  9.   `userdep` INT(11) DEFAULT NULL,
  10.   PRIMARY KEY (`userid`),
  11.   KEY `FK_users` (`userdep`)

2. Un par de funciones:

Código PHP:
Ver original
  1. <?php
  2.  
  3. // Algunas constantes
  4. // La definicion de constante se encuentra aquí:
  5. //http://www.php.net/manual/es/language.constants.php
  6. // Conexión a la db
  7. define ( 'DBHOST', 'localhost' );
  8. define ( 'DBUSER', 'xxx' );
  9. define ( 'DBPASS', 'xxx' );
  10. define ( 'DBNAME', 'xxx' );
  11.  
  12.  
  13. // Wrapper para mysql_connect
  14. //No encuentro ningún articulo que explique que es un wrapper, que alguien aporte //por fa
  15. function conectar($host, $user, $pass, $db) {
  16.  
  17.     // Si no hay conexión fin del script
  18.     if(!$link = mysql_connect ( $host, $user, $pass )) die(mysql_error());
  19.     // Si no se puede seleccionar la db, fin del script
  20.     if(!$dbase = mysql_select_db ( $db, $link )) die(mysql_error());
  21.     return $link;
  22. }
  23.  
  24. // Devuelve un elemento si se especifica $id o toda la tabla caso contrario
  25. function select($link, $id = null) {
  26.     // Tabla users
  27.     $sql = "SELECT * FROM demo_users ";
  28.         // Join con deptos, se hace siempre
  29.     $sql .= "LEFT JOIN demo_depts on demo_depts.depid = demo_users.userdep";
  30.     if ($id)
  31.         $sql .= " WHERE  demo_users.userid = $id";
  32.     if(!$query = mysql_query ( $sql, $link )) die(mysql_error());
  33.     return $query;
  34. }
  35.  
  36. // inserta id con values
  37. function insert($link, $values) {
  38.     // Inicio de la sentencia
  39.     $sql = "INSERT INTO demo_users ( ";
  40.     // Por cada par de clave, valor, concatenar al string sql
  41.     // Primero las claves
  42.     foreach ( $values as $property => $value ) {
  43.        
  44.         $sql .= $property . ",";
  45.     }
  46.     // Quito la ultima coma
  47.     $sql = substr ( $sql, 0, - 1 );
  48.     $sql .= ") VALUES (";
  49.     // Ahora los valores
  50.     foreach ( $values as $property => $value ) {
  51.        
  52.         $sql .= "'$value',";
  53.     }
  54.     $sql = substr ( $sql, 0, - 1 );
  55.     $sql .= ");";
  56.     // Insertar
  57.     if(!$query = mysql_query ( $sql, $link )) die(mysql_error());
  58.     return mysql_insert_id($link);
  59. }
  60.  
  61. // actualiza id con values
  62. function update($link, $id, $values) {
  63.     $sql = "UPDATE demo_users SET ";
  64.    
  65.     foreach ( $values as $property => $value ) {
  66.        
  67.         $sql .= $property . " = '$value', ";
  68.     }
  69.     // Quito la ultima coma
  70.     $sql = substr ( $sql, 0, - 2 ) . " WHERE userid = '$id';";
  71.     if (!$query =  mysql_query ( $sql, $link )) die(mysql_error());
  72.    
  73.     return mysql_affected_rows($link);
  74. }
  75.  
  76. // elimina id
  77. function delete($link, $id) {
  78.     $sql = "DELETE FROM demo_users WHERE userid = '$id';";
  79.     if (!$query = mysql_query ( $sql, $link )) die(mysql_error());
  80.     return true;
  81. }
  82.  
  83. //select con los departamentos
  84. function getDepSelect($link, $id = null)
  85. {
  86.     $sql = "SELECT * FROM demo_depts";
  87.     if(!$query = mysql_query($sql, $link)) die(mysql_error());
  88.     $output = "<select name='depid' id='depid'>";
  89.     $output .= "<option value='-1' selected='selected'>Seleccione....</option>";
  90.     while($deps = mysql_fetch_assoc($query))
  91.     {
  92.         //mostrar los registros, pero si hay un $id, entonces ese registro debe seleccionarse
  93.         $output .= "<option ".($id && $id == $deps['depid']?'selected="selected"':'')." value='{$deps['depid']}'>{$deps['depname']}</option>";
  94.        
  95.     }
  96.     $output .= "</select>";
  97.     return $output;
  98. }
  99. // Un die un poco mas detallado

3. Un controlador

Código PHP:
Ver original
  1. <?php
  2. // Mostrar errores
  3. error_reporting ( E_ALL );
  4. ini_set ( 'display_errors', 1 );
  5. // Incluir funciones
  6. include_once 'funciones.php';
  7.  
  8. // Conectar
  9. $conexion = conectar ( DBHOST, DBUSER, DBPASS, DBNAME );
  10. // Un mensaje
  11. $msg = 'Esto es un ejemplo, selecciona una opción o utiliza el form para insertar un registro';
  12. // Variables por defecto para el form
  13. $reg = array ();
  14. // el formulario es de insercion
  15. $form_action = "?insert";
  16. // obtener los departamentos
  17. $form_select = getDepSelect ( $conexion );
  18. // El usuario a clickeado en insertar
  19. if (isset ( $_GET ['insert'] )) {
  20.     // Leer valores pasador por $_POST
  21.     $datos = array (
  22.             'username' => $_POST ['username'],
  23.             'userdep' => $_POST ['depid']
  24.     );
  25.     // Insert contiene un die() dentro, no hace falta hacerlo aquí
  26.     $id = insert ( $conexion, $datos );
  27.     // Setear el mensaje
  28.     $msg = "Registro $id insertado ok...";
  29. } elseif (isset ( $_GET ['edit'] )) { // El usuario ha clickeado editar un
  30.                                       // registro
  31.                                       // la proxima accion del form serßa
  32.                                       // doedit, o sea, hacer la edicion
  33.     $form_action = "?DOedit={$_GET['edit']}";
  34.     // Para editar, necesitamos recuperar el registro
  35.     $query = select ( $conexion, $_GET ['edit'] );
  36.     // Asignar valores
  37.     while ( $d = mysql_fetch_assoc ( $query ) ) {
  38.         $reg ['userid'] = $d ['userid'];
  39.         $reg ['userdep'] = $d ['userdep'];
  40.         $reg ['username'] = $d ['username'];
  41.     }
  42.    
  43.     // La select del form debe tener el elemento correcto seleccionado
  44.     $form_select = getDepSelect ( $conexion, $reg ['userdep'] );
  45. } elseif (isset ( $_GET ['DOedit'] )) { // El usuario ha llenado el form y ahora
  46.                                         // lo está enviando
  47.     $datos = array (
  48.             'username' => $_POST ['username'],
  49.             'userdep' => $_POST ['depid']
  50.     );
  51.     // Proxima acción sera insertar
  52.     $action = "?insert";
  53.     // Obtener los departamentos
  54.     $form_select = getDepSelect ( $conexion, $_GET ['DOedit'] );
  55.     update ( $conexion, $_GET ['DOedit'], $datos );
  56.     $msg = "Registro {$_GET['DOedit']} actualizado ok...";
  57. } elseif (isset ( $_GET ['delete'] )) {
  58.     // Eliminar registro
  59.     delete ( $conexion, $_GET ['delete'] );
  60.     $msg = "Registro {$_GET['delete']} eliminado ok...";
  61. } else { // Ninguna opción seleccionada, hacer algo....
  62.     $msg = "Ninguna opción seleccionada...";
  63. }
  64.  
  65. // Mostrar datos, le falta un poco de onda pero se entiende, no?
  66. $query = select ( $conexion );
  67. echo "ELEMENTOS EN LA TABLA USERS<br>";
  68. if (mysql_num_rows ( $query )) {
  69.     $tabla = "<table>";
  70.     while ( $datos = mysql_fetch_assoc ( $query ) ) {
  71.         $tabla .= "<tr>";
  72.         $tabla .= "<td>{$datos['userid']} {$datos['username']} {$datos['depname']} <a href='?edit={$datos['userid']}'>Editar</a> <a onclick='return confirm(\"Seguro?\");' href='?delete={$datos['userid']}'>Eliminar</a> </td>";
  73.         $tabla .= "</tr>";
  74.     }
  75.     $tabla .= "</table>";
  76. }
  77. // Si no hay datos, mostrar mensaje
  78. echo isset ( $tabla ) ? $tabla : 'No hay datos.';
  79.  
  80. // Un formulario, las variables vienen de más arriba
  81. // Si es un modo edicion, mostrar los valores
  82. ?>
  83. <form method='post' action='<?=$form_action?>'>
  84.     <table width='300' border='0'>
  85.         <tr>
  86.             <td>Nombre</td>
  87.             <td><input type='text' name='username'
  88.                 value='<?=(count($reg)?$reg['username']:'')?>' /></td>
  89.         </tr>
  90.         <tr>
  91.             <td>Departamento</td>
  92.             <td><?=$form_select?></td>
  93.         </tr>
  94.         <tr>
  95.             <td colspan='2'><input type='submit' name='Submit' value='Enviar' />
  96.             </td>
  97.         </tr>
  98.     </table>
  99. </form>
  100. <!--  Si hay mensaje , mostrarlo -->
  101. <h5><?=$msg?></h5>
__________________
Fere libenter homines, id quod volunt, credunt.