Foros del Web » Programando para Internet » PHP »

Update parcial

Estas en el tema de Update parcial en el foro de PHP en Foros del Web. Hola a todos. Tengo un problema que no sé cómo solucionar. Tengo una tabla con 42 campos. Selecciono una parte de ellos y los muestro ...
  #1 (permalink)  
Antiguo 02/12/2004, 13:31
 
Fecha de Ingreso: mayo-2004
Mensajes: 393
Antigüedad: 13 años, 6 meses
Puntos: 0
Pregunta Update parcial

Hola a todos.

Tengo un problema que no sé cómo solucionar.

Tengo una tabla con 42 campos. Selecciono una parte de ellos y los muestro en pantalla.

Lo que pretendo es actualizar sólo los campos que el usuario quiera y que el resto no se modifique.

La sentencia:

$sSQL="UPDATE tabla Set var1='$va1,var2='$var2' WHERE id='$id'";
mysql_db_query("BD",$sSQL);

es la que siempre uso, pero claro, actualiza las variables que se indican en ella
(var1 y var2).

Lo que busco es la forma de que va1, var2...varN sean determinadas por el usuario.

Creo que ha de ser posible, pero ni idea de por donde empezar.....

Gracias por vuestra ayuda.
  #2 (permalink)  
Antiguo 02/12/2004, 14:12
 
Fecha de Ingreso: noviembre-2003
Ubicación: Veracruz
Mensajes: 131
Antigüedad: 14 años, 1 mes
Puntos: 0
Disculpa tal vez ando un poco distraido pero podrias explicarte un pokito mas.....para poder ayudarte...
Saludos
  #3 (permalink)  
Antiguo 02/12/2004, 14:15
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Tengo una tabla con 42 campos. Selecciono una parte de ellos y los muestro en pantalla

¿Y esos campos que seleccionas .. los tienes el algún sitio ya: un array o similar .. como para poder asignar ese nombre de tu campo de tu formulario (de tu elemento del formulario) con el nombre del campo que corresponde en tu tabla implicada de tu BD?

Un saludo,
  #4 (permalink)  
Antiguo 03/12/2004, 03:12
 
Fecha de Ingreso: mayo-2004
Mensajes: 393
Antigüedad: 13 años, 6 meses
Puntos: 0
Código.

Perdonad por no haber puesto más información.

Para extraer los datos (pongo sólo cuatro registros para no hacerlo largo):

La variable $id me llega pues está registrada anteriormente.
<?php
//abro una sesión
session_start();
//Conecto a DB
$sql= mysql_query("SELECT * FROM tabla where id= '$id'");
while ($row = mysql_fetch_array($sql) )
{
$id = $row[id];
$cliente = $row[cliente];
$titulo = $row[titulo];
$domicilio = $row[domicilio];
session_register('id');
session_register('cliente);
session_register('titulo');
session_register('domicilio);
//Muestro en pantalla
echo "<table>
<tr>
<td><a href=\"destino.php?id=$id&cliente=$cliente&titulo= $titulo&domicilio=$domicilio\">
$titulo</a>
<td>$cliente</td>
<td>$domicilio</td>
</form>
</table>";
?>

Desde el resultado de esta consulta puedo acceder a un cliente determinado pulsando sobre la línea titulo.
Al hacerlo me lleva a destino.php que tiene esta estructura:

destino.php
//esto me muestra los datos del cliente seleccionado
<?php
include ("estilo.php");
$_SESSION['id']=$_GET['id];
$_SESSION['titulo']=$_GET['titulo'];
$_SESSION['cliente']=$_GET['cliente'];
$_SESSION['domicilio']=$_GET['domicilio];
echo"<table>
<tr>
<td>$titulo</td>
<td>$cliente</td>
<td>$domicilio</td>
</tr>
</table>";
//en esta parte se introducen los nuevos datos que se envían a modifica.php
echo"<table>
<form action=modifica.php\" method=\"POST\">
<input type=\"hidden\" name=\"id\" value=\"$id\">
<tr>
<td>
<center>Titulo</center><br>
<input type=\"text\" size=\"25\" name=\"titulo\" maxlength=\"50\">
</td>
<td>
<center>Cliente</center><br>
<input type=\"text\" size=\"25\" name=\"cliente\" maxlength=\"50\">
</td>
<td>
<center>Domicilio</center>
<input type=\"text\" size=\"25\" name=\"domicilio\" maxlength=\"50\">
</td>
<td>
<center><INPUT TYPE=\"submit\" VALUE=\"Actualizar\"></center>
</td>
</form>
</table>";
?>

modifica.php

<php
$sSQL="UPDATE tabla SET titulo='$titulo', cliente='$cliente', domicilio='$domicilio',WHERE id='$id'";
mysql_db_query("BD",$sSQL);
mysql_close($conn);
?>

Todo funciona perfectamente (si veis algún fallo de sintaxis es por el copia-pega-recorta que he hecho). Otra cosa sería si estructuralmente es lo más correcto.

Como veis, si el cliente quiere modificar algún dato, lo hace en destino.php y lo envía a modifica.php que actualiza la tabla con lo nuevo que recibe.

Si el cliente no rellena todos los datos, el update modifica los datos que ha cumplimentado y elimina los que había antes. Como el cliente le envía campos en blanco, estos quedan borrados.

Lo que quisiera es que el update de la tabla se hiciera solo con los datos que el cliente modifica y que los que ya hay y no escribe que quedaran igual.

Lo ideal sería que sus datos le aparecieran en campos tipo
<input type=\"text\" name=\"\" > y que sobre ellos modificara lo que quisiera y lo enviara. Pero me comformo con que no tenga que reescribirlo todo.

Muchas gracias por anticipado por vuestra ayuda.
Cordiales saludos.
  #5 (permalink)  
Antiguo 03/12/2004, 06:42
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Un detalle al margen de tu problema puntual:

¿para que registras unas variables en una sesión .. y luego igualmente las propagas por el URL?

Me refiero a esto:
Código PHP:
$id $row[id];
$cliente $row[cliente];
$titulo $row[titulo];
$domicilio $row[domicilio];
session_register('id');
session_register('cliente);
session_register('
titulo');
session_register('
domicilio);
//Muestro en pantalla
echo "<table>
<tr>
<td><a href=\"destino.php?id=$id&cliente=$cliente&titulo=$titulo&domicilio=$domicilio\"> 
De hecho en destino.php deberías tomar esas variables de la sesión .. no del URL .. por ende están de más en el URL:
><a href=\"destino.php?id=$id&cliente=$cliente&titulo= $titulo&domicilio=$domicilio\">

En resumen .. o propagas tus variables por el URL o por sesiones .. pero no tiene sentido hacerlo en ambos casos.

El uso de sesiones que haces es incompatible . .no puedes usar session_register() para crear una variable de sesión. Debes usar los arrays superglobales:

$_SESSION['nombre_variable']="valor";

a su vez no olvidar usar session_star() antes de hacer esas asignaciones.

Por otro lado en destino.php no sé si haces session_start() .. pues lo requieres para intentar acceder a las variables de sesión en $_SESSION.

------------------

Sobre tu problema puntual .. lo que se suele hacer en esos casos es presentar en tu formulario HTML todos los campos con sus valores pre-establecidos (usando la propiedad value="" de los mismos) para que tomen el valor original y hacer un "update" a todos los campos de tu tabla .. los que modifiques así se veran afectados y los que no modifiques quedaran con el valor que tenían (re-escribiendose).

Esto puede ser "engorroso" hacerlo ..pero lo haces una sola vez. Tal vez implementar una función que vía arrays por ejemplo o las funciones de Mysql própias veas los nombres de los campos de la tabla y asignes con los valores de tu formulario "tal vez" por orden numérico .. o algo así te complique mas pero podrías intentarlo.

Un saludo,
  #6 (permalink)  
Antiguo 03/12/2004, 07:04
 
Fecha de Ingreso: mayo-2004
Mensajes: 393
Antigüedad: 13 años, 6 meses
Puntos: 0
Sonrisa Gracias Cluster

Gracias por tu respuesta.

Había intentado modificar los valores tal como dices, asignando como value el valor de la variable (/value=\"$titulo\"), por ejemplo. Así me escribía el valor en el campo. Pero a la hora de modificar sólo incluía los valores que el cliente reescribía.

Con los consejos sobre el paso de variables que me has dado, probaré de nuevo , pués seguro que algo que hago ahora confunde al script.

Ya te diré.

Cordiales saludos.
  #7 (permalink)  
Antiguo 04/12/2004, 04:58
 
Fecha de Ingreso: mayo-2004
Mensajes: 393
Antigüedad: 13 años, 6 meses
Puntos: 0
Una precisión

Hola.

Seguí tus consejos, Cluster, y modifiqué el código para que no hubiese incompatibilidades. Todo perfecto.

Lo que no he resuelto es el problema central, posiblemente proque me expliqué mal. Ahora lo aclaro.

La tabla que contiene los 42 campos está llena con una línea por cliente.

Lo que busco es la manera de mostrar al cliente algunos registros y que sobre ellos mismos reescriba los que hayan cambiado y se actualicen en la tabla, sin que el resto de registros mostrados se modifique.

Para explicarme mejor pongo un ejemplo imaginado:
______________________________________
Estos son sus datos:
Cliente:XXXXX
Domicilio:XXXXXX
Teléfono:XXXXXX
Banco:XXXXXX
Cuenta:XXXXXX

Modifique los datos que no sean correctos y pulse Enviar.
_______________________________________

El cliente cambia Teléfono: XXXXXX por YYYYYY, y pulsa Enviar

Se modifica sólo el campo teléfono y los que no ha tocado quedan igual que estaba.


En definitiva, lo que busco es recoger el valor de las variables que muestro en un campo formulario.

Lo he probado así:

<input type=\"text\" name=\"telefono\" value=\"$telefono\">
y claro, aparece el teléfono actual, se puede reescribir, pero el valor que envía es el de $telefono, que no se ha modificado. Total, que no cambia nada.

La manera en que me funciona es si pongo:

<TEXTAREA rows=\"1\" name=\"telefono\">$telefono</textarea>

De esta forma,muestra el valor de la variable pero al no asignarle previamente valor (no hay value) a la variable, la modifica al pulsar Enviar.

Pero los campos textarea no me parecen lo más adecuado. Por eso busco la otra solución o alguna parecida.

Gracias de nuevo por atenderme.
  #8 (permalink)  
Antiguo 04/12/2004, 14:04
 
Fecha de Ingreso: noviembre-2003
Ubicación: Veracruz
Mensajes: 131
Antigüedad: 14 años, 1 mes
Puntos: 0
Hola javifo:
A mi parecer seria muy tedioso el estar viendo ke campos modifica y cuales no....
lo que puedes hacer es un update a la fila y en los campos en los que el usuario halla modificado los valores, estos valores seran almacenados en la BD, y con los otros no habra problema.... ami me funciona... es decir:

titulo: xxxxx
cliente:xxxxx
domicilio:xxxx
y cambia domicilio xxxx por yyyy
has un update con todos los campos
<?php
$sSQL="UPDATE tabla SET titulo='$titulo', cliente='$cliente', domicilio='$domicilio',WHERE id='$id'";
mysql_db_query("BD",$sSQL);
mysql_close($conn);
?>

los campos que no modifique solo se reescribiran
Saludos
Espero te sirva
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 15:20.