Foros del Web » Programando para Internet » PHP »

Actualizar varios Registros de un tabla relacional

Estas en el tema de Actualizar varios Registros de un tabla relacional en el foro de PHP en Foros del Web. Hola a todos como están verán tengo el siguiente problema al momento de actualizar una tabla que surge de una relación de muchos a muchos ...
  #1 (permalink)  
Antiguo 04/11/2015, 09:18
 
Fecha de Ingreso: abril-2015
Mensajes: 304
Antigüedad: 9 años, 8 meses
Puntos: 2
Actualizar varios Registros de un tabla relacional

Hola a todos como están verán tengo el siguiente problema al momento de actualizar una tabla que surge de una relación de muchos a muchos aquí mi tabla
Código MySQL:
Ver original
  1. CREATE TABLE `seg_pap_servicio` (
  2.   `seg_pap_id` int(11) DEFAULT NULL,
  3.   `jc_servicio_id` int(11) DEFAULT NULL,
  4.   `seg_pap_valor_venta` decimal(15,0) DEFAULT NULL,
  5.   KEY `seguimiento_pap_servicio` (`jc_servicio_id`),
  6.   KEY `seguimiento_pap_id` (`seg_pap_id`),
  7.   CONSTRAINT `seguimiento_pap_id` FOREIGN KEY (`seg_pap_id`) REFERENCES `seg_pap` (`seg_pap_id`),
  8.   CONSTRAINT `seguimiento_pap_servicio` FOREIGN KEY (`jc_servicio_id`) REFERENCES `servicio` (`jc_servicio_id`)
Aqui mi array para actualizar los campos de la tabla que por cada id con hasta 4
Código PHP:
Ver original
  1. $esp_data_pv[] = array('esp_programa' => $_POST['esp_programa_1'],'esp_valor_venta' => $_POST['esp_valor_venta_1']);
  2. $esp_data_pv[] = array('esp_programa' => $_POST['esp_programa_2'],'esp_valor_venta' => $_POST['esp_valor_venta_2']);
  3. $esp_data_pv[] = array('esp_programa' => $_POST['esp_programa_3'],'esp_valor_venta' => $_POST['esp_valor_venta_3']);
  4. $esp_data_pv[] = array('esp_programa' => $_POST['esp_programa_4'],'esp_valor_venta' => $_POST['esp_valor_venta_4']);
y por ultimo mi función que hace el query
Código PHP:
Ver original
  1. $query_es_pap_servicio = "UPDATE seg_pap_servicio SET seg_pap_id,jc_servicio_id,seg_pap_valor_venta WHERE";
  2.   for($esp=0;$esp<count($esp_data_pv);$esp++){
  3.     $query_es_pap_servicio.="(".$esp_id.",".$esp_data_pv[$esp]['esp_programa'].",'".$esp_data_pv[$esp]['esp_valor_venta']."'),";
  4.   }
  5.   $query_es_pap_servicio = substr($query_es_pap_servicio,0,strlen($query_es_pap_servicio)-1);
  6.   mysql_query($query_es_pap_servicio,$link)or die(mysql_error());
  7.   echo $query_es_pap_servicio;
EL PROBLEMA ESTA ES QUE SI ESTO ESTA BIEN PARA ACTUALIZA Ya que algo similar uso para la inserción O QUE OTRA MANERA DEBERÍA USAR

Última edición por BlackJccl1; 04/11/2015 a las 09:48
  #2 (permalink)  
Antiguo 04/11/2015, 09:55
 
Fecha de Ingreso: enero-2014
Mensajes: 36
Antigüedad: 10 años, 11 meses
Puntos: 4
Respuesta: Actualizar varios Registros de un tabla relacional

Bueno, lo primero que debo decirte es que controles y valides los datos que te llegan por $_POST.

Luego, según he entendido, tu problema está en que no sabes si es la mejor manera de hacer la actualización de datos, ¿correcto?

Yo creo que has hecho bien en anidar la actualización en una query, así haces menos conexiones a la base de datos.
  #3 (permalink)  
Antiguo 04/11/2015, 09:58
 
Fecha de Ingreso: abril-2015
Mensajes: 304
Antigüedad: 9 años, 8 meses
Puntos: 2
Respuesta: Actualizar varios Registros de un tabla relacional

Gracias por responder h la variables si las controlo como vez los envió por arreglos separados ahora en mi for que tengo no se como compara cada variable con los campos de la tabla claro que lo he probado y me sale error
  #4 (permalink)  
Antiguo 04/11/2015, 11:03
 
Fecha de Ingreso: abril-2015
Mensajes: 304
Antigüedad: 9 años, 8 meses
Puntos: 2
Respuesta: Actualizar varios Registros de un tabla relacional

Ahora lo estoy haciendo asi
Código PHP:
Ver original
  1. $query_es_pap_servicio = "UPDATE seg_pap_servicio SET ";
  2.   for($esp=0;$esp<count($esp_data_pv);$esp++){
  3.     $query_es_pap_servicio .= "jc_servicio_id = '".$esp_data_pv[$esp]['esp_programa']."', seg_pap_valor_venta = '".$esp_data_pv[$esp]['esp_valor_venta']."' ";
  4.   }
y el resultado es este
Código MySQL:
Ver original
  1. UPDATE seg_pap_servicio SET jc_servicio_id = '14', seg_pap_valor_venta = '9200' jc_servicio_id = '16', seg_pap_valor_venta = '8000' jc_servicio_id = '0', seg_pap_valor_venta = '0' jc_servicio_id = '0', seg_pap_valor_venta = '0'
Pues hasta hai todo bien lo que me falta es donde pongo el WHERE y que se haga el update por cada id
  #5 (permalink)  
Antiguo 04/11/2015, 16:19
 
Fecha de Ingreso: abril-2015
Mensajes: 304
Antigüedad: 9 años, 8 meses
Puntos: 2
Respuesta: Actualizar varios Registros de un tabla relacional

Ahora lo estoy probando así
Código PHP:
Ver original
  1. $query_es_pap_servicio = "UPDATE seg_pap_servicio SET ";
  2.   for($esp=0;$esp<count($esp_data_pv);$esp++){
  3.     $query_es_pap_servicio .= "(jc_servicio_id = '".$esp_data_pv[$esp]['esp_programa']."', seg_pap_valor_venta = '".$esp_data_pv[$esp]['esp_valor_venta']."' WHERE seg_pap_id = '$esp_id'),";
  4.   }
  5.   $query_es_pap_servicio = substr($query_es_pap_servicio,0,strlen($query_es_pap_servicio)-1);
  6.   mysql_query($query_es_pap_servicio,$link)or die(mysql_error());
  7.   echo $query_es_pap_servicio;
  8. }
me muestra el siguiente error
Código MySQL:
Ver original
  1. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(jc_servicio_id = '14', seg_pap_valor_venta = '9200' WHERE seg_pap_id = '36'),(j' at line 1
no se que este haciendo mal ayuda por favor
  #6 (permalink)  
Antiguo 05/11/2015, 09:47
 
Fecha de Ingreso: abril-2015
Mensajes: 304
Antigüedad: 9 años, 8 meses
Puntos: 2
Respuesta: Actualizar varios Registros de un tabla relacional

He visto otras soluciones en este foro y lo estoy haciendo casi igual pero no doy con la solución ayuda Por Favorrrr Llevo varios días con esto
  #7 (permalink)  
Antiguo 05/11/2015, 10:10
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Actualizar varios Registros de un tabla relacional

¿Para qué se supone que son esos paréntesis en el SET del UPDATE?:
Código SQL:
Ver original
  1. (jc_servicio_id =
Código SQL:
Ver original
  1. WHERE seg_pap_id = '$esp_id')

Ten en cuenta que el SQL tiene sus propias reglas de sintaxis, y cuando creas SQL dinamicamente con PHP, el SQL debe estar correctamente formado.

La prueba basica es simplemente no enviar a ejecutar algo antes de ver si está bien escrito...
Un simple echo o var_dump te evitaría la metida de pata:

Código PHP:
Ver original
  1. $query_es_pap_servicio = "UPDATE seg_pap_servicio SET ";
  2.       for($esp=0;$esp<count($esp_data_pv);$esp++){
  3.         $query_es_pap_servicio .= "(jc_servicio_id = '".$esp_data_pv[$esp]['esp_programa']."', seg_pap_valor_venta = '".$esp_data_pv[$esp]['esp_valor_venta']."' WHERE seg_pap_id = '$esp_id'),";
  4.       }
  5.     var_dump($query_es_pap_servicio);
  6.     }

Postea lo que te muestre.

Finalmente: UPDATE no hace actualizaciones masivas diferenciando cada ID. Tendrás que ejecutar uno a uno, o crear una tabla transaccional para hacerlo con un JOIN.
Pero es mas tema de BBDD que de PHP.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 05/11/2015, 10:54
 
Fecha de Ingreso: abril-2015
Mensajes: 304
Antigüedad: 9 años, 8 meses
Puntos: 2
Respuesta: Actualizar varios Registros de un tabla relacional

Hola y gracias por responder los parentecis solo los puse para probar pero claro un update dentro de mysql se realiza sin paracentesis bueno eso fue error mio al inicio del post puse la manera en la que se crea la tabla ademas menciones que nace de una relación de muchos a muchos pero bueno pondre como esta estructurada la tabla
Código MySQL:
Ver original
  1. seg_pap_id    jc_servicio_id    seg_pap_valor_venta
  2. 26                    17                  4500
  3. 26                18                      6000
  4. 26                0
  5. 26                0
y bueno también postee en los mensajes anteriores pero bueno colocare nuevamente el var_dump sin enviarlo para realizar el query
Código MySQL:
Ver original
  1. UPDATE seg_pap_servicio SET jc_servicio_id = '14', seg_pap_valor_venta = '9200' jc_servicio_id = '16', seg_pap_valor_venta = '8000' jc_servicio_id = '0', seg_pap_valor_venta = '0' jc_servicio_id = '0', seg_pap_valor_venta = '0'
como podras ver un mismo id tiene mas de un registro y en mi html los cargo cada id y los que cargo por separado son los campos siguiente que en este caso son jc_servicio_id y seg_pap_valor_venta porque es distinta la informacion que contiene cada uno de ellos por eso tambien coloque en mensajes anteriores de esta pregunta como lo estoy enviando para que luego se proceso pero bueno aqui esta
Código PHP:
Ver original
  1. $esp_data_pv[] = array('esp_programa' => $_POST['esp_programa_1'],'esp_valor_venta' => $_POST['esp_valor_venta_1']);
  2. $esp_data_pv[] = array('esp_programa' => $_POST['esp_programa_2'],'esp_valor_venta' => $_POST['esp_valor_venta_2']);
  3. $esp_data_pv[] = array('esp_programa' => $_POST['esp_programa_3'],'esp_valor_venta' => $_POST['esp_valor_venta_3']);
  4. $esp_data_pv[] = array('esp_programa' => $_POST['esp_programa_4'],'esp_valor_venta' => $_POST['esp_valor_venta_4']);
cada variable POST como puedes ver es distinto y obviamente contiene distinta informacion ahora lo he tratado es de actualizar estos cuatro campos como cuando hice la inserción claro que es distinto pero solo lo tome de ejemplo y asi quise hacer la actualización bueno aqui dejo como estoy haciendo la insercion
Código PHP:
Ver original
  1. $query_pap_servicio = "INSERT INTO seg_pap_servicio(seg_pap_id,jc_servicio_id,seg_pap_valor_venta) VALUES";
  2. for($ni=0;$ni<count($nsp_data_pv);$ni++){
  3.     $query_pap_servicio.="(".$seg_id_pap.",".$nsp_data_pv[$ni]['nsp_programa'].",'".$nsp_data_pv[$ni]['nsp_valor_venta']."'),";
  4.   }
  5.   $query_pap_servicio = substr($query_pap_servicio,0,strlen($query_pap_servicio)-1);
  6.   mysql_query($query_pap_servicio, $link) or die(mysql_error());
asi que pense que para la actualizacion podria hacer algo similar :(:(
  #9 (permalink)  
Antiguo 05/11/2015, 12:00
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Actualizar varios Registros de un tabla relacional

Cita:
quise hacer la actualización bueno aqui dejo como estoy haciendo la insercion
UPDATE e INSET tienen sintaxis diferente. No pueds hacer lo mismo.
Por eso te dije que hay dos opciones: O haces el UPDATE uno por uno a los registros, o creas una tabla temporal en MySQL para hacer masivamente el UPDATE usando JOIN.
Así como lo estás intentando está MAL y no te va a funcionar. Ni siquiera se puede parchar.... Ese código no sirve.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 05/11/2015, 12:48
 
Fecha de Ingreso: abril-2015
Mensajes: 304
Antigüedad: 9 años, 8 meses
Puntos: 2
Respuesta: Actualizar varios Registros de un tabla relacional

Bueno siguiendo tu recomendación si fuese uno por uno dejaria de hacer el arreglo osea esto
Código PHP:
Ver original
  1. $esp_data_pv[] = array('esp_programa' => $_POST['esp_programa_1'],'esp_valor_venta' => $_POST['esp_valor_venta_1']);
  2. $esp_data_pv[] = array('esp_programa' => $_POST['esp_programa_2'],'esp_valor_venta' => $_POST['esp_valor_venta_2']);
  3. $esp_data_pv[] = array('esp_programa' => $_POST['esp_programa_3'],'esp_valor_venta' => $_POST['esp_valor_venta_3']);
  4. $esp_data_pv[] = array('esp_programa' => $_POST['esp_programa_4'],'esp_valor_venta' => $_POST['esp_valor_venta_4']);
y por que cosa lo cambiaria
  #11 (permalink)  
Antiguo 05/11/2015, 13:20
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Actualizar varios Registros de un tabla relacional

¿Qué tiene que ver el array con el SQL?
Yo lo que te estoy itentado explciar es que no puedes poner un único UPATE para manipular registros diferentes.
Debes construir y ejecutar cada UPDATE dentro del FOR... Me parece que no es difícil de comprender.
Código PHP:
Ver original
  1. for($esp=0;$esp<count($esp_data_pv);$esp++){
  2.   $query_es_pap_servicio = "UPDATE seg_pap_servicio SET ";
  3.   $query_es_pap_servicio .= "jc_servicio_id = '".$esp_data_pv[$esp]['esp_programa']."', ";
  4.   $query_es_pap_servicio .= "seg_pap_valor_venta = '".$esp_data_pv[$esp]['esp_valor_venta']."'";
  5.   $query_es_pap_servicio .= " WHERE seg_pap_id = '$esp_id'";
  6.   mysql_query($query_es_pap_servicio,$link)or die(mysql_error());
  7. }
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #12 (permalink)  
Antiguo 05/11/2015, 14:42
 
Fecha de Ingreso: abril-2015
Mensajes: 304
Antigüedad: 9 años, 8 meses
Puntos: 2
Respuesta: Actualizar varios Registros de un tabla relacional

Pues eso que me mencionas lo intenta también y el resultado que obtuve fue este no se porque me toma esos valores
Código MySQL:
Ver original
  1. UPDATE seg_pap_servicio SET jc_servicio_id = '0', seg_pap_valor_venta = '0' WHERE seg_pap_id = '36'
mencione lo del array por que pense en un query por cada dos valores pero solo estaba equivocado, el resultado anterior es lo que me da luego de probar el codigo que mencionaste ojo que en los inputs del html estoy cambiando los valores
  #13 (permalink)  
Antiguo 05/11/2015, 14:46
 
Fecha de Ingreso: abril-2015
Mensajes: 304
Antigüedad: 9 años, 8 meses
Puntos: 2
Respuesta: Actualizar varios Registros de un tabla relacional

He probado nuevamente cambiando los valores en los cuatro inputs y por algún motivo toma los valores de los dos últimos es decir de los 8 valores que envió toma los dos ultimos algo asi
Código MySQL:
Ver original
  1. UPDATE seg_pap_servicio SET jc_servicio_id = '20', seg_pap_valor_venta = '80000000' WHERE seg_pap_id = '36'
claro usando este codigo
Código PHP:
Ver original
  1. for($esp=0;$esp<count($esp_data_pv);$esp++){
  2.   $query_es_pap_servicio = "UPDATE seg_pap_servicio SET ";
  3.   $query_es_pap_servicio .= "jc_servicio_id = '".$esp_data_pv[$esp]['esp_programa']."', ";
  4.   $query_es_pap_servicio .= "seg_pap_valor_venta = '".$esp_data_pv[$esp]['esp_valor_venta']."'";
  5.   $query_es_pap_servicio .= " WHERE seg_pap_id = '$esp_id'";
  6. }
  #14 (permalink)  
Antiguo 05/11/2015, 14:55
 
Fecha de Ingreso: abril-2015
Mensajes: 304
Antigüedad: 9 años, 8 meses
Puntos: 2
Respuesta: Actualizar varios Registros de un tabla relacional

Ahora lo probé asi
Código PHP:
Ver original
  1. $query_es_pap_servicio = "";
  2.   for($esp=0;$esp<count($esp_data_pv);$esp++){
  3.   $query_es_pap_servicio .=  "UPDATE seg_pap_servicio SET ";
  4.   $query_es_pap_servicio .= "jc_servicio_id = '".$esp_data_pv[$esp]['esp_programa']."', ";
  5.   $query_es_pap_servicio .= "seg_pap_valor_venta = '".$esp_data_pv[$esp]['esp_valor_venta']."'";
  6.   $query_es_pap_servicio .= " WHERE seg_pap_id = '$esp_id' ";
  7. }
y el resultado que obtengo es este
Código MySQL:
Ver original
  1. UPDATE seg_pap_servicio SET jc_servicio_id = '14', seg_pap_valor_venta = '9200' WHERE seg_pap_id = '36' UPDATE seg_pap_servicio SET jc_servicio_id = '22', seg_pap_valor_venta = '9000' WHERE seg_pap_id = '36' UPDATE seg_pap_servicio SET jc_servicio_id = '0', seg_pap_valor_venta = '0' WHERE seg_pap_id = '36' UPDATE seg_pap_servicio SET jc_servicio_id = '0', seg_pap_valor_venta = '0' WHERE seg_pap_id = '36'
pero que deberia hacer es separar cada Update o no

Etiquetas: mysql, registros, relacional, sql, tabla
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 08:54.