Ayudar al guardar en BD

Hola, espero puedas ayudarme y no te complique con una pregunta muy larga, pero es por el código para que así puedas ayudarme de mejor manera. Tengo dos archivos, un html que contiene un formulario con 5 campos, donde el usuario ingresa un monto de un crédito, el numero de cuotas, la fecha del primer vencimiento, Valor cuota y el interés. El segundo archivo es un php que es llamado por el formulario, el cual tiene el siguiente código:
<table width="50%" border="0" cellpadding=3>
<tbody>
<tr>
<td align="center" bgcolor="#CCCCCC">Numero Cuota
</tr>
<td align="center" bgcolor="#CCCCCC">Capital
</tr>
<td align="center" bgcolor="#CCCCCC">Valor Cuota
</tr>
<td align="center" bgcolor="#CCCCCC">Interes
</tr>
<td align="center" bgcolor="#CCCCCC">Capital Pagado
</tr>
<td align="center" bgcolor="#CCCCCC">Valor Residual
</tr>
<?php
for ($i=1;$i<=$txtcuotas;$i++)
{
$intcuota=$txtcredito*$txttasa/100;
$cappagado=$txtvalcuota-$intcuota;
$valresi=$txtcredito-$cappagado;
echo "
<tr>
<td align=left> $i</td>
";
echo "
<td align=left>$txtcredito</td>
";
echo "
<td align=left>$txtvalcuota</td>
";
echo "
<td align=left>".number_format($intcuota,0)."</td>
";
echo "
<td align=middle>".number_format($cappagado,0)."</td>
";
echo "
<td align=middle>".number_format($valresi,0)."</td>
</tr>
";
$txtcredito=$valresi;
}
?>
Todo funciona a la perfección, el problema es que ahora todo el resultado generado necesito quede guardado en una tabla. La BD se llama SISTEMA y la tabla se llama Convenio y los campos son:
NCUOTA ->NUMERO DE CUOTA ($i)
CAPINI ->CAPITAL ($txtcredito)
VALCUOT ->VALOR CUOTA ($txtvalcuota)
INTERES ->INTERES O TASA ($intcuota)
CAPPAG -> CAPITAL PAGADO ($cappagado)
SALDO -> VALOR RESIDUAL ($valresi)
Yo coloque el siguiente código dentro del bucle for y comente todos lo echo de mis variables...
@ $db=mysql_pconnect("localhost","usuario","clave");
if (!$db) //si no se encuentra db
 {
  echo "Error en conexion a la BD";
  exit;
 }
for ($i=1;$i<=$txtcuotas;$i++)
{
$fecha=sumaDia($txtvencim,30, $i);
//echo "
<td align=left>".$txtvencim."</td>
";
//echo "
<td align=left>".$fecha."</td>
";
//$txtvencim=sumaDia($txtvencim,30);
//echo "
<td align=left>".date("$nuevafecha")."</td>
";
//echo "
<td align=left>".number_format($txtcredito,0)."</td>
";
//echo "
<td align=left>".number_format($txtvalcuota,0)."</td>
";
$intcuota=$txtcredito*$txttasa/100;
//echo "
<td align=left>".number_format($intcuota,0)."</td>
";
$cappagado=$txtvalcuota-$intcuota;
//echo "
<td align=middle>".number_format($cappagado,0)."</td>
";
$valresi=$txtcredito-$cappagado;
//echo "
<td align=middle>".number_format($valresi,0)."</td>
</tr>
";
$txtcredito=$valresi;
$consulta="INSERT INTO convenio VALUES('".$i."','".$txtcredito."','".$txtvalcuota."','".$intcuota."','".$cappagado."','".$valresi."')";
$resultado = mysql_query($consulta);
if (!$resultado) { die('Invalid query: ' . Mysql_error());}
}
Al momento de ejecutar me aparece el siguiente mensaje: Invalid query: Column count doesn't match value count at row 1.
Tambien probe este otro metodo, pero sucede lo mismo:
$consulta="INSERT INTO convenio (ncuota,fvenc,capital,valcuota,interes,cpagado,valresi) VALUES ('$_POST','$_POST[txtcredito]','$_POST[txtvalcuota]','$_POST[intcuota]','$_POST[cappagado]','$_POST[valresi]')";
Tengo un campo llamado id que es de autoincremento y que no menciono en el código, pero no se si esto tiene que ver. No se donde tengo el error...
Espero puedas ayudarme...

2 respuestas

Respuesta
1
El error es que estas pasando más valores que variables a la consulta, por ejemplo:
INSERT INTO tabla_ejemplo (tabla_ejemplo_columna_1,tabla_ejemplo_columna_2, tabla_ejemplo_columna_3, tabla_ejemplo_columna_4) VALUES ('VALOR1' , 'VALOR2' , 'VALOR3', 'VALOR4');
Esta consulta esta bien, pero tu estas haciendo esto:
INSERT INTO tabla_ejemplo (tabla_ejemplo_columna_1, tabla_ejemplo_columna_2, tabla_ejemplo_columna_3) VALUES ('VALOR1' , 'VALOR2' , 'VALOR3', 'VALOR4');
Pasando mas valores que variables y lo puedes ver:
$consulta="INSERT INTO convenio (ncuota,fvenc,capital,valcuota,interes,cpagado,valresi) VALUES ('$_POST','$_POST[txtcredito]','$_POST[txtvalcuota]','$_POST[intcuota]','$_POST[cappagado]','$_POST[valresi]')";
Tus variables Son:
  1- ncuota,
2- fvenc,
3- capital,
4- valcuota,
5- interes,
6- cpagado,
7- valresi
Y los valores que pasas son
1.- '$_POST',     <- me imagino que aqui te falto el indice; '$_POST['algo']
2.- '$_POST[txtcredito]',
3.- '$_POST[txtvalcuota]',
4.- '$_POST[intcuota]',
5.- '$_POST[cappagado]',
6.- '$_POST[valresi]'
7.-¿?
Falta el valor 7
También te recuero que debes pasar los valores ordenados como ordenaste la variable osea que si colocaste 'ncuota' como primera variable o la primera columna que vas a insertar en los values el primero que vas a colocar es el valor que le correspondería a 'ncuota'
Tenias razón, me faltaba un campo, la fecha, este el código INSERT ahora:
$consulta="INSERT INTO datos (ncuota,fvenc,capital,valcuota,interes,cpagado,valresi) VALUES ($_POST','$_POST[fecha]','$_POST[txtcredito]','$_POST[txtvalcuota]','$_POST[intcuota]','$_POST[cappagado]','$_POST[valresi]')";
Lo comprobé.. por ejemplo ingrese los siguientes valores en el formulario:
Crédito:2700000
Cuotas: 12
1 vcto: 30/06/2009
valor cuota: 166000
tasa: 3.3
Active los echo de mis variables para poder ver que se alcanza a procesar y me aparece esto como resultado:
Notice: Undefined index: i in C:\AppServ\www\cuotas\resultado.php on line 73
Notice: Undefined index: fecha in C:\AppServ\www\cuotas\resultado.php on line 73
Notice: Undefined index: intcuota in C:\AppServ\www\cuotas\resultado.php on line 73
Notice: Undefined index: cappagado in C:\AppServ\www\cuotas\resultado.php on line 73
Notice: Undefined index: valresi in C:\AppServ\www\cuotas\resultado.php on line 73
Invalid query: 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 '2700000','166000','','','')' at line 1
Mostrando solo los encabezados de la trabla y la primera cuota...
Lo que me fije es que en el formulario los datos los solicito en el orden del ejemplo dado arriba y en INSERT se van agregando un orden distinto, no se si esto influye... Ayudame please...
Primero:
Las variables $_POST['indice'] es para tomar variables que vienen por método POST de los formularios que envía la petición... Perfecto...
Ahora si tu haces $_POST['txtcredito'] entonces es porque en tu formulario debe existir un campo con el atributo name igual a "txtcredito" por ejemplo:
<input tipe="text" name="txtcredito" id="txtcredito" />
El id es para javascript no para PHP.
Sino existe ese campo en tu formulario entonces te dará el error Undefined index ya que no existe. Tienes que ver a $_POST como un array común y corriente de PHP que sus indices son los atributos de tu formulario básicamente.
Ahora veo que estas haciendo: '$_POST[txtcredito]' no se si es que lo escribiste mal en tu mensaje pero debería ser:
tu escribiste '$_POST[txtcredito]'  y deberia ser '$_POST['txtcredito']' verifica eso....
Segundo el query no se esta ejecutando por que hay un error de sintaxis ahora no puedo ayudarte si no veo completamente la consulta SQL.
Para que puedas ver la consulta imprime con "echo" $consulta y muestramela para poderte ayudar un poco más...
Perfecto... este es el código que modifique según tus comentarios:
$consulta="INSERT INTO datos (ncuota,fvenc,capital,valcuota,interes,cpagado,valresi) VALUES ('$i','$fecha','$_POST[txtcredito]','$_POST[txtvalcuota]','$intcuota','$cappagado','$valresi')";
echo $consulta;
Y esto es lo que aparece en pantalla según echo consulta... lo hice con 3 cuotas no más para que el código no fue más largo:
INSERT INTO datos (ncuota,fvenc,capital,valcuota,interes,cpagado,valresi) VALUES ('1','30/06/2009','2700000','166000','89100','76900','2623100') 2 31/07/2009 2,623,100 166,000 86,562 79,438 2,543,662INSERT INTO datos (ncuota,fvenc,capital,valcuota,interes,cpagado,valresi) VALUES ('2','31/07/2009','2700000','166000','86562.3','79437.7','2543662.3') 3 31/08/2009 2,543,662 166,000 83,941 82,059 2,461,603INSERT INTO datos (ncuota,fvenc,capital,valcuota,interes,cpagado,valresi) VALUES ('3','31/08/2009','2700000','166000','83940.8559','82059.1441','2461603.1559')
Ahora, lo único que no se graba en la tabla a pesar de que se muestra en el listado anterior es ta fecha... en la tabla me aparece 000-00-00, todos los demás valores si quedan grabados...
¿Trataste con lo que te respondí en el mensaje anterior?:
Las mayorías de las DB los formatos de Fechas tienen el formato
Si es DATE año-mes-día
Si es timestamp año-mes-día 00:00:00 00000000
Ahora tu estas tratando de guardar en formato dia/mes/año por eso no te guarda bien la fecha.
Tengo esta función espero que te sirva:
function changeUSDate($date, $dateSeparator = '-'){
        if(strlen($date) == 10){
            $day = substr($date, 0,2);
            $month = substr($date,3,2);
            $year = substr($date, 6,4);
        }elseif(strlen($date) == 9){
            $day = substr($date, 0,1);
            $month = substr($date,2,2);
            $year = substr($date, 5,4);
        }
        $day = ((int) $day < 9) ? '0' . $day : $day ;
        return $month . $dateSeparator . $day . $dateSeparator . $year;
    }
Lo que hace es cambiar el formato '05/04/1985' por '1985-04-05'.
La puedes usar como más te convenga en un objeto o simplemente como una función.
No entiendo como aplicar tu función a mi variable $fecha o a otra ya que necesito desplegar en pantalla en formato 00-00-0000...
En tu función, cambie $date por $fecha, pero no entiendo como guardar el return en una variable y guardar el contenido de dicha variable en la tabla...
Espero se me entienda... y una vez más muchas gracias...
Función tiene que estar en el archivo que estas usando, puedes hacerlo mediante un objeto o simplemente un include_once o copiar y pegar en algún lado la función y listo para probar
La consulta seria así si utilizas la función:
$consulta="INSERT INTO datos (ncuota,fvenc,capital,valcuota,interes,cpagado,valresi) VALUES ('$i','changeUSDate($fecha)','$_POST[txtcredito]','$_POST[txtvalcuota]','$intcuota','$cappagado','$valresi')";
Sino te srive esa por error de concatenacion usa esta
$consulta="INSERT INTO datos (ncuota,fvenc,capital,valcuota,interes,cpagado,valresi) VALUES ('$i','" . changeUSDate($fecha)"','$_POST[txtcredito]','$_POST[txtvalcuota]','$intcuota','$cappagado','$valresi')";
Respuesta
1
El error es sencillo de entender. EL mensaje de error "Column count doesn't match value count at row 1" indica al traducirlo algo parecido a "El numero de columnas no coincide para la fila 1".
El uso de la cláusula INSERT permite especificar menos campos de los que tiene la tabla, pero en ese caso debes indicarlo se la siguiente forma:
Imaginemos una tabla
Id
campo_1
campo_2
Bien, al ejecutar un INSERT de la siguiente forma...
INSERT INTO table VALUES ()
... no estas indicando que columnas estas insertando, con lo que entiende que son todas, incluida el id. Si el id es autonumérico y el insert debe ser solo de un conjunto parcial de valores debes hacerlo así:
INSERT INTO tabla (campo_1, campo_2) VALUES (valor_1, valor_2)
¿ Ok ?
INSERT INTO table VALUES () es equivalente a INSERT INTO table (id, campo_1, campo_2) VALUES (valor_id, valor_1, valor_2), pero eso no es lo que quieres, ya que el id no se lo quieres facilitar, quieres que lo calcule la base de datos directamente.
Hola nuevamente... en base a tu respuesta yo justamente tenia la duda al no mencionar los campos en el comando INSERT, es por eso y si te das cuenta, ¿al final de mi pregunta indico que también utilice el comando con los campos y aun así no tuve resultados... QUE debo hacer entonces...?
Gracias...
Es cierto, no me fijé bien. Pero ahora he sido más observador y he encontrado un fallo:
$consulta="INSERT INTO convenio (ncuota,fvenc,capital,valcuota,interes,cpagado,valresi) VALUES ('$_POST','$_POST[txtcredito]','$_POST[txtvalcuota]','$_POST[intcuota]','$_POST[cappagado]','$_POST[valresi]')";
Si te fijas...
(Ncuota, fvenc, capital, valcuota, interes, cpagado, valresi) son...
(
1 ncuota,
2 fvenc,
3 capital,
4 valcuota,
5 interés,
6 cpagado,
7 valresi
)
7 columnas mientra que ('$_POST','$_POST[txtcredito]','$_POST[txtvalcuota]','$_POST[intcuota]','$_POST[cappagado]','$_POST[valresi]') son...
(
1 '$_POST',
2'$_POST[txtcredito]',
3 '$_POST[txtvalcuota]',
4 '$_POST[intcuota]',
5 '$_POST[cappagado]',
6 '$_POST[valresi]'
)
... solo 6.
Ahí esta el error. Verifícalo y veras como si te funciona.
Perfecto... este es el código que modifique según tus comentarios:
$consulta="INSERT INTO datos (ncuota,fvenc,capital,valcuota,interes,cpagado,valresi) VALUES ('$i','$fecha','$_POST[txtcredito]','$_POST[txtvalcuota]','$intcuota','$cappagado','$valresi')"; 
Hice un echo $consulta para ver el proceso realizado por INSERT
Y esto es lo que aparece en pantalla... lo hice con 3 cuotas no más para que el código no fue más largo:
INSERT INTO datos (ncuota,fvenc,capital,valcuota,interes,cpagado,valresi) VALUES ('1','30/06/2009','2700000','166000','89100','76900','2623100') 2 31/07/2009 2,623,100 166,000 86,562 79,438 2,543,662INSERT INTO datos (ncuota,fvenc,capital,valcuota,interes,cpagado,valresi) VALUES ('2','31/07/2009','2700000','166000','86562.3','79437.7','2543662.3') 3 31/08/2009 2,543,662 166,000 83,941 82,059 2,461,603INSERT INTO datos (ncuota,fvenc,capital,valcuota,interes,cpagado,valresi) VALUES ('3','31/08/2009','2700000','166000','83940.8559','82059.1441','2461603.1559') 
Ahora, lo único que no se graba en la tabla a pesar de que se muestra en el listado anterior es ta fecha... en la tabla me aparece 000-00-00, todos los demás valores si quedan grabados...
El problema que estas teniendo ahora es el formato de la fecha. Nosotros usamos formato de fecha Dia/Mes/Año, pero MySQL usa (a no ser que lo configures expresamente para ello) el formato Año/Mes/Dia.
De esa forma, debes construir la fecha en ese formato si quieres que te la acepte.
Para encontrar información sobre los tipos de datos de fecha y hora de MySQL consulta el siguiente enlace:
http://dev.mysql.com/doc/refman/5.0/es/date-and-time-types.html
Por otro lado, para hacerte una idea de como hacer la conversión en PHP, consulta las funciones date y mktime.
Prueba y cuando vuelvas a atrancarte, comentanoslo.
¿Me has enviado otra vez la pregunta?
Hola:
¿ Que tal fue ?

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas