[SOLUCIONADO] Problema al guardar usuarios.

Iniciado por iatsm, Octubre 24, 2013, 09:46:30 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Octubre 24, 2013, 09:46:30 PM Ultima modificación: Julio 14, 2014, 12:32:58 AM por Expermicid
Buenas muchachos, ando haciendo un proyecto para la universidad con un registro de usuarios por un código php y una base de datos, pero tengo algunos problemas (no tengo conocimientos del lenguaje como tal).

Bien he leído y leído el código para buscar el problema pero no encuentro nada (por eso acudo a su ayuda).

El código es el siguiente:

Código: php
<?php
       include ("funciones.php");
       $vNombre=$_POST['vNombre'];
   $vEmail=$_POST['vEmail'];
   $vClave=$_POST['vClave'];
   $vNickname=$_POST['vNickname'];
   $Query=("insert into usuarios (`Nombre`,`Email`,`Clave`,`Nickname`)values(`$vNombre`, `$vEmail`, `$vClave`, `$vNickname`,)");
   print("$Query");
if ($guardar=mysql_query($Query,$conexion))
{
        print("Usuario Registrado");
header('Location: Index.html');
}
else
{
print(`Error al guardar el usuario`);
}
?>


Pero no me guarda los datos ingresados por el usuario (registro) en la base de datos, y me genera el siguiente error: "#1064 - 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 ')Error al guardar el usuario' at line 1"

Si bien ya leo que es un error de la sintax no sé cual podría ser, espero que me puedan ayudar un saludo.

Pon la consulta asi:
$Query="INSERT INTO usuarios (Nombre,Email,Clave,Nickname) VALUES ('".$vNombre."','".$vEmail."','".$vClave."','".$vNickname."')";
y me avisas si te arroja un error salu2 :P
Pentest - Hacking & Security Services

Contact me: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Octubre 25, 2013, 08:08:59 PM #2 Ultima modificación: Octubre 25, 2013, 08:30:04 PM por overxfl0w13
Código: php
<?php
include_once("funciones.php");
$vNombre=$_POST['vNombre'];
$vEmail=$_POST['vEmail'];
$vClave=$_POST['vClave'];
$vNickname=$_POST['vNickname'];
$Query=("insert into usuarios (Nombre,Email,Clave,Nickname) values ($vNombre, $vEmail, $vClave, $vNickname)");
print("$Query");
if($guardar=mysql_query($Query,$conexion))
{
    print("Usuario Registrado");
    header('Location: Index.html');
}
else
{
    print("Error al guardar el usuario");
}
?>



Prueba eso, además filtra los parámetros y usa PDO, corta la ejecución del script si pasa algo raro, desactiva errores de php y lo que se te vaya ocurriendo para protegerte,¿no querrás que te hagan nada no?.

Un saludo :)

Octubre 26, 2013, 02:15:55 AM #3 Ultima modificación: Octubre 26, 2013, 02:23:04 AM por Harkonnen
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Código: php
<?php
include_once("funciones.php");
$vNombre=$_POST['vNombre'];
$vEmail=$_POST['vEmail'];
$vClave=$_POST['vClave'];
$vNickname=$_POST['vNickname'];
$Query=("insert into usuarios (Nombre,Email,Clave,Nickname) values ($vNombre, $vEmail, $vClave, $vNickname)");
print("$Query");
if($guardar=mysql_query($Query,$conexion))
{
    print("Usuario Registrado");
    header('Location: Index.html');
}
else
{
    print("Error al guardar el usuario");
}
?>



Prueba eso, además filtra los parámetros y usa PDO, corta la ejecución del script si pasa algo raro, desactiva errores de php y lo que se te vaya ocurriendo para protegerte,¿no querrás que te hagan nada no?.

Un saludo :)

???

no comprendo como puedes sugerir desactivar display errors a alguien que está recién comenzando, quieres que programe a ciegas?

filtrar los parametros si, usar ¿PDO? por lo menos podrías haber explicado que pdo tiene un consumo mayor que mysql improve y que la rama de funciones mysql_ está obsoleta, yo uso pdo pero no por eso ando diciendo a todo el mundo "usa pdo" mysqli es más eficiente, quizá requiera un poco más de esfuerzo a la hora de imponer seguridad, y pdo su ventaja eran las consultas prearmadas.

ok, dejando ese comentario de lado seguiré...

el caracter ` es diferente al caracter ' uno es apóstrofe y otro es acento francés, el primero lo puedes usar para especificar campos por ejemplo, y el segundo lo puedes utilizar para especificar textos o valores que contengan caracteres (no es necesario para numeros enteros o decimales).

Código: text
$Query= "insert into usuarios (`Nombre`,`Email`,`Clave`,`Nickname`) values( '{$vNombre}', '{$vEmail}', '{$vClave}', '{$vNickname}' )";


quité la última coma que no era necesaria y cambié algunos ` por '.

deberías siempre primero quitar los espacios, imaginate que se me ocurriera poner simples espacios de nombre, eso sería un serio problema no?, para eso puedes hacer esto:

Código: text
$vNombre=trim($_POST['vNombre']);


eso soluciona el tema de los espacios quitando espacios al principio y al final solo dejando los caracteres. (no borra los espacios en medio aclaro)

luego te recomiendo revisar cosas como por ejemplo que realmente se halla ingresado algo en el campo nombre, poniendo por ejemplo

Código: text
if(empty($vNombre)) die('El campo nombre debe completarse');


luego deberías también pensar en ponerle una medida de seguridad para evitar inyecciones sql, como por ejemplo:

Código: text
$vNombre = mysql_real_escape_string($vNombre);


o alguien del foro había sugerido utilizar ctypealnum si no me equivoco.

arthusu tendría razón si no ubiese usado el concatenador (.) con el (") que incluye parsear el texto, no tiene sentido usar concatenadores y ubiese usado la combinación de especificador de literal con concatenador (') y (.) o en su defecto directamente usar (") y para mejorar su efectividad con el concatenador ({)

saludos! y espero que te sea de ayuda.

Octubre 26, 2013, 08:14:02 AM #4 Ultima modificación: Octubre 26, 2013, 02:34:32 PM por overxfl0w13
Si estuviese comenzando tendrías toda la razón pero es un proyecto para la universidad y si quieres nota te lo tienes que ganar. No le digo que lo haga ya, si no que tenga en cuenta todo eso a la hora de hacerlo.

$Query= "insert into usuarios (`Nombre`,`Email`,`Clave`,`Nickname`) values( '{$vNombre}', '{$vEmail}', '{$vClave}', '{$vNickname}' )";

Toda esa parafernalia de apóstrofes, "acentos franceses" que llamas tú (a los valencianos y catalanes les ofenderá 8)), y corchetes son inútiles. Las dobles comillas te permiten concatenar variables sin necesidad de cortar y juntar con un . (evalúan la expresión) y por tanto evitarte tanto '{}' que sobra.

¿La rama de funciones mysql_ no estaba obsoleta? ¿Porqué le recomiendas usar mysql_real_escape_string?. Que use en su defecto mysqli_real_escape_string ¿no? que no lo está.

Respecto a PDO ¿a qué te refieres con consumo?, esto no es una lavadora, tendrá un mayor coste temporal o espacial (consumo espacial o temporal, si,bueno) pero no consumo a secas. Es cierto que tiene un menor rendimiento, pero no es orientado únicamente a mysql y  a la hora de cambiar de tecnología esta homogeneidad se paga. ¿Qué quieres, centrarte en la eficiencia? Usa mysqli, por eso quedó obsoleto mysql.

No me apetece escribir más un saludo  ;D

Octubre 26, 2013, 03:20:26 PM #5 Ultima modificación: Marzo 27, 2014, 05:22:08 PM por Expermicid
Gracias por responder muchachos, no entrare en detalles, pero encontré la solución y les dejo el código que utilicé (creo que no esta demás) y repito, gracias por responder.

Código: php
<?php
include ("funciones.php");
$vNombre=$_POST['vNombre'];
$vEmail=$_POST['vEmail'];
$vClave=$_POST['vClave'];
$vNickname=$_POST['vNickname'];

if ($vNombre==NULL or $vEmail==NULL or $vClave==NULL or $vNickname==NULL)
{
    echo "<script>alert('atencion campos incompletos'); header ('location: Registro.html');</script>";
}
else
$validar=mysql_query ("INSERT INTO usuarios(Nombre,Email,Clave,Nickname)
              values('$vNombre','$vEmail','$vClave','$vNickname')");
if ($validar ==0){  
echo 'Error en los datos.';
}else{

echo header ('location: Menu.html');
}
?>

Yo usaría empty() para hacer las comprobaciones en el if.

Como bien te dijeron, se recomienda que ya no se use mysql_ porque ya está obsoleta, yo te recomendaría PDO, aunque si te piensas centrar siempre en manejar datos con mysql, pues está la MySQLi.

Zalu2
Sólo el conocimiento te hace libre.

Octubre 26, 2013, 08:54:10 PM #7 Ultima modificación: Octubre 26, 2013, 10:12:08 PM por Harkonnen
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Yo usaría empty() para hacer las comprobaciones en el if.

Como bien te dijeron, se recomienda que ya no se use mysql_ porque ya está obsoleta, yo te recomendaría PDO, aunque si te piensas centrar siempre en manejar datos con mysql, pues está la MySQLi.

Zalu2

2fac3R tiene razón.

sobre el empty() por la simple razón que queda más estético "si está vacía la variable $variable" que "si la variable $variable es igual a nada", no obstante va a opinión y gusto del desarrollador.

además quiero aclarar una cosa, las constantes deben ser Definidas para una mejor lectura del código en mayusculas, no obstante, como se puede leer en la documentación de php, constantes del lenguaje tales como true, false, y null deben estar en minúsculas.

el echo revisalo porque el envío de cabeceras está mal xD

saludos!

EDITO:

no había visto la respuesta de overxfl0w13.

CitarSi estuviese comenzando tendrías toda la razón pero es un proyecto para la universidad y si quieres nota te lo tienes que ganar. No le digo que lo haga ya, si no que tenga en cuenta todo eso a la hora de hacerlo.

$Query= "insert into usuarios (`Nombre`,`Email`,`Clave`,`Nickname`) values( '{$vNombre}', '{$vEmail}', '{$vClave}', '{$vNickname}' )";

Toda esa parafernalia de apóstrofes, "acentos franceses" que llamas tú (a los valencianos y catalanes les ofenderá 8)), y corchetes son inútiles. Las dobles comillas te permiten concatenar variables sin necesidad de cortar y juntar con un . (evalúan la expresión) y por tanto evitarte tanto '{}' que sobra.

¿La rama de funciones mysql_ no estaba obsoleta? ¿Porqué le recomiendas usar mysql_real_escape_string?. Que use en su defecto mysqli_real_escape_string ¿no? que no lo está.

Respecto a PDO ¿a qué te refieres con consumo?, esto no es una lavadora, tendrá un mayor coste temporal o espacial (consumo espacial o temporal, si,bueno) pero no consumo a secas. Es cierto que tiene un menor rendimiento, pero no es orientado únicamente a mysql y  a la hora de cambiar de tecnología esta homogeneidad se paga. ¿Qué quieres, centrarte en la eficiencia? Usa mysqli, por eso quedó obsoleto mysql.

No me apetece escribir más un saludo  ;D

inútiles? LOL, son parte de un standard, si a ti te gusta hacer las cosas como se te da la gana, por mi bien, pero deberías saber que existen normas, que especifícan como hacer las cosas bien, para SQL (refiriendome únicamente a lo que a SQL le corresponda, vease acentos franceses, o apóstrofes y dejando de lado el tema de las llaves {}) lo que tu dices que son inútiles son cosas que están establecidas por un motivo, aunque reitero, si te gusta hacer las cosas como se te da la gana en vez de bien, pues no hay problema, aunque si se lo vas a comentar a alguien que recién empieza deberías conciderar decirle todo, y no lo que te gusta hacer a ti.

CitarLas dobles comillas te permiten concatenar variables sin necesidad de cortar y juntar con un . (evalúan la expresión) y por tanto evitarte tanto '{}' que sobra.

si las comillas dobles te permiten parsear los textos, no obstante las llaves colaboran con el motor zend a la hora de interpretar cosas por del estilo, yo siempre digo que a la gente que trabaja en desarrollar y mejorar php no están aburridos y hacen las cosas porque tienen ganas, siempre hay un por qué, quizá a ti te parezca que las cosas están por que si, o no tengas el suficiente conocimiento, pero lo que ocurre es que las llaves están para algo.

me tomé la libertad y el tiempo de escribir todo esto, porque aunque te parezca que las cosas no sirven para nada, en realidad todo tiene su función.

sobre el mysql_real_escape_string, si en eso tienes razón, pero no lo dije porque venía usando mysql_ y ya le había aconcejado cambiar por por ejemplo mysqli_ ¿por qué repetiría tanto lo mismo? ¿para cada cosa que digo tengo que explicar lo obvio también así no te quedan dudas?

CitarRespecto a PDO ¿a qué te refieres con consumo?, esto no es una lavadora, tendrá un mayor coste temporal o espacial (consumo espacial o temporal, si,bueno) pero no consumo a secas. Es cierto que tiene un menor rendimiento, pero no es orientado únicamente a mysql y  a la hora de cambiar de tecnología esta homogeneidad se paga. ¿Qué quieres, centrarte en la eficiencia? Usa mysqli, por eso quedó obsoleto mysql.

con consumo me refiero específicamente a consumos de recursos del hábitat o plataforma en la que se encuentra en ejecución el código, me sorprende que estando en una conversación de informática no puedas comprender un concepto tan básico como el "consumo", pero bien, solo me limitaré a explicar en brevedad y citando una de las definiciones de sistema operativo, "El sistema operativo es un gestor de los recursos físicos de una computadora, tales como dispositivos de e/s", si tomamos en cuenta esto, con consumo me refiero al consumo de tiempo que hace sobre dispositivos, y espacio de almacenamiento físico (no, no hablo de un disco rigido, hago la aclaración porque aparentemente es necesaria).

sobre el resto, si es verdad, pero si vas a decirle a alguien que use algo, deberías empezar explicando por que, como por ejemplo "porque pdo tiene mejor soporte para como por ejemplo PgSQL" por decir algo, o las razones, no deberías decir simplemente "usa tal cosa" porque así es como la mayoría programa sin saber ni lo que hace ni por qué lo hace.

solo quiero dejar una última aclaración, sea un proyecto para una universidad o para lo que fuere, deshabilitar display error es una estupidez siempre y cuando estén en la face de desarrollo, si se encuentra en producción, es muy aconcejable deshabilitar display error.

En todo caso podrías sugerir que diseñe un código que evalúe el estado del proyecto en base a por ejemplo una variable de entorno alojada en el .htacess o en un archivo de inicialización, o lo que se decee, para deshabilitar o habilitar display error dependiendo si se encuentra en producción o desarrollo.

en fin, isammuel es diseñador, si revisas un poco el foro lo notarás, no tiene sentido decirle que desactive display errors o baje el nivel de errores cuando está empezando a programar, o está en face desarrollo como ahora.

si entiendo que lo digas a futuro, pero aclaralo, porque sino no se entiende.

CitarNo me apetece escribir más un saludo  ;D

de eso no tengo nada que decir xD

ahora si, un saludo!

PD: creo que el tema está solucionado, me pareció pertinente hacer las aclaraciones para que cualquier lector, pueda entender, aquí no solo hay gente que sabe, y me parece una buena práctica siempre explicar las cosas por las que uno decide hacer algo o sugiere algo en específico, por más que estemos equivocados aveces, eso ayuda a autocorregirnos y a otras personas a poder aprender más.
Por eso es que cuando alguien dice cosas como "usa esto" o "haz esto" me gusta presionarle para que explique las razones.