Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] UPDATEs vacios

Estas en el tema de UPDATEs vacios en el foro de PHP en Foros del Web. Buenas tardes a todos, Soy novato con php y hasta ahora me he podido apañar yo solo pero he llegado en un punto que no ...
  #1 (permalink)  
Antiguo 29/03/2015, 09:39
Avatar de sven_uri  
Fecha de Ingreso: mayo-2011
Mensajes: 109
Antigüedad: 13 años
Puntos: 4
Pregunta UPDATEs vacios

Buenas tardes a todos,

Soy novato con php y hasta ahora me he podido apañar yo solo pero he llegado en un punto que no veo que estoy haciendo mal. Puede que vosotros veáis lo que yo no he conseguido ver aun, ya me diréis.

Problema: Tengo un formulario que a través de POO me hace un update a una tabla. Resulta que realmente el update lo está haciendo pero sustituyendo todos los valores que le paso por formulario como vacíos. De manera que parece que realmente sí que está haciendo el update pero no como debería. No sé si es el orden en que tengo situadas las instrucciones.

Nota: Recupera correctamente los valores del producto que se selecciona. El problema solo esta cuando se hace el update.
Nota 2: No devuelve ningún error.

A mi parecer, creo que en algún momento se pierden los valores, pero no entiendo el por qué.

Gracias por vuestro tiempo : )


Código:
Código PHP:
Ver original
  1. <?php
  2. $db = ASDatabase::getInstance();
  3.  
  4.     // Variable que envio para entrar en el producto pertinente
  5.    
  6.     $idProd= $_POST['form_idProd'];
  7.  
  8. $result = $db->select("SELECT intContador, strTipo FROM `tblcategorias` ORDER BY tblcategorias.strTipo ASC");
  9. $editarProd = $db->select(
  10.              "SELECT * FROM `tblprod` WHERE `intContador` = :id",
  11.               array ("id" => $idProd)
  12.           );
  13.  
  14.  
  15. foreach($editarProd as $InfoProd) {  
  16.     $id= $InfoProd['intContador'];
  17.     $nom = $InfoProd['strProd'];
  18.     $tipus = $InfoProd['idTipo'];
  19.     $url = $InfoProd['strUrl'];
  20.     $fort = $InfoProd['intFuerte'];
  21.     $imatge = $InfoProd['strImagen'];
  22.     $desc = $InfoProd['strDescripcion'];
  23.     $fecha = $InfoProd['fchFecha'];  
  24. }
  25.  
  26.  
  27. include 'templates/menu-izq-admin.php';
  28. ?>
  29.  
  30.               <div class="span9 profile-details-wrapper">
  31.                     <!-- main content here -->  
  32. <!------------------------------------ INICIO FORMULARIO -------------------------------------------->                
  33.                     <form class="form-horizontal" id="form-editar" name="form-editar" action="prod-lista.php" method="post">
  34.                         <fieldset>
  35.                        
  36.                         <!-- Form Name -->
  37.                         <legend><?php echo "EDITAR: "; ?></legend>
  38.                        
  39.                         <!-- INICIO NOMBRE -->
  40.                         <div class="control-group form-group">
  41.                           <label class="control-label col-lg-4" for="nom">
  42.                             <?php echo "Nombre"; ?>
  43.                           </label>
  44.                           <div class="controls col-lg-8">
  45.                             <input id="new_nom" name="new_nom" type="text" placeholder="Introduce el nombre..." class="input-xlarge form-control" value="<?php echo $nom ?>">
  46.                            
  47.                           </div>
  48.                         </div>
  49.                         <!-- FIN NOMBRE -->
  50.                          <!-- INICIO TIPO  -->
  51.                         <div class="control-group form-group">
  52.                           <label class="control-label col-lg-4" for="tipo">
  53.                             <?php echo "Qué es?"; ?>
  54.                           </label>
  55.                           <div class="controls col-lg-8">
  56.                            <select id="new_tipo" name="new_tipo" class="form-control" style="width: 100%;">
  57.                                 <option value="1" <?php if (!(strcmp(1, htmlentities($tipus, ENT_COMPAT, 'utf-8')))) {echo "SELECTED";} ?>>Servicio</option>
  58.                                 <option value="2" <?php if (!(strcmp(2, htmlentities($tipus, ENT_COMPAT, 'utf-8')))) {echo "SELECTED";} ?>>Producto</option>
  59.                                 <option value="3" <?php if (!(strcmp(3, htmlentities($tipus, ENT_COMPAT, 'utf-8')))) {echo "SELECTED";} ?>>Nada</option>
  60.                            </select>
  61.                           </div>
  62.                         </div>
  63.                         <!-- FIN TIPO  -->
  64.                         <!-- URL YOUTUBE -->
  65.                         <div class="control-group form-group">
  66.                           <label class="control-label col-lg-4" for="url">
  67.                             <?php echo "URL de Youtube"; ?>
  68.                           </label>
  69.                           <div class="controls col-lg-8">
  70.                             <input id="new_url" name="new_url" type="text" placeholder="Introduce la url del vídeo" class="input-xlarge form-control" value="<?php echo $url ?>">
  71.                            
  72.                           </div>
  73.                         </div>
  74.                         <!-- FIN URL YOUTUBE -->
  75.                         <!-- INICIO FUERTE-->
  76.                         <div class="control-group form-group">
  77.                           <label class="control-label col-lg-4" for="fuerte">
  78.                             <?php echo "Fuerte"; ?>
  79.                           </label>
  80.                           <div class="controls col-lg-8">
  81.                            <select id="new_fuerte" name="new_fuerte" class="form-control" style="width: 100%;">
  82.                                 <option value="0" <?php if (!(strcmp(0, htmlentities($fort, ENT_COMPAT, 'utf-8')))) {echo "SELECTED";} ?>>0</option>
  83.                                 <option value="1" <?php if (!(strcmp(1, htmlentities($fort, ENT_COMPAT, 'utf-8')))) {echo "SELECTED";} ?>>1</option>
  84.                                 <option value="2" <?php if (!(strcmp(2, htmlentities($fort, ENT_COMPAT, 'utf-8')))) {echo "SELECTED";} ?>>2</option>                 
  85.                            </select>
  86.                           </div>
  87.                         </div>
  88.                         <!-- FIN FUERTE-->
  89.                         <!-- INICIO IMAGEN -->                      
  90.                         <div class="control-group form-group">
  91.                           <label class="control-label col-lg-4" for="imagen">
  92.                             <?php echo "Imagen"; ?>
  93.                           </label>
  94.                           <div class="controls col-lg-8">
  95.                             <input id="new_imagen" name="new_imagen" type="text" placeholder="Selecciona una imagen" class="input-xlarge form-control" value="<?php echo $imatge ?>">  
  96.                           </div>
  97.                         </div>
  98.                         <!-- FIN IMAGEN -->
  99.                         <!-- DESCRIPCIÓN -->
  100.                         <div class="control-group form-group">
  101.                           <label class="control-label col-lg-4" for="desc">
  102.                             <?php echo "Descripción"; ?>
  103.                           </label>
  104.                           <div class="controls col-lg-8">
  105.                           <textarea id="new_desc" name="new_desc"><?php echo $desc ?></textarea>                          
  106.                           </div>
  107.                         </div>
  108.                         <!-- FIN DESCRIPCIÓN -->
  109.                         <!-- Button -->
  110.                         <div class="control-group form-group">
  111.                           <label class="control-label col-lg-4" for="subir"></label>
  112.                           <div class="controls col-lg-8">
  113.                             <button id="subir" name="subir" class="btn btn-primary" type="submit">
  114.                               <?php echo "Actualizar"; ?>
  115.                             </button>
  116.                             <a href="prod-lista.php">
  117.                             <button id="atras" name="atras" class="btn btn-primary" type="button" style="background-color:red">
  118.                               <?php echo "Volver atrás"; ?>
  119.                             </button>
  120.                           </a>                          </div>
  121.                         </div>
  122.                         <input type="hidden" name="MM_update" value="form-editar">
  123.                         </fieldset>
  124.                     </form>
  125. <!------------------------------------ FIN FORMULARIO  -------------------------------------------->        
  126. <?php
  127. if ((isset($_POST["MM_update"])) && ($_POST["MM_update"] == "form-editar"))
  128. {
  129. $new_nom = $_POST['new_nom'];
  130. $new_tipo = $_POST['new_tipo'];
  131. $new_url = $_POST['new_url'];
  132. $new_fuerte = $_POST['new_fuerte'];
  133. $new_imagen = $_POST['new_imagen'];
  134. $new_descripcion = $_POST['new_desc'];
  135.  
  136.  
  137. $db->update(
  138.      'tblprod',
  139.      array ( "strNom" => $new_nom,
  140.              "idTipo" => $new_tipo,
  141.              "strUrl" => $new_url,
  142.              "intFuerte" => $new_fuerte,
  143.              "strImagen" => $new_imagen,
  144.              "strDescripcion" => $new_descripcion ),
  145.      "intContador = :id",
  146.      array ("id" => $idProd)
  147. );
  148. }
  149. ?>
  #2 (permalink)  
Antiguo 29/03/2015, 09:52
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: UPDATEs vacios

La razón del problema la estas dando tu mismo, sólo que debes analizar con precisiónb lo que sucede...
Cita:
Tengo un formulario que a través de POO me hace un update a una tabla.
Los formularios no realizan UPDATEs a las tablas de una BBDD. Se usan para enviar la información al script que lo realiza.
Cita:
Resulta que realmente el update lo está haciendo pero sustituyendo todos los valores que le paso por formulario como vacíos.
No confundas: El UPDATE se está ejecutando, pero lo que se ejecuta es la sentnecia SQL. Ahora bien si está reemplazando todo por vacíos, la razón sólo puede ser una: Los datos no están llegando al scrpt que crea la sentencia y la ejecuta.

Cita:
De manera que parece que realmente sí que está haciendo el update pero no como debería.
El UPDATE se está haciendo como debe. Lo que no estás haciendo en PHP es validar que los datos realmente hayan llegado antes de crear el UPDATE.

Verifica los datos que llegan. Esa parte del script parece que no la estás posteando...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 29/03/2015, 12:27
Avatar de sven_uri  
Fecha de Ingreso: mayo-2011
Mensajes: 109
Antigüedad: 13 años
Puntos: 4
Respuesta: UPDATEs vacios

Buenas gnzsoloyo,

He revisado lo que me has comentado y los valores se envían correctamente. A la vez, he revisado que el id tenga valor (para que se cumpla la condición del where) y lo tiene.

Lo único que se me ocurre es que en mi sentencia del update ese $id no filtre bien. Para salir de dudas, he utilizado un id existente y se lo he marcado yo directamente (ej: 39) y no hace el update tampoco.

¿Alguna idea de dónde podría mirar?
  #4 (permalink)  
Antiguo 29/03/2015, 12:53
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: UPDATEs vacios

Dices que se envían correctamente, pero ¿se reciben correctamente?
No es lo mismo...

Postea solamente el script que recibe los datos, y donde se crea la query. Lo que si puedo asegurarte es que no estas validando la toma de datos.

Ten en cuenta que si no los inserta y pone vacío, es que el dato no existe en el momento de construir el UPDATE. No hay otra opción.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 29/03/2015, 14:25
Avatar de sven_uri  
Fecha de Ingreso: mayo-2011
Mensajes: 109
Antigüedad: 13 años
Puntos: 4
Respuesta: UPDATEs vacios

Los valores los recibo a partir de:

Código PHP:
Ver original
  1. //Esta variable me viene desde otra página. Lo único que hace es enviar el ID del // producto que quiero ver. He comprobado que llega con valor.
  2.  
  3. $idProd = $_POST['form_idProd'];
  4.  
  5. $editarProd = $db->select(
  6.              "SELECT * FROM `tblprod` WHERE `intContador` = :id",
  7.               array ("id" => $idProd)
  8.           );
  9.        
  10.  
  11. foreach($editarProd as $InfoProd) {  
  12.     $id= $InfoProd['intContador'];
  13.     $nom = $InfoProd['strCoctel'];
  14.     $tipus = $InfoProd['idTipo'];
  15.     $url = $InfoProd['strUrl'];
  16.     $fort = $InfoProd['intFuerte'];
  17.     $imatge = $InfoProd['strImagen'];
  18.     $desc = $InfoProd['strDescripcion'];
  19. }


Más tarde hago el update de la siguiente forma:

Código PHP:
Ver original
  1. if ((isset($_POST["MM_update"])) && ($_POST["MM_update"] == "form-editar"))
  2. {
  3. $new_nom = $_POST['new_nom'];
  4. $new_tipo = $_POST['new_tipo'];
  5. $new_url = $_POST['new_url'];
  6. $new_fuerte = $_POST['new_fuerte'];
  7. $new_imagen = $_POST['new_imagen'];
  8. $new_descripcion = $_POST['new_desc'];
  9.  
  10.  
  11. $db->update(
  12.      'tblproducto',
  13.      array ( "strProd" => $new_nom,
  14.              "idTipo" => $new_tipo,
  15.              "strUrl" => $new_url,
  16.              "intFuerte" => $new_fuerte,
  17.              "strImagen" => $new_imagen,
  18.              "strDescripcion" => $new_descripcion ),
  19.      "intContador = :id",
  20.      array ("id" => $idProd)
  21.      
  22.      
  23. );


Nota: Es curioso porque cuando hago el submit se envía todo lo que he escrito pero no llega a hacer el update. Creo saber por dónde van los problemas pero no veo por dónde seguir.


Gracias por tu tiempo gnzsoloyo : )
  #6 (permalink)  
Antiguo 29/03/2015, 14:59
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: UPDATEs vacios

1) ¿En qué momento verificas que estos $_POST tengan realmente datos:
Código PHP:
$new_nom $_POST['new_nom'];
$new_tipo $_POST['new_tipo'];
$new_url $_POST['new_url'];
$new_fuerte $_POST['new_fuerte'];
$new_imagen $_POST['new_imagen'];
$new_descripcion $_POST['new_desc']; 
En ninguna parte. Tu estás asumiendo que esos valores de $_POST están llegando con datos, pero no lo verificas.

2)¿Dónde está el código de ese update()?:
Código PHP:
$db->update(
     
'tblproducto',
     array ( 
"strProd" => $new_nom,
             
"idTipo" => $new_tipo,
             
"strUrl" => $new_url,
             
"intFuerte" => $new_fuerte,
             
"strImagen" => $new_imagen,
             
"strDescripcion" => $new_descripcion ),
     
"intContador = :id",
     array (
"id" => $idProd
Voy a asumir que se trata de algún recurso como PrestaShop (http://doc.prestashop.com/display/PS...s-update%28%29)..
¿Es eso lo que usas?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 30/03/2015, 06:22
Avatar de sven_uri  
Fecha de Ingreso: mayo-2011
Mensajes: 109
Antigüedad: 13 años
Puntos: 4
Respuesta: UPDATEs vacios

Buenos días gnzsoloyo,

He modificado un poco el código quedando de la siguiente forma:

Código PHP:
Ver original
  1. <?php
  2.  
  3.  
  4. if(isset($_POST['boton']))
  5. {
  6.    
  7.     //$new_nom = $_POST['new_nom'];
  8.     //$new_tipo = $_POST['new_tipo'];
  9.     //$new_url = $_POST['new_url'];
  10.     //$new_fuerte = $_POST['new_fuerte'];
  11.     //$new_imagen = $_POST['new_imagen'];
  12.     //$new_descripcion = $_POST['new_desc'];
  13.    
  14.     if($_POST['new_nom'] == '')
  15.     {
  16.         echo "Error: No existe el nombre"; 
  17.     }
  18.     else
  19.     {
  20.         $new_nom= $_POST['new_nom'];
  21.     }
  22.     if($_POST['new_tipo'] == '')
  23.     {
  24.         echo "Error: No existe el tipo";   
  25.     }
  26.     else
  27.     {
  28.         $new_tipo= $_POST['new_tipo'];
  29.     }
  30.     if($_POST['new_url'] == '')
  31.     {
  32.         echo "Error: No existe la URL";
  33.     }
  34.     else
  35.     {
  36.         $new_url= $_POST['new_url'];
  37.     }
  38.     if($_POST['new_fuerte'] == '')
  39.     {
  40.         echo "Error: No existe";   
  41.     }
  42.     else
  43.     {
  44.         $new_fuerte= $_POST['new_fuerte'];
  45.     }
  46.     if($_POST['new_imagen'] == '')
  47.     {
  48.         echo "Error: No existe la imagen"; 
  49.     }
  50.     else
  51.     {
  52.         $new_imagen= $_POST['new_imagen'];
  53.     }
  54.     if($_POST['new_desc'] == '')
  55.     {
  56.         echo "Error: No existe la descripción";
  57.     }
  58.     else
  59.     {
  60.         $new_descripcion= $_POST['new_desc'];
  61.     }
  62. }
  63. ?>

Sobre la segunda pregunta, compre un script solucionando estos temas para hacérmelo a medida y a la vez seguir practicando. Pero no es ningún Gestor de Contenidos como prestashop.

Lo saqué de aquí: http://mstojanovic.net/as/documentat...tabase_queries

Me he leído la poca documentación que ponen a tu disposición pero no consigo sacarlo.

He creado varias páginas de prueba y los valores parece que se imprimen bien. Pero sigo sin ver por qué me sustituye mis campos por campos vacíos.

Saludos,
  #8 (permalink)  
Antiguo 30/03/2015, 07:13
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: UPDATEs vacios

Y, seré curioso.... ¿qué resultado te dio la modificación?
La probaste?

COmo nota amdicional, ten en cuenta que cada una de esas validaciones debería al mismo tiempo impedir el update en caso de no cumplir.
¿Eso lo estás haciendo ahora?

Fuera de eso, según la decripcion de tu link, lo que hace es esto:
Cita:
UPDATE

Update method needs 4 parameters.

First one is database table that should be updated.

Second one is array where keys are names of columns that should be updated and values are new values for that column.

Third parameter is SQL WHERE query part. Remember that you need to use sql parameters for every variable that you want to pass to the query to prevent SQL Injection.

And fourth parameter is bind array with key => value pair for every sql parameter you have added into sql query.

So, if you want to update user's password, and you have $userId for that user, you can do it like this:
Código PHP:
Ver original
  1. $db->update(
  2.     'as_users',
  3.     array ( "password" => $newPassword ),
  4.     "user_id = :id",
  5.     array( "id" => $user_id )
  6.     );

This is actually converted to
Código PHP:
Ver original
  1. "UPDATE `as_users` SET `password` = '$newPassword' WHERE `user_id` = '$user_id'"

but we use PDO prepared statements to prevent SQL injection.
En ese sentido, el metodo construye la query que ejecutará con el array, lo que en definitiva es interesante. Pero lo que se hace evidente es que no contiene una rutina devalidación interna de los parametroz que se pasa, sino que lo crea con lo que reciba.
Esto quiere decir que, como te indiqué, si no validas lo que entra, simplemente te pondrá valores vacíos en los campos...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 30/03/2015 a las 07:19
  #9 (permalink)  
Antiguo 31/03/2015, 03:38
Avatar de sven_uri  
Fecha de Ingreso: mayo-2011
Mensajes: 109
Antigüedad: 13 años
Puntos: 4
Respuesta: UPDATEs vacios

Solucionado!

Me fije en lo que me habías comentado gnzsoloyo, efectivamente era que no recibía bien el ID al hacer la transición desde el formulario a la página con la lista de productos.

Creía estar controlándolo bien pero no, siento que mi cabezonería te haya hecho perder tiempo, aun así gracias por insistir y por supuesto, por tu tiempo.

Me he dado cuenta haciéndolo sin PDO y haciéndolo con instrucciones mysqli paso a paso como las hormigas jejeje.

Ya me funciona tanto en PDO como con mysqli.

Pregunta de curiosidad: Por temas de seguridad, entre PDO e instrucciones mysqli preparadas, ¿cuál es más segura?

¡Saludos!

Etiquetas: fecha, formulario, html, select, tabla, vacios, variable
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 16:30.