Corregir el sistema de actualización de una base de datos PHP

Tengo un script donde muestro los datos de una b.d. Dando la opción de borrar y actualizar... Pero la parte de actualizar no me funciona... Aquí va parte del código:
$sql = "SELECT f.for_valrTotal,f.for_codigo, f.for_rubro,f.for_requisitos,r.rub_nombre FROM formatos as f, rubros as r
WHERE f.for_rubro=r.rub_codigo AND f.for_rubro='$rub' AND f.for_proyecto='$pro' AND f.for_ano='$ano'";
$result = mysql_query($sql) or die ("La consulta fallo:".mysql_error());//aqui se realiza la consula a la b.d.
<? While($row= mysql_fetch_array($result) ){
echo "<tr>";
echo "<td>".$row["for_rubro"]."</td>";
echo "<td>".$row["rub_nombre"]."</td>";
echo "<td>".$row[3]."</td>";
echo "<td><input type='text' name='campo[".$row[0]."]' value='".$row["for_valrTotal"]."'></td>";
echo "<td><input type='checkbox' name='del[]' value='".$row["for_codigo"]."'></td>";
echo "<input type='hidden' name='id' value='".$row["for_codigo"]."'>";
echo "</tr>";
}
echo "<td><input name='borrar' type='submit' class='EstFormato' value='Borrar '></td>";
echo "<td><input name='Actualizar' type='submit' class='EstFormato' value='Actualizar'></td>";
echo "</tr>";
?>//aqui mostramod los datos de la consulta...
......
if (isset($_POST['Actualizar']))
{
$id = $_POST['id'];
foreach ($_POST['campo'] as $indice => $valor)
{
$query = "UPDATE formatos SET for_valrTotal='$valor' WHERE for_codigo='$id'";
mysql_query($query, $link) or die ("Actualizacion Fallida!");
}
most_datos($rub,$pro,$ano);
}//Y aquí actualizo los datos... La función solo realiza la consulta y despliega los datos...
Alguna idea.. Porque' no funciona..

1 respuesta

Respuesta
1
Pues mira, no se exactamente que pasa porque me he limitado a echarle un vistazo por encima al asunto, pero, me da la impresión, de que $id es un valor numérico, y le pides a la bd que busque un $id alfanumérico. Entonces no lo encuentra y no actualiza, pero no da ningún error, simplemente no lo encuentra.
Si es este el caso, deberías probar con
$query="UPDATE ...... WHERE for_codigo=$id";
Esto hará que la bd busque en el campo for_codigo el valor numérico $id.
Hola...
Ante todo muchas gracias por el interés.. te cuento q' el id si es numérico pero con sin comillas es indiferente... ejecutando varias veces el script encontré q' este actualiza unicamente el último registro generado, y mostrado en la tabla... pero no los restantes... alguna idea, y gracias.
Me cuesta un poco entender completamente el código.
¿Podrías enviarme un volcado de las tablas MYSQL en cuestión, formatos y rubros, para que yo lo simule en mi servidor?
El volcado solo de la estructura, los datos no los necesito.
Hasta ahora.
Oye... muchas gracias por el interés a continuación te paso el sql de las tablas aunque' estas hacen referencias a otras tantas... no se si las necesites por si algo también te las coloco:
CREATE TABLE `formatos` (
`for_codigo` int(11) NOT NULL auto_increment,
`for_rubro` varchar(17) NOT NULL default '',
`for_proyecto` tinyint(3) unsigned NOT NULL default '0',
`for_ano` year(4) NOT NULL default '0000',
`for_unidad` tinyint(3) unsigned NOT NULL default '0',
`for_descripcion` varchar(50) default NULL,
`for_antigEquipo` varchar(60) default NULL,
`for_totlAntiguedad` tinyint(3) unsigned default NULL,
`for_cantOptima` tinyint(3) unsigned default NULL,
`for_cantFaltante` tinyint(3) unsigned default NULL,
`for_cambReposicion` tinyint(3) unsigned default NULL,
`for_tipoVehiculo` varchar(50) default NULL,
`for_vehiculo` tinytext,
`for_unidMedida` varchar(50) default NULL,
`for_usoMes` float(10,3) unsigned default NULL,
`for_mediUso` varchar(50) default NULL,
`for_consuAnual` float(10,3) unsigned default NULL,
`for_consuMensual` float(10,3) unsigned default NULL,
`for_consuActividad` float(10,3) unsigned default NULL,
`for_mediConsumo` varchar(50) default NULL,
`for_cantDias` int(10) unsigned default NULL,
`for_cantIndividual` int(10) unsigned default NULL,
`for_nivel` varchar(20) default NULL,
`for_requisitos` tinytext,
`for_labor` varchar(50) default NULL,
`for_numPersonas` tinyint(3) unsigned default NULL,
`for_sistema` tinytext,
`for_equipo` varchar(50) default NULL,
`for_dependencia` varchar(50) default NULL,
`for_persRequerido` tinytext,
`for_numMeses` tinyint(3) unsigned default NULL,
`for_destino` varchar(50) default NULL,
`for_actividad` varchar(50) default NULL,
`for_NumDias` int(10) unsigned default NULL,
`for_numEdiciones` int(10) unsigned default NULL,
`for_publicacion` varchar(50) default NULL,
`for_destPublicacion` tinytext,
`for_numEjemplares` int(10) unsigned default NULL,
`for_curso` varchar(50) default NULL,
`for_duracion` varchar(50) default NULL,
`for_centCapacitacion` varchar(50) default NULL,
`for_objetivos` varchar(50) default NULL,
`for_nivlParticipante` varchar(50) default NULL,
`for_cantParticipantes` int(10) unsigned default NULL,
`for_frecAnual` int(10) unsigned default NULL,
`for_promMes3Año` double default NULL,
`for_promMes2Año` double default NULL,
`for_promMes1Año` double default NULL,
`for_promMesAñoActual` double default NULL,
`for_promMesProyectado` double default NULL,
`for_estiTotalAño` double default NULL,
`for_costPromedio` double default NULL,
`for_costEstUnaVez` double default NULL,
`for_gastAno3` double default NULL,
`for_gastAno2` double default NULL,
`for_gastAno1` double default NULL,
`for_gastAnoActual` double default NULL,
`for_gastEstimado` double default NULL,
`for_valrMensual` double default NULL,
`for_valrUnitario` double default NULL,
`for_valrTotal` double default NULL,
`for_totlNecesidad` tinyint(3) default NULL,
`for_costoCurso` double default NULL,
`for_valrPasajes` double default NULL,
`for_grado` varchar(10) default NULL,
PRIMARY KEY (`for_codigo`),
KEY `formatos_FKIndex1` (`for_rubro`),
KEY `formatos_FKIndex2` (`for_ano`,`for_proyecto`),
KEY `formatos_FKIndex3` (`for_unidad`),
CONSTRAINT `formatos_ibfk_1` FOREIGN KEY (`for_rubro`) REFERENCES `rubros` (`rub_codigo`) ON UPDATE CASCADE,
CONSTRAINT `formatos_ibfk_2` FOREIGN KEY (`for_unidad`) REFERENCES `unidades` (`uni_codigo`) ON UPDATE CASCADE,
CONSTRAINT `formatos_ibfk_3` FOREIGN KEY (`for_ano`) REFERENCES `presupuestos` (`pre_ano`) ON UPDATE CASCADE,
CONSTRAINT `formatos_ibfk_4` FOREIGN KEY (`for_rubro`) REFERENCES `rubros` (`rub_codigo`) ON UPDATE CASCADE,
CONSTRAINT `formatos_ibfk_5` FOREIGN KEY (`for_unidad`) REFERENCES `unidades` (`uni_codigo`) ON UPDATE CASCADE,
CONSTRAINT `formatos_ibfk_6` FOREIGN KEY (`for_ano`) REFERENCES `presupuestos` (`pre_ano`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `rubros` (
`rub_codigo` varchar(17) NOT NULL default '',
`rub_tiposice` char(1) default NULL,
`rub_clasesice` int(3) default NULL,
`rub_subclasice` int(3) default NULL,
`rub_gruposice` int(3) default NULL,
`rub_itemsice` int(3) default NULL,
`rub_nombre` tinytext,
`rub_grupo` char(3) default NULL,
PRIMARY KEY (`rub_codigo`),
KEY `rubros_FKIndex1` (`rub_grupo`),
CONSTRAINT `rubros_ibfk_1` FOREIGN KEY (`rub_grupo`) REFERENCES `grupo_rubro` (`gru_codigo`) ON DELETE NO ACTION ON UPDATE CASCADE,
CONSTRAINT `rubros_ibfk_2` FOREIGN KEY (`rub_grupo`) REFERENCES `grupo_rubro` (`gru_codigo`) ON DELETE NO ACTION ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `grupo_rubro` (
`gru_codigo` char(3) NOT NULL default '',
`gru_nombre` tinytext,
PRIMARY KEY (`gru_codigo`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `unidades` (
`uni_codigo` tinyint(3) unsigned NOT NULL auto_increment,
`uni_nombre` tinytext NOT NULL,
PRIMARY KEY (`uni_codigo`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `presupuestos` (
`pre_ano` year(4) NOT NULL default '0000',
`pre_proyecto` tinyint(3) unsigned NOT NULL default '0',
`pre_grupo` char(3) NOT NULL default '',
`pre_programa` tinyint(3) unsigned NOT NULL default '0',
`pre_valrInversion` double default '0',
`pre_valrFuncionamiento` double default '0',
`pre_estado` char(2) default NULL,
PRIMARY KEY (`pre_ano`,`pre_proyecto`,`pre_grupo`),
KEY `presupuestos_FKIndex2` (`pre_proyecto`),
KEY `presupuestos_FKIndex3` (`pre_estado`),
KEY `presupuestos_FKIndex4` (`pre_grupo`),
KEY `presupuestos_FKIndex5` (`pre_programa`),
CONSTRAINT `presupuestos_ibfk_1` FOREIGN KEY (`pre_proyecto`) REFERENCES `proyectos` (`pry_codigo`) ON DELETE NO ACTION ON UPDATE CASCADE,
CONSTRAINT `presupuestos_ibfk_2` FOREIGN KEY (`pre_estado`) REFERENCES `estado` (`est_codigo`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `presupuestos_ibfk_3` FOREIGN KEY (`pre_grupo`) REFERENCES `grupo_rubro` (`gru_codigo`) ON DELETE NO ACTION ON UPDATE CASCADE,
CONSTRAINT `presupuestos_ibfk_4` FOREIGN KEY (`pre_programa`) REFERENCES `programas` (`pro_codigo`) ON DELETE NO ACTION ON UPDATE CASCADE,
CONSTRAINT `presupuestos_ibfk_5` FOREIGN KEY (`pre_proyecto`) REFERENCES `proyectos` (`pry_codigo`) ON DELETE NO ACTION ON UPDATE CASCADE,
CONSTRAINT `presupuestos_ibfk_6` FOREIGN KEY (`pre_estado`) REFERENCES `estado` (`est_codigo`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `presupuestos_ibfk_7` FOREIGN KEY (`pre_grupo`) REFERENCES `grupo_rubro` (`gru_codigo`) ON DELETE NO ACTION ON UPDATE CASCADE,
CONSTRAINT `presupuestos_ibfk_8` FOREIGN KEY (`pre_programa`) REFERENCES `programas` (`pro_codigo`) ON DELETE NO ACTION ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Creo bastante largo... espero puedas ayudarme...
Creo que ya lo tengo.
En el bucle while en el que escribes los datos para ser modificados, insertas un campo hidden de nombre=id. Pero eso lo haces para cada iteración de $row, con lo cual te aparecen en el mismo formulario muchos campos de nombre id con valores diferentes.
Cuando el formulario se envía, el campo id solo registra el ULTIMO valor asignado, porque se han ido sobrescribiendo. Por eso la rutina posterior solo te actualiza el ULTIMO, como tu dices.
Así que lo que deberías hacer es lo mismo que con los campos[], sustituir la variable hidden por $id[]. Esto hará que el formulario mande un array con todos los id. Claro que luego cuando recuperes $id=$_POST['id'] recuerda que es un array y tendrás que recorrerlo para hacer las actualizaciones en la bd.
Puf que mal lo he explicado. Espero que lo hayas entendido. Un saludo y seguimos en contacto si no hemos dado con la tecla.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas