Autor
|
Tema: [SOLUCIONADO] No logro insertar en la BDD MySQL, que me estara fallando ? (Leído 2,787 veces)
|
Diabliyo
Desconectado
Mensajes: 1.441
shell# _
|
Hola: Tengo problemas en cierta parte de mi codigo, en el cual no logro insertar un campo tipo TEXT (mensaje), el resultado al intento de insercion me retorna un error de sintaxis un poco rara :S !!... Ahi les va mas informacion: Tabla NOTICIAS//esta es la TABLA ID bigint(20) AUTOR varchar(30) TITULO varchar(30) MENSAJE text FECHA bigint(20) FECHA_MOD bigint(20) AUTOR_MOD varchar(30) MENU varchar(40) sección varchar(40) Por lo tanto, intento insertar el contenido, asumiendo que el formulario es este: echo "<form action=\"index.php?id=noticias&mov=agregar_noticia&id_src=". $ctl. "\" method=\"POST\">"; echo "</span></td><tr>"; echo "<td>Titulo: <input type=\"text\" name=\"titulo_noticia\" class=\"estilo_01\"></td><tr>"; echo "<td>Contenido:</td><tr>"; echo "<td><textarea name=\"mensaje_noticia\" class=\"estilo_02\">"; echo "</textarea></td><tr>"; echo "<td align=\"center\"><input type=\"submit\" class=\"boton_01\" value=\"Publicar Noticia\"></td>"; echo "</form>"; Y el texto puesto como ejemplo en el formulario es este: Titulo: Bienvenido al Sitio !! Contenido: Que tal, buen dia !!
Esta es la primer noticia que colgamos debido a la inaguracion del sitio y estreno de nuestra herramienta de softwrae libre.
Espero que la comunidad internauta pueda colaborar con nuestros proyectos de software libre.
..:: SIE-Group.net ::.. Grupo de Soluciones Inteligentes para tu Empresa.
Ing. Angel Haniel Cantu Jauregui <angel.cantu@sie-group.net> Y el codigo de formacion de trama e insercion es el siguiente: <?php #Algunas variables como 'buf_sec', 'buf_menu', etc... se omiten, #porque son tratadas mas arriba para consultar datos !!
$msg= msg2caritas( $_POST["mensaje_noticia"] ); //de CODIGO a CARITAS $msg= msg2msgtags( $msg ); //de BBCode a HTML Tags
//generamos trama de insercion mysql $valores=""; $valores .= "autor="; $valores .= "'". $_SESSION["log_usr"]. "'"; $valores .= ":"; $valores .= "titulo="; $valores .= "'". $_POST["titulo_noticia"]. "'"; $valores .= ":"; $valores .= "mensaje="; $valores .= "'". htmlentities($msg, ENT_QUOTES). "'"; $valores .= ":"; $valores .= "fecha="; $valores .= "'". time(). "'"; $valores .= ":menu="; $valores .= "'". $buf_menu["NOMBRE"]. "'"; $valores .= ":sección="; $valores .= "'". $buf_sec["NOMBRE"]. "'";
if( insertar_bdd( "NOTICIAS", $valores )==0 ) echo "Error en la Insercion de los Datos."; else echo "Datos Agregados con Exito."; ?> El error que muestra es el siguiente: 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 ' SIE-Group.net , , .. <br>Grupo de Soluciones Inteligentes para tu Empres' at line 1Error en la Insercion de los Datos. Los datos como es ovio, no se insertan y el problema persiste :S !!.... Pero es importante mencionar, que si en el formulario omito este pedazo de texto: El mensjae se inserta con exito... Que puedo hacer ??
|
|
« Última modificación: 18 Abril 2008, 02:49 am por Diabliyo »
|
En línea
|
|
|
|
Hans el Topo
Desconectado
Mensajes: 1.754
"Estoy cansado de no hacer nada"
|
no es problema de la consulta, es problema de lo que haces para enviar la consulta
si no me equivoco separas los campos por el carácter :
y como eso lleva : pués al dividir los trozos de los campos, supongo que creará más valores que campos
el problema radica en esa función insertar_bdd( "NOTICIAS", $valores )
que no has puesto xD
la solución sería enviarle un array con los valores de los campos en vez de eso separado por caracteres
|
|
|
En línea
|
|
|
|
Diabliyo
Desconectado
Mensajes: 1.441
shell# _
|
no es problema de la consulta, es problema de lo que haces para enviar la consulta
si no me equivoco separas los campos por el carácter :
y como eso lleva : pués al dividir los trozos de los campos, supongo que creará más valores que campos
el problema radica en esa función insertar_bdd( "NOTICIAS", $valores )
que no has puesto xD
la solución sería enviarle un array con los valores de los campos en vez de eso separado por caracteres
Asi es mi estimado... creo que para ese rato me cicle demasiado pensando tanto :S !!.. Pero ahora que estoy con mas calma asimilo todo jejeje... Ciertamente el simblo ' :' es el que utilizo como delimitador para determinar el numero de valores enviados, despues el simbolo ' =' lo utilizo como delimitador para obtener la variable y el valor y asi realizar la insercion en la base de datos... Aqui te dejo el code de la funcion insertar_bdd(), para ver si puede haber una forma de solucionar el probema sin necesidad de pasar la trama en formato de array y conservar los delimitadores... Porque estamos hablando de un buen de lineas a modificar si es que es necesario pasar la trama en forma de array . function insertar_bdd( $base_t, $valores ) { $link= conectar(); if( strchr( $valores, ":" ) ) //si existe el : tons ahi mas de 1 valor { //$valores= str_replace( ":", ",", $valores ); //cambiamos el : por , $vars=""; $datos=""; $buf= explode( ":", $valores ); //recorremos para tener los nombres de variables en una '$variable' //y los valores de las variables en otra '$variable' for( $i=0; $i<sizeof($buf); $i++ ) { $buf2= explode( "=", $buf[$i] ); $vars .= $buf2[0]; $datos .= $buf2[1]; if( ($i+1)!=sizeof($buf) ) { $datos .= ", "; $vars .= ", "; } unset($buf2); }
if( !($resp= mysql_query( "insert into ". $base_t. " ( ". $vars. " ) values( ". $datos. " );", $link )) ) { echo "<span id=\"letras_error\">Error 03: Problema para Realizar Movimiento/Consulta."; echo mysql_error(). "</span>"; } else { unset( $valores ); unset( $buf ); unset( $var ); unset( $datos ); @mysql_close($link); return $resp; } } else if( strchr( $valores, "=" ) ) //entonces solo se desea insertar 1 valor { $buf2= explode( "=", $valores[$i] ); $vars .= $buf2[0]; $datos .= $buf2[1];
if( ($i+1)!=sizeof($valores) ) { $datos .= ", "; $vars .= ", "; }
if( !($resp= mysql_query( "insert into ". $base_t. " ( ". $vars. " ) values( ". $datos. " );", $link )) ) { echo "<span id=\"letras_error\">Error 03: Problema para Realizar Movimiento/Consulta."; echo mysql_error(). "</span>"; } else { unset( $valores ); unset( $buf2 ); unset( $var ); unset( $datos ); @mysql_close($link); return $resp; } } else echo "<span id=\"letras_error\">Error 04: Problema para descifrar Datos para Realizar Consulta.</span>"; @mysql_close($link); return "ERROR"; }
|
|
« Última modificación: 16 Abril 2008, 04:57 am por Diabliyo »
|
En línea
|
|
|
|
Diabliyo
Desconectado
Mensajes: 1.441
shell# _
|
Hola: Como primer instancia y evitar generacion de variables de mas (por repeticion del delimitado ' :')... Es que, dentro de la funcion insertar_bdd() coloque un condicional en donde tome el numero de CAMPOS de la tabla a donde se desea insertar valores, y que este numero de CAMPOS sea igual o menos al numero de valores obtenidos despues de hacer el corte con la funcion: sizeof(($buf= explode( ":", $valores )))... Pero, no se me ocurre como poder seguir utilizando como delimitador ' :' y que el usuario pueda usar este mismo simbolo en sus noticias !! bye bye
|
|
|
En línea
|
|
|
|
Hans el Topo
Desconectado
Mensajes: 1.754
"Estoy cansado de no hacer nada"
|
tienes que hacerlo por array
no tiene sentido utilizar caracteres como delimitadores ya que en cuanto utilicen ese caracter la consulta petara
$valores=array("campo"=>"valor","campon"=>"valorn");
luego vas recorriendo la array a la hora d formar la consulta y listo
|
|
|
En línea
|
|
|
|
Diabliyo
Desconectado
Mensajes: 1.441
shell# _
|
Hola: Gracias por ayuda Hans el Topo, finalmente he corregido el code y ya quedo... Para los curiosos, aqui les va la solucion:
El procedimiento de insercion teoricamente es el siguiente: 1- realizar una trama con todas las variables y valores. 2- Enviar la trama a una funcion ( insertar_bdd( "NOMBRE_TABLE", $trama )) y que desifre la trama para despues insertar. El PROCEDIMIENTO ANTIGUO ERA: Generar una trama utilizando como delimitador el simbolo ':', pero conforme la practica y testeo resulto inutil el delimitador, ya que si el usuario generaba un mensaje o titulo que contenga el simbolo ' :', la insercion seria un caos y daria error.... <?php
//La trama sera la variable "$valores". $valores=""; $valores .= "autor="; $valores .= "'". $_SESSION["log_usr"]. "'"; $valores .= ":"; $valores .= "titulo="; $valores .= "'". $_POST["titulo_noticia"]. "'"; $valores .= ":"; $valores .= "mensaje="; $valores .= "'". htmlentities($msg, ENT_QUOTES). "'"; $valores .= ":"; $valores .= "fecha="; $valores .= "'". time(). "'"; $valores .= ":menu="; $valores .= "'". $buf_menu["NOMBRE"]. "'"; $valores .= ":sección="; $valores .= "'". $buf_sec["NOMBRE"]. "'";
//la tabla se llama NOTICIAS if( insertar_bdd( "NOTICIAS", $valores )==0 ) echo "Error en la Insercion de los Datos."; else echo "Datos Agregados con Exito."; ?> La SOLUCION AL PROBLEMA es realizar una trama pero sin delimitador, que la trama sea un array, pero donde la palabra clave de cada miembro del arreglo sera el nombre de la variable y pues el valor, seria el valor para dicha variable. Ejemplo de array comun: Ejemplo de array con clave/valor: [nombre1]="carlos" [nombre2]="arturo" Asi que generamos una trama mediante arrays, y pasamos la trama a la funcion insetar_bdd( "NOMBRE_TABLA", $trama ). El code seria: <?php
//La trama sera la variable "$valores". $valores= array( "autor"=>"'". $_SESSION["log_usr"]. "'", "titulo"=>"'". $_POST["titulo_noticia"]. "'", "mensaje"=>"'". $msg. "'", "fecha"=>"'". time(). "'", "menu"=>"'". $buf_menu["NOMBRE"]. "'", "sección"=>"'". $buf_sec["NOMBRE"]. "'" );
//la tabla se llama NOTICIAS if( insertar_bdd( "NOTICIAS", $valores )==0 ) echo "Error en la Insercion de los Datos."; else echo "Datos Agregados con Exito."; ?> IMPORTANTE !!!La funcion insertar_bdd() debe ser modificada y quedaria asi: <?php function insertar_bdd( $base_t, $valores ) { $link= conectar(); if( count($valores)>0 ) //existen valores en el array { $i=0; $vars=""; $datos=""; //recorremos para tener los nombres de variables en una '$vars' //y los valores de las variables en otra '$datos' while( list($a, $b)=each($valores) ) { $i++; $vars .= $a; $datos .= $b; if( $i!=count($valores) ) //mientras no lleguemos a la ultima variable { $datos .= ", "; $vars .= ", "; } }
if( !($resp= mysql_query( "insert into ". $base_t. " ( ". $vars. " ) values( ". $datos. " );", $link )) ) { echo "<span id=\"letras_error\">Error 03: Problema para Realizar Movimiento/Consulta."; echo mysql_error(). "</span>"; } else { unset( $valores ); unset( $a ); unset( $b ); unset( $i ); unset( $var ); unset( $datos ); @mysql_close($link); return $resp; } } else echo "<span id=\"letras_error\">Error 04: Problema para descifrar datos.</span>"; @mysql_close($link); return "ERROR"; } ?>
|
|
« Última modificación: 18 Abril 2008, 02:58 am por Diabliyo »
|
En línea
|
|
|
|
|
|