Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Update Mysql en PHP

Estas en el tema de Update Mysql en PHP en el foro de PHP en Foros del Web. Tengo el siguiente formulario y el script que procesa tal formulario. Formulario: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código HTML: Ver original < table width = "100%" >   ...
  #1 (permalink)  
Antiguo 30/09/2013, 19:33
Avatar de AnGuisi  
Fecha de Ingreso: julio-2013
Ubicación: San Felipe - Yaracuy
Mensajes: 122
Antigüedad: 10 años, 9 meses
Puntos: 2
Update Mysql en PHP

Tengo el siguiente formulario y el script que procesa tal formulario.

Formulario:
Código HTML:
Ver original
  1. <table width="100%">
  2.  
  3. <form id="busq" name="busq" action="controlador_modificar_hardware.php" method="POST">
  4.  
  5.     <tr>
  6.         <td>HARDWARE</td>
  7.         <td>MARCA</td>
  8.         <td>MODELO</td>
  9.         <td>TIPO</td>
  10.          <td>SERIAL</td>
  11.         <td>OBSERVACIONES</td>
  12.        
  13.       </tr>
  14.  
  15.       <?
  16.      
  17. foreach ($row as $datos) {
  18.       ?>
  19.        
  20.  
  21.       <tr>
  22.  
  23.  
  24.      
  25.    
  26.        
  27.      <td><input type="text" name="tipo[]" value="<? echo $datos['tipo_h']; ?>" disabled="disabled" /> </td>
  28. <td><input type="text" class="form" name="marca[]" value="<? echo $datos['marca']; ?>" disabled="disabled" /></td>
  29.        
  30.         <td><input type="text" class="form" name="modelo[]" value="<? echo $datos['modelo']; ?>" disabled="disabled" /></td>
  31.         <td><input type="text" class="form" name="tipo_nombre[]" value="<? echo $datos['tipo_nombre']; ?>" disabled="disabled" /></td>
  32.         <td><input type="text" class="form" name="serial[]" value="<? echo $datos['serial']; ?>" disabled="disabled" /></td>
  33.         <td><input type="text" class="form" name="observaciones_h[]" value="<? echo $datos['observaciones_h']; ?>" disabled="disabled" /></td>
  34.         <input type="text" class="form" name="id_hardware[]" value="<? echo $datos['id_hardware']; ?>" disabled="disabled" />              
  35.        
  36.    </tr>
  37.    
  38.      
  39.  
  40.       <?
  41.      
  42.        }
  43.        ?>
  44.  
  45.    
  46.        <input type="text" id="codigo" class="form" name="codigo" value="<? echo $datos['codigo']; ?>" disabled="disabled" />
  47.  
  48.  </form>  
  49.     </table>
  50.   </div>
  51.  </br>
  52.      <div align="center"><button id="activar" type="button" style="display:block;" onclick="mostrar_ocultar3('activar','modificar')">Modificar Registro</button></div>
  53.      </br>
  54.      
  55.      
  56.      <div align="center"><input type="submit" id="modificar" name="modificar" style="display:none;" value="Incluir Modificacion" /></div>
  57.      
  58.      </br></br>

Function:
Código PHP:
Ver original
  1. public function editar($datos = array()) {
  2.          
  3.          
  4.           while (true) {
  5.          
  6.           $tipo_nombre = current($tipo_nombre);
  7.           $serial = current($serial);
  8.           $observaciones_h = current($observaciones_h);
  9.          
  10.  
  11.                
  12.           if ($codigo != '') {
  13.               $query = "UPDATE `soptecvnzla`.`caracteristicas_hardware` SET serial = '$serial', observaciones_h = '$observaciones_h', tipo_nombre = '$tipo_nombre' WHERE codigo = '$codigo' AND id_hardware = '$id_hardware'";
  14.              
  15.      
  16.           $tipo_nombre = current($tipo_nombre);
  17.           $serial = current($serial);
  18.           $observaciones_h = current($observaciones_h);
  19.           $id_hardware = current($id_hardware);
  20.              
  21.         if($tipo_nombre === false && $serial === false && $observaciones_h === false && $id_hardware === false)
  22.         break;
  23.              
  24.               $mysqli = $this->abrir_conexion();
  25.               $result = $mysqli->query($query);
  26.           }
  27.            
  28.               if (!$result) {
  29.                 echo "error".$mysqli->error;
  30.             }
  31.             return $result;
  32.           }

El problema esta en que no me modifica, me causa error. Como pueden observar intento hacer un ciclo de UPDATE mientras reciba los valores de los arrays en el formulario.

Creo que el error esta tambien en la funcion extract puesto que esta recibe otros arrays. Agradezco de antemano cualquier ayuda.
  #2 (permalink)  
Antiguo 30/09/2013, 19:54
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Update Mysql en PHP

Todos tus campos están disabled, por esa razón no se enviarán jamás.

Si tu intención es evitar que los modifiquen debes usar el atributo readonly y no disabled.

Además no se ve por ningún lugar como accedes a las variables de $_POST como debería ser, consulta el manual: http://www.php.net/variables.external

También toma en cuenta que tus comparaciones estrictas tampoco funcionarán si no las conviertes apropiadamente, la razón es simple: todo valor recibido por formulario o URL (método GET) es de tipo string, y ningún otro tipo más.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 30/09/2013, 20:26
Avatar de AnGuisi  
Fecha de Ingreso: julio-2013
Ubicación: San Felipe - Yaracuy
Mensajes: 122
Antigüedad: 10 años, 9 meses
Puntos: 2
Respuesta: Update Mysql en PHP

Las variables las recibo en otro archivo y las paso en forma de array que extraigo con extract Mientras los campos se activan por un boton y una funcion javascript; el problema esta en lo que engloba el while
  #4 (permalink)  
Antiguo 30/09/2013, 20:50
 
Fecha de Ingreso: julio-2013
Ubicación: México
Mensajes: 361
Antigüedad: 10 años, 8 meses
Puntos: 55
Respuesta: Update Mysql en PHP

hola, es la primera vez que veo que alguien intenta recorrer un array con current(); desde mi punto de vista seris mas fácil utilizar foreach().

No veo en donde avanzas el puntero para trabajar con el siguiente elemento del array. Asi como lo tienes unicamente trabajas con un elemento; encerio veo medio retorcida la lógica.

Mi punto de vista perdonsal, a lo mejor me equivoco.
Saludos.
  #5 (permalink)  
Antiguo 30/09/2013, 20:50
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Update Mysql en PHP

Cita:
Iniciado por AnGuisi Ver Mensaje
Las variables las recibo en otro archivo y las paso en forma de array que extraigo con extract Mientras los campos se activan por un boton y una funcion javascript; el problema esta en lo que engloba el while
¿Y cómo esperabas que adivináramos todo eso que dices?

Lo que es no saberse explicar, mal ahí.

Por otro lado, el problema, tal vez, sea el uso de current(), seguramente la estás usando de una forma (que no vemos si acaso haces algo más y no lo dices) correcta:

Código PHP:
Ver original
  1. // suponiendo que tienes un array de datos
  2. $transport = array('foot', 'bike', 'car', 'plane');
  3.  
  4. // MAL (así lo haces)
  5. $foot = current($foot); // Warning: ...
  6. $bike = current($bike); // Warning: ...
  7.  
  8. // BIEN
  9. $mode = current($transport); // $mode = 'foot';

¿Se entiende?

Edito: definitivamente un foreach() es la mejor solución si $data es un array asociativo o un objeto.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #6 (permalink)  
Antiguo 30/09/2013, 21:08
Avatar de AnGuisi  
Fecha de Ingreso: julio-2013
Ubicación: San Felipe - Yaracuy
Mensajes: 122
Antigüedad: 10 años, 9 meses
Puntos: 2
Respuesta: Update Mysql en PHP

Si pues he fallado en no saber explicarme.
En el name de los campos del formulario como pueden ver esta por ejemplo: name="marca[]" puesto que recibire mas de una marca por lo que lo trato como arreglo.

Esta es la parte del script donde recibo estos datos:

Código PHP:
Ver original
  1. $datos = array();
  2.    
  3.     foreach ($_POST as $clave => $valor) {
  4.         $datos[$clave]=$valor;
  5.                                          }

Puesto a que recibo muchas marca ejemplo:
marca[0], marca[1]...

Luego el array $datos lo paso como parametro al script anteriormente señalado. Luego la idea de recorrerlo de esa forma la tomo de este script posteado por el compañero Gatorv

Código PHP:
Ver original
  1. Ver original
  2. <?php
  3. $items1 = array( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 );
  4. $items2 = array( 2, 4, 6 );
  5. $items3 = array( 10, 20, 30, 40 );
  6. $items4 = array( 100, 200, 300, 400, 500, 600, 700 );
  7.  
  8. echo "<table border=1><tr>";
  9. while(true) {
  10.     // Fetch Values
  11.     $item1 = current($items1);
  12.     $item2 = current($items2);
  13.     $item3 = current($items3);
  14.     $item4 = current($items4);
  15.    
  16.     // Print Values
  17.     echo "<td>" . (( $item1 !== false) ? $item1 : "&nbsp;") . "</td>";
  18.     echo "<td>" . (( $item2 !== false) ? $item2 : "&nbsp;") . "</td>";
  19.     echo "<td>" . (( $item3 !== false) ? $item3 : "&nbsp;") . "</td>";
  20.     echo "<td>" . (( $item4 !== false) ? $item4 : "&nbsp;") . "</td>";
  21.    
  22.     // Up! Next Value
  23.     $item1 = next( $items1 );
  24.     $item2 = next( $items2 );
  25.     $item3 = next( $items3 );
  26.     $item4 = next( $items4 );
  27.    
  28.     // Check terminator
  29.     if($item1 === false && $item2 === false && $item3 === false && $item4 === false) break;
  30.     echo "</tr><tr>";
  31. }
  32. echo "</tr></table>";
  33.  
  34. echo sprintf("Done! Max array size is %s.", get_max_count($items1, $items2, $items3, $items4));
  35.  
  36. function get_max_count() {
  37.     $nMax = 0;
  38.     foreach(func_get_args() as $param ) {
  39.         if(is_array($param)) {
  40.             $nSize = count($param);
  41.             if($nSize > $nMax) {
  42.                 $nMax = $nSize;
  43.             }
  44.         }
  45.     }
  46.    
  47.     return $nMax;
  48. }

El cual señala como recorrer varios arrays, puesto a que los formularios en mi caso son arrays como bien señado en el name.

Creo que ahora si podrian ayudarme mas en que es lo que esta fallando en mi script.
  #7 (permalink)  
Antiguo 30/09/2013, 21:15
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Update Mysql en PHP

Bien, al menos tienes una base clara, sólo que con un detalle mínimo.

Código PHP:
Ver original
  1. // GatorV
  2. $item1 = current($items1);
  3.  
  4. // tú
  5. $tipo_nombre = current($tipo_nombre);

¿Notas la diferencias?

(y no, no es el nombre de la variable)

En el ejemplo inicial se usa $items1 (plural) e $item1 (singular) para denotar que se extrae el elemento actual de la colección anterior.

Por otro lado tampoco estás avanzando el cursor con next() como ya te han dicho.

No te queda mas que leer bien y repasar el ejercicio.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #8 (permalink)  
Antiguo 30/09/2013, 21:46
 
Fecha de Ingreso: julio-2013
Ubicación: México
Mensajes: 361
Antigüedad: 10 años, 8 meses
Puntos: 55
Respuesta: Update Mysql en PHP

Hola, te dejo un pequeño ejemplo de como lo podrias realizar.
No esta completo, es para que lo tu lo complementes.

NO USAR extract(). Hay una enorme advertencia en el manual. Revisalo.

Código PHP:
Ver original
  1. //a la funcion le envias tu conjunto de variables recibidas en forma de array.
  2.     public function editar($id_s,$marca_s,$tipo_s) {
  3.         foreach($id_s as $key => $id){
  4.             //utilizamos la %key de $id, ya que es una fila y al generarse se otorga la mima $key a los elementos de la fila, "para el caso específico que planteas".
  5.             $marca=$marca_s[$key];
  6.             $tipo=$tipo_s[$key];
  7.             //los datos deben ser escapados antes de introducirse a la sentencia sql, para evitar inyecciones.
  8.             //Por lo menos mysql_real_scape_string()
  9.            
  10.             $query = "UPDATE `soptecvnzla`.`caracteristicas_hardware`
  11.             SET serial = '$serial',
  12.             observaciones_h = '$observaciones_h',
  13.             tipo_nombre = '$tipo_nombre'
  14.             WHERE codigo = '$codigo'
  15.             AND id_hardware = '$id_hardware'";
  16.            
  17.             //ejecucion de consulta
  18.         }
  19.     }

Saludos
  #9 (permalink)  
Antiguo 30/09/2013, 21:48
Avatar de AnGuisi  
Fecha de Ingreso: julio-2013
Ubicación: San Felipe - Yaracuy
Mensajes: 122
Antigüedad: 10 años, 9 meses
Puntos: 2
Respuesta: Update Mysql en PHP

Pff que poco detallista he sido.
Ya he solucionado ese detalle y me reconoce todos los valores de los arrays.
Ahora solo me hace UPDATE al primer conjunto de valores, he probado el next() y funciona perfectamente. El problema creo que esta en la ejecucion de la sentencia sql. Solo se ejecuta una vez. Creo que es cuestión de colocacion del mysqli->query o quizas deba utilizar mysqli->multi_query? Aunque lo probé e igual no me ha funcionado.


Muchas gracias amigo Erick_MD9 muy bueno lo que me planteas y mas sencillo, aunque ya mi script funciono y pues tomare en cuenta lo que dices.
Pero como digo el problema ahora lo tengo a la hora de la ejecucion de la sentencia. Pues esta al tomar varios valores tambien debe ejecutarse varias veces.
  #10 (permalink)  
Antiguo 01/10/2013, 10:13
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Update Mysql en PHP

El Script que diseñe, es para listar arrays que no tienen la misma longitud, en una tabla, es solo un concepto, para lo que quieres hacer, no lo deberías de utilizar ya que tus tablas son lineales, para eso sí debes de ciclar cada campo con un valor común, lo recomendable es hacer algo así:
Código PHP:
Ver original
  1. // suponiendo que tienes múltiples arrays con datos $codigos, $nombres, $seriales, etc
  2. $query = "UPDATE foo SET `nombre`=?, `serial`=? WHERE `codigo`=?";
  3. $stmt = $link->prepare($query);
  4. $stmt->bind_param('sss', $nombre, $serial, $codigo);
  5.  
  6. foreach ($codigos as $n => $codigo) {
  7.       $nombre = $nombres[$n];
  8.       $serial = $seriales[$n];
  9.  
  10.       $stmt->execute();
  11. }
  12. $stmt->close();

Saludos.
  #11 (permalink)  
Antiguo 01/10/2013, 14:49
Avatar de AnGuisi  
Fecha de Ingreso: julio-2013
Ubicación: San Felipe - Yaracuy
Mensajes: 122
Antigüedad: 10 años, 9 meses
Puntos: 2
Respuesta: Update Mysql en PHP

Lo hice de esta forma y el Update me sigue dando error.


He aquí el código.

Código PHP:
Ver original
  1. public function editar($datos = array()) {
  2.          
  3.          
  4.           extract($datos);
  5.              
  6.           if ($codigo != '') {
  7.               $query = "UPDATE `soptecvnzla`.`caracteristicas_hardware` SET serial = ?, observaciones_h = ?, tipo_nombre = ? WHERE codigo = ?";
  8.              
  9.               $mysqli = $this->abrir_conexion();
  10.               $stmt = $mysqli->prepare($query);
  11.              
  12.               $stmt->bind_param("ssss", $serialx, $observaciones_hx, $tipo_nombrex, $codigo);
  13.  
  14. foreach ($serial as $n => $serialx) {
  15.       $observaciones_hx = $observaciones_h[$n];
  16.       $tipo_nombrex = $tipo_nombre[$n];
  17.       $id_hardwarex = $id_hardware[$n];
  18.  
  19.       $stmt->execute();
  20. }
  21. $stmt->close();
  22.              
  23.              
  24.              
  25.           }
  26.          
  27.              
  28.           }

Última edición por AnGuisi; 01/10/2013 a las 15:00
  #12 (permalink)  
Antiguo 01/10/2013, 15:05
Avatar de AnGuisi  
Fecha de Ingreso: julio-2013
Ubicación: San Felipe - Yaracuy
Mensajes: 122
Antigüedad: 10 años, 9 meses
Puntos: 2
Respuesta: Update Mysql en PHP

Llevado por la emoción del momento me he equivocado a la hora de decir que mi tema está solucionado y luego de varias pruebas me he dado cuenta de que aun no he encontrado solución a mi problema.

Resulta que ahora solo me modifica el primer conjunto de resultados que recibo y sabiendo que el ciclo foreach si recoje todos los resultados pues ya he probado eso.

He aqui mi script:

Código PHP:
Ver original
  1. public function editar($datos = array()) {
  2.          
  3.          
  4.           extract($datos);
  5.            
  6.           if ($codigo != '') {
  7.               $query = "UPDATE `soptecvnzla`.`caracteristicas_hardware` SET serial = ?, observaciones_h = ?, tipo_nombre = ? WHERE id_hardware = ? AND codigo = ?";
  8.              
  9.               $mysqli = $this->abrir_conexion();
  10.               $stmt = $mysqli->prepare($query);
  11.               if (!$stmt) {
  12.               echo "Falló la preparación: (" . $mysqli->errno . ") " . $mysqli->error;
  13.               }
  14.              
  15.               if(!$stmt->bind_param("sssss", $serialx, $observaciones_hx, $tipo_nombrex,$id_hardwarex,$codigox)) {
  16.                    echo "Falló la vinculación de parámetros: (" . $mysqli->errno . ") " . $mysqli->error;
  17.                                                                                                    }
  18.              
  19. foreach ($codigo as $n => $codigox) {
  20.       $observaciones_hx = $observaciones_h[$n];
  21.       $tipo_nombrex = $tipo_nombre[$n];
  22.       $id_hardwarex = $id_hardware[$n];
  23.       $serialx = $serial[$n];
  24.      
  25.  
  26.       if (!$stmt->execute()) {
  27.     echo "Falló la ejecución: (" . $mysqli->errno . ") " . $mysqli->error;
  28. }
  29. else {
  30.     return true;
  31.      }
  32. }
  33.  
  34.      
  35.           }
  36.           $stmt->close();
  37.       }

Creo que el problema puede estar reflejado en la sentencia mysql, pero no estoy seguro. Lo cierto es que solo me modifica el primer campo y los otros no.
Recuerden lo que antes señale sobre que el id_hardware me indica a que componente pertenecen las caracteristicas : serial, observaciones_h y tipo_nombre mientras el codigo engloba todos los componentes en general. Es un mismo codigo para todas las caracteristicas pero cada una de ella tiene id_hardware diferentes, esto podria ayudar a entender mejor mi problema fijense en la sentencia mysql, ¿Es la adecuada para el caso?

Agradecería a algún moderador pudiera cambiar mi tema y quitarle el marcado de solucionado para que otros usuarios puedan seguir comentando. Es un proyecto de la universidad que realmente me tiene casi loco

Última edición por AnGuisi; 01/10/2013 a las 22:54
  #13 (permalink)  
Antiguo 02/10/2013, 20:32
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Update Mysql en PHP

¿Que datos tienes en $datos?
  #14 (permalink)  
Antiguo 02/10/2013, 20:37
Avatar de AnGuisi  
Fecha de Ingreso: julio-2013
Ubicación: San Felipe - Yaracuy
Mensajes: 122
Antigüedad: 10 años, 9 meses
Puntos: 2
Respuesta: Update Mysql en PHP

$codigo que no es un array ya que es general para todos los componentes.

$id_hardware que es un array con todos los $id_hardware
$serial todos los seriales
$observaciones las observaciones todas y
$tipo_nombre array tambien.

Lo que si note es que haciendo echo a algunos de estos arrays dentro del foreach solo me muestra una clave y un valor y no todos los q trae como deberia de ser.
  #15 (permalink)  
Antiguo 02/10/2013, 21:10
Avatar de AnGuisi  
Fecha de Ingreso: julio-2013
Ubicación: San Felipe - Yaracuy
Mensajes: 122
Antigüedad: 10 años, 9 meses
Puntos: 2
Respuesta: Update Mysql en PHP

Ahora si lo he solucionado haciendolo de esta forma:
Código PHP:
Ver original
  1. public function editar($datos = array()) {
  2.          
  3.          
  4.           extract($datos);
  5.            
  6.           if ($codigo != '') {
  7.               $query = "UPDATE `soptecvnzla`.`caracteristicas_hardware` SET serial = ?, observaciones_h = ?, tipo_nombre = ? WHERE id_hardware = ?";
  8.              
  9.               $mysqli = $this->abrir_conexion();
  10.               $stmt = $mysqli->prepare($query);
  11.               if (!$stmt) {
  12.               echo "Falló la preparación: (" . $mysqli->errno . ") " . $mysqli->error;
  13.               }
  14.              
  15.               if(!$stmt->bind_param("ssss", $serialx, $observaciones_hx, $tipo_nombrex,$id_hardwarex)) {
  16.                    echo "Falló la vinculación de parámetros: (" . $mysqli->errno . ") " . $mysqli->error;
  17.                                                                                                    }
  18.                                                                                                  
  19.              
  20. foreach ($id_hardware as $n => $id_hardwarex) {
  21.    
  22.       $observaciones_hx = $observaciones_h[$n];
  23.       $tipo_nombrex = $tipo_nombre[$n];
  24.       $serialx = $serial[$n];
  25.       echo $n;
  26.     echo $id_hardwarex;
  27.  
  28.       $stmt->execute();
  29.      
  30.      
  31.  
  32.      
  33.           }
  34.           $stmt->close();
  35.       }
  36.       }

El problema al parecer estaba en la parte del script anterior:
Código PHP:
if (!$stmt->execute()) {
    echo 
"Falló la ejecución: (" $mysqli->errno ") " $mysqli->error;
}
else {
    return 
true;
     } 
Pero no entiendo el por que eso afectaba y solo me hacia update el primer conjunto de datos.
  #16 (permalink)  
Antiguo 03/10/2013, 10:11
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Update Mysql en PHP

Eso es porque al hacer el return true; terminabas la ejecución de tu método, el return siempre va a terminar la ejecución de la función actual, por eso solamente pasaba una vez por el foreach.

Saludos.

Etiquetas: formulario, mysql, registro, sql, update
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:40.