Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: Diabliyo en 15 Abril 2008, 17:49 pm



Título: [SOLUCIONADO] No logro insertar en la BDD MySQL, que me estara fallando ?
Publicado por: Diabliyo en 15 Abril 2008, 17:49 pm
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
Código:
//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:
Código:
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:
Código:
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:
Código:
<?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:
Código:
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:

Código:
..:: SIE-Group.net ::..

El mensjae se inserta con exito... :D

Que puedo hacer ??


Título: Re: No logro insertar un mensaje en la BDD MySQL, que me estara fallando ???
Publicado por: Hans el Topo en 16 Abril 2008, 00:24 am
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


Título: Re: No logro insertar un mensaje en la BDD MySQL, que me estara fallando ???
Publicado por: Diabliyo en 16 Abril 2008, 04:52 am
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 :(.

Código:
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";
}


Título: Re: No logro insertar un mensaje en la BDD MySQL, que me estara fallando ???
Publicado por: Diabliyo en 16 Abril 2008, 05:03 am
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


Título: Re: No logro insertar un mensaje en la BDD MySQL, que me estara fallando ???
Publicado por: Hans el Topo en 16 Abril 2008, 11:25 am
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


Título: Re: No logro insertar un mensaje en la BDD MySQL, que me estara fallando ???
Publicado por: Diabliyo en 18 Abril 2008, 02:49 am
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....

Código:
<?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:
Código:
[0]="carlos"
[1]="arturo"

Ejemplo de array con clave/valor:

Código:
[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:

Código:
<?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:

Código:
<?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";
}
?>