Foros del Web » Programando para Internet » PHP »

Problema para actualizar datos en mysql(problema de principiante)

Estas en el tema de Problema para actualizar datos en mysql(problema de principiante) en el foro de PHP en Foros del Web. estoy tratando de crear una funcion que cada vez que es llamada "actualiza los datos que tiene la tabla "obra", esta tabla debe almacenar la ...
  #1 (permalink)  
Antiguo 07/01/2015, 19:07
 
Fecha de Ingreso: enero-2015
Ubicación: Valparaiso
Mensajes: 88
Antigüedad: 9 años, 3 meses
Puntos: 0
Problema para actualizar datos en mysql(problema de principiante)

estoy tratando de crear una funcion que cada vez que es llamada "actualiza los datos que tiene la tabla "obra", esta tabla debe almacenar la suma de los datos que estan en "detalle_obra", el atributo "cod_obra" de la tabla detalle_obra es el mismo dato que el atributo "codigo" de tabla obra (clave primaria) el cual entra a la funcion con el nombre "$obra" y se utiliza para saber en que obra va la respectiva suma. El problema es que la funcion no hace absolutamente nada, no logro hacer que se actualizen estos datos. las tablas estan compuestas de la siguiente forma:
Código PHP:
CREATE TABLE IF NOT EXISTS `mydb`.`Detalle_Obra` (
  `
cod_obraINT NOT NULL,
  `
fechaDATE NOT NULL,
  `
especificacionVARCHAR(300NOT NULL,
  `
egresosINT NULL,
  `
ingresosINT NULL,
  `
recepcionINT NULL,
  `
combustible_recepcionINT NULL,
  `
combustible_emisionINT NULL,
  
INDEX `cod_obra_idx` (`cod_obraASC),
  
CONSTRAINT `cod_obra`
    
FOREIGN KEY (`cod_obra`)
    
REFERENCES `mydb`.`Obra` (`codigo`)
    
ON DELETE NO ACTION
    ON UPDATE NO ACTION
)
ENGINE InnoDB;

CREATE TABLE IF NOT EXISTS `mydb`.`Obra` (
  `
codigoINT NOT NULL AUTO_INCREMENT,
  `
nombreVARCHAR(45NOT NULL,
  `
cod_clienteINT NOT NULL,
  `
fecha_inicioDATE NOT NULL,
  `
fecha_finalDATE NOT NULL,
  `
egresosINT NULL,
  `
ingresosINT NULL,
  `
recepcionINT NULL,
  `
combustibles_recepcionINT NULL,
  `
combustibles_emisionINT NULL,
  `
saldo_generalINT NULL,
  `
iva_facturadoINT NULL,
  `
iva_comprasINT NULL,
  `
dif_ivaINT NULL,
  `
iva_bencinaINT NULL,
  `
dif_iva2INT NULL,
  
PRIMARY KEY (`codigo`),
  
INDEX `cod_cliente_idx` (`cod_clienteASC),
  
CONSTRAINT `cod_cliente`
    
FOREIGN KEY (`cod_cliente`)
    
REFERENCES `mydb`.`Cliente` (`codigo`)
    
ON DELETE NO ACTION
    ON UPDATE NO ACTION
)
ENGINE InnoDB
el codigo es:

Código PHP:
function actualizarObras($obra){

 
$con=mysqli_connect("localhost","root","","mydb");
// Check connection
if (mysqli_connect_errno())
  {
  echo 
"Failed to connect to MySQL: " mysqli_connect_error();
  }

$query_select "SELECT * FROM detalle_obra WHERE cod_obra = '$obra'";
$query_execute $con->query($query_select);

while(
$query_result $query_execute->fetch_array()) {
  
$egre $query_result['egresos'];
  
$ingre $query_result['ingresos']; 
  
$recepci $query_result['recepcion'];
  
$combusre $query_result['combustible_recepcion'];
  
$combuem $query_result['combustible_emision'];
  
$conslt "UPDATE obra SET obra.egresos = obra.egresos + '$egre' WHERE obra.codigo = '$obra'";
  
mysqli_query($con$conslt);
  
$conslt2 "UPDATE obra SET obra.ingresos = obra.ingresos + '$ingre' WHERE obra.codigo = '$obra'";
  
mysqli_query($con$conslt2);
  
$conslt3 "UPDATE obra SET obra.recepcion = obra.recepcion + '$recepci' WHERE obra.codigo = '$obra'";
  
mysqli_query($con$conslt3);
  
$conslt4 "UPDATE obra SET obra.combustible_recepcion = obra.combustible_recepcion + '$combusre' WHERE obra.codigo = '$obra'";
  
mysqli_query($con$conslt4);
  
$conslt5 "UPDATE obra SET obra.combustible_emision = obra.combustible_emision + '$combuem' WHERE obra.codigo = '$obra'";
  
mysqli_query($con$conslt5);

}

mysqli_close($con);

PD: El problema radica dentro de la funcion ya que es la unica parte de la aplicacion que no funciona como deberia.
  #2 (permalink)  
Antiguo 07/01/2015, 19:51
Avatar de danichalay  
Fecha de Ingreso: julio-2009
Mensajes: 35
Antigüedad: 14 años, 9 meses
Puntos: 1
Respuesta: Problema para actualizar datos en mysql(problema de principiante)

hola Begotten,

el problema en tu consulta es la concatenacion, para concatenar se utiliza la funcion [URL="http://dev.mysql.com/doc/refman/5.6/en/string-functions.html#function_concat"]concat[/URL] de tal manera que tu código quedaría así

Código PHP:
Ver original
  1. function actualizarObras($obra){
  2.  
  3.  $con=mysqli_connect("localhost","root","","mydb");
  4. // Check connection
  5.   {
  6.   echo "Failed to connect to MySQL: " . mysqli_connect_error();
  7.   }
  8.  
  9. $query_select = "SELECT * FROM detalle_obra WHERE cod_obra = '$obra'";
  10. $query_execute = $con->query($query_select);
  11.  
  12. while($query_result = $query_execute->fetch_array()) {
  13.   $egre = $query_result['egresos'];
  14.   $ingre = $query_result['ingresos'];  
  15.   $recepci = $query_result['recepcion'];
  16.   $combusre = $query_result['combustible_recepcion'];
  17.   $combuem = $query_result['combustible_emision'];
  18.   $conslt = "UPDATE obra SET obra.egresos = concat(obra.egresos,'$egre') WHERE obra.codigo = '$obra'";
  19.   mysqli_query($con, $conslt);
  20.   $conslt2 = "UPDATE obra SET obra.ingresos = concat(obra.ingresos,'$ingre') WHERE obra.codigo = '$obra'";
  21.   mysqli_query($con, $conslt2);
  22.   $conslt3 = "UPDATE obra SET obra.recepcion = concat(obra.recepcion,'$recepci') WHERE obra.codigo = '$obra'";
  23.   mysqli_query($con, $conslt3);
  24.   $conslt4 = "UPDATE obra SET obra.combustible_recepcion = concat(obra.combustible_recepcion,'$combusre') WHERE obra.codigo = '$obra'";
  25.   mysqli_query($con, $conslt4);
  26.   $conslt5 = "UPDATE obra SET obra.combustible_emision = concat(obra.combustible_emision,'$combuem') WHERE obra.codigo = '$obra'";
  27.   mysqli_query($con, $conslt5);
  28.  
  29. }
  30.  
  31. mysqli_close($con);
  32. }
  #3 (permalink)  
Antiguo 07/01/2015, 22:15
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: Problema para actualizar datos en mysql(problema de principiante)

@danichalay: Lo que planteas no tiene sentido.
CONCAT lo que hace es combinar cadenas de texto en una sola, no sumar datos numericos., y si te fijas los campos que se impactan son INT, es decir numéricos, por lo que no aplica.
Las sumas como las pone están bien aunque es innecesario hacer tantos UPDATE para eso, se podría hacer en uno sólo sin problemas...
De todos modos lo que no está aclarando es como se supone que debería funcionar según él... Y eso es fundamental.

¿Exactamente cual es el problema? ¿No actualiza?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 08/01/2015, 05:00
 
Fecha de Ingreso: enero-2015
Ubicación: Valparaiso
Mensajes: 88
Antigüedad: 9 años, 3 meses
Puntos: 0
Respuesta: Problema para actualizar datos en mysql(problema de principiante)

Cita:
Iniciado por gnzsoloyo Ver Mensaje
@danichalay: Lo que planteas no tiene sentido.
CONCAT lo que hace es combinar cadenas de texto en una sola, no sumar datos numericos., y si te fijas los campos que se impactan son INT, es decir numéricos, por lo que no aplica.
Las sumas como las pone están bien aunque es innecesario hacer tantos UPDATE para eso, se podría hacer en uno sólo sin problemas...
De todos modos lo que no está aclarando es como se supone que debería funcionar según él... Y eso es fundamental.

¿Exactamente cual es el problema? ¿No actualiza?
gracias por las respuestas... Claro, el problema es que la funcion no actualiza los datos, tecnicamente no hace nada.

¿como podria hacerlo con uno update?
  #5 (permalink)  
Antiguo 08/01/2015, 06:39
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: Problema para actualizar datos en mysql(problema de principiante)

No tiene ninguna utilidad poner N UPDATE cuando puedes hacerlo en uno. La sintaxis la puedes leer en el manual de referencia (recomiendo usar la version que esta en la web).
Por otro lado, el UPDATE funcionará en tu caso si y sólo si el valor de la variable $obra está llegando. Si la variable es nula, contiene un caracter vacío, o un valor inválido, evidentemente no realizará nada. Pero como no podemos ver de donde proviene, eso lo deberás verificar tu.
Ten en cuenta que NUNCA debes asumir que las variables contienen lo que supones. El 90% de los sproblemas de este tipo se producen porque la variable no contiene lo que el programador supone que contiene, pero jamás se tomo el trabajo de verificar.
Validar es siempre la parte mas engorrosa de toda codificiación, pero es fundamental.

Por otro lado, no debes usar en un msimo script fucniones por procedimietnos y funciones orientadas ao objetos. No son muy compatibles. O usas una, o usas la otra.
Además, debes también verificar que cuando se ejecuta una sentencia no se haya producido un error, y eso tampoco lo estás haciendo...
NUNCA asumas que algo funcionó bien porque está bien escrito. Verifícalo.

Yo propondría algo como esto:
Código PHP:
function actualizarObras($obra){

$con = new mysqli("localhost""root""password""mydb");
if (
$con->connect_errno) {
    echo 
"Fallo al contenctar a MySQL: (" $con->connect_errno ") ".$con->connect_error;
}

$query_select "SELECT * FROM detalle_obra WHERE cod_obra = '$obra'";
$query_execute $con->query($query_select);
// debes validr siempre que no haya fallado. 

if(!$query_execute)
{echo 
"Error al ejecutar SELECT: " $con->errno " - " $con->error;}
else
  {
  while(
$query_result $query_execute->fetch_array()) {
  
$egre $query_result['egresos'];
  
$ingre $query_result['ingresos']; 
  
$recepci $query_result['recepcion'];
  
$combusre $query_result['combustible_recepcion'];
  
$combuem $query_result['combustible_emision'];
  
$conslt "UPDATE obra 
    SET egresos = (egresos + $egre), 
      ingresos = (ingresos + $ingre), 
      recepcion = recepcion + $recepci), 
      combustible_recepcion = (combustible_recepcion + $combusre), 
      combustible_emision = (combustible_emision + $combuem) 
    WHERE obra.codigo = '$obra'"
;
  
$result $con->query($conslt);
  if($!
result)
    {echo 
"Error al ejecutar UPDATE: " $con->errno " - " $con->error "\r";
     echo 
"Consulta: ".$conslt}
  }
}
$con->close;


NOtarás que eliminé los apostrofes de los valores que se suman. Eso es porque no debe en SQL ponerse un valor numerico como cadena de texto, ya que es inencesario y obliga a conversiones implicitas. Por otro lado, poner una variable entre apostrfes esconde errores con ellas, ya que si un valor está llegando nulo no se ve si usas los apostrofes, pero si dispara un error si no está.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 08/01/2015, 08:33
 
Fecha de Ingreso: enero-2015
Ubicación: Valparaiso
Mensajes: 88
Antigüedad: 9 años, 3 meses
Puntos: 0
Respuesta: Problema para actualizar datos en mysql(problema de principiante)

Cita:
Iniciado por gnzsoloyo Ver Mensaje
No tiene ninguna utilidad poner N UPDATE cuando puedes hacerlo en uno. La sintaxis la puedes leer en el manual de referencia (recomiendo usar la version que esta en la web).
Por otro lado, el UPDATE funcionará en tu caso si y sólo si el valor de la variable $obra está llegando. Si la variable es nula, contiene un caracter vacío, o un valor inválido, evidentemente no realizará nada. Pero como no podemos ver de donde proviene, eso lo deberás verificar tu.
Ten en cuenta que NUNCA debes asumir que las variables contienen lo que supones. El 90% de los sproblemas de este tipo se producen porque la variable no contiene lo que el programador supone que contiene, pero jamás se tomo el trabajo de verificar.
Validar es siempre la parte mas engorrosa de toda codificiación, pero es fundamental.

Por otro lado, no debes usar en un msimo script fucniones por procedimietnos y funciones orientadas ao objetos. No son muy compatibles. O usas una, o usas la otra.
Además, debes también verificar que cuando se ejecuta una sentencia no se haya producido un error, y eso tampoco lo estás haciendo...
NUNCA asumas que algo funcionó bien porque está bien escrito. Verifícalo.
las verificaciones las borre, ya sabia que la variable si se ingresaba bien (es la clave primaria de Obra), pero bueno, la idea se me fue en collera, creo que es mejor dejar que los datos de obra se modifiquen cada vez que se crea un nuevo detalle_obra y no actualizarlos por cuenta propia

Etiquetas: fecha, mysql, select, 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 02:47.