elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  PHP (Moderador: #!drvy)
| | | |-+  [SOLUCIONADO] No logro insertar en la BDD MySQL, que me estara fallando ?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [SOLUCIONADO] No logro insertar en la BDD MySQL, que me estara fallando ?  (Leído 2,531 veces)
Diabliyo


Desconectado Desconectado

Mensajes: 1.441


shell# _


Ver Perfil WWW
[SOLUCIONADO] No logro insertar en la BDD MySQL, que me estara fallando ?
« 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 ??


« Última modificación: 18 Abril 2008, 02:49 am por Diabliyo » En línea

Hans el Topo


Desconectado Desconectado

Mensajes: 1.754


"Estoy cansado de no hacer nada"


Ver Perfil WWW
Re: No logro insertar un mensaje en la BDD MySQL, que me estara fallando ???
« Respuesta #1 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


En línea

Diabliyo


Desconectado Desconectado

Mensajes: 1.441


shell# _


Ver Perfil WWW
Re: No logro insertar un mensaje en la BDD MySQL, que me estara fallando ???
« Respuesta #2 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";
}
« Última modificación: 16 Abril 2008, 04:57 am por Diabliyo » En línea

Diabliyo


Desconectado Desconectado

Mensajes: 1.441


shell# _


Ver Perfil WWW
Re: No logro insertar un mensaje en la BDD MySQL, que me estara fallando ???
« Respuesta #3 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
En línea

Hans el Topo


Desconectado Desconectado

Mensajes: 1.754


"Estoy cansado de no hacer nada"


Ver Perfil WWW
Re: No logro insertar un mensaje en la BDD MySQL, que me estara fallando ???
« Respuesta #4 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
En línea

Diabliyo


Desconectado Desconectado

Mensajes: 1.441


shell# _


Ver Perfil WWW
Re: No logro insertar un mensaje en la BDD MySQL, que me estara fallando ???
« Respuesta #5 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";
}
?>
« Última modificación: 18 Abril 2008, 02:58 am por Diabliyo » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
(solucionado)[VB6] Insertar control permanente en la ToolBox
Programación Visual Basic
SuperDraco 3 3,003 Último mensaje 16 Julio 2011, 01:08 am
por raul338
insertar mysql
PHP
kakashi20 2 1,645 Último mensaje 25 Febrero 2012, 06:46 am
por Shell Root
no puedo insertar en BD MySQL(solucionado)
PHP
basickdagger 6 2,958 Último mensaje 7 Marzo 2013, 07:10 am
por basickdagger
insertar en Google SpreadSheet [SOLUCIONADO]
Dudas Generales
Maurice_Lupin 0 2,241 Último mensaje 4 Abril 2014, 01:04 am
por Maurice_Lupin
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines