JeuWeb - Crée ton jeu par navigateur
Bête Insert qui plante ... - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Bête Insert qui plante ... (/showthread.php?tid=2677)



Bête Insert qui plante ... - Stefff - 21-06-2008

Voilà, j'ai décidé d'un petit peu m'y mettre vu que la fin des examens approche à grands pas ^^

Comme à mon habitude, je me lance et j'apprends au fur et à mesure.

J'ai tenté de faire un BETE (mais quand je dis bête, c'est vraiment bête) script d'inscription.

première page, pas de problèmes dans tous les cas, un formulaire qui envoie les infos a ma deuxième page. Et c'est là que ça se corse.

Première étape : un bête script qui récupère et insère les infos dans la base de données. --> Pas de problèmes

Deuxième étape : vérification de l'existence ou non du pseudo ou de l'adresse email dans la table. Et c'est là que ça veut pas Confused (NB : une boucle aurait été plus sympa pour les vérifications, mais ça ne marche déjà pas comme ça, donc ...)
J'ai essayé de découper morceau par morceau, à ce moment là, pas de problèmes pour l'exécution, mais après, lorsque tout est assemblé, j'ai droit à un :

Citation :Impossible de se connecter : 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 ''members' ('id', 'username', 'password', 'authlevel', 'email') VALUES('', '1', '' at line 1

Voilà le code

Code PHP :
<?php
// récupération des infos de connection à la base de données
include("config.php");

//connexion à la base de données
$link = mysql_connect($dbhost, $dbuser, $dbpasswd)
or die(
"Impossible de se connecter : " . mysql_error());

//sélection de la base de données
$db_selected = mysql_select_db($dbname, $link)
or die(
"Base innaccessible : " . mysql_error());

//récupération des variables $_POST
$username = $_POST["username"];
$password = $_POST["password"];
$email = $_POST["email"];

//Variable de vérification
$ok = 1;

//Vérification existance ou non de l'username
$sql01 = "SELECT * FROM members WHERE username = '".$username."'";
$requete01 = mysql_query($sql01) or die('Erreur SQL !'.$sql01.'<br/>'.mysql_error());

//Si username n'existe pas
if (mysql_num_rows($requete01) == 0)
{
}
//Si username existe
else
{
print (
"Pseudo déjà utilisé. <br/>");
$ok = 0;
}


//Vérification existance ou non de l'adresse email
$sql02 = "SELECT * FROM members WHERE email = '".$email."'";
$requete02 = mysql_query($sql02) or die('Erreur SQL !'.$sql02.'<br/>'.mysql_error());

//Si email n'existe pas
if (mysql_num_rows($requete02) == 0)
{
}
//Si email existe
else
{
print (
"Adresse email déjà utilisée. <br/>");
$ok = 0;
}


//Si la valeur d'autorisations indique qu'il n'y a pas de problèmes, on insère les valeurs dans la base mysql
//(pas de enter dans le code avant VALUES)
if ($ok == 1)
{
$reg=mysql_query("INSERT INTO 'members' ('id', 'username', 'password', 'authlevel', 'email')
VALUES('', '
$username', '$password', '0', '$email')")
or die(
"Impossible de se connecter : " . mysql_error());
print (
"Inscription réussie. <br/>");
}
else
{
print (
"Veuillez recommencer. <br/>");
}

mysql_close($link);
?>

Merci d'avance ^^


RE: Bête Insert qui plante ... - Eluox - 21-06-2008

$reg = mysql_query("INSERT INTO 'members' (id, username, password,) ect

Sans les quotes Wink


RE: Bête Insert qui plante ... - chobedo - 21-06-2008

$reg = mysql_query("INSERT INTO members (id, username, password,)

Sans les quotes autour de la table aussi( ou alors des `).

VALUES('', '$username', '$password', '0', '$email')

la il inserera $username, $password et $email alors que tu veux insérer leurs valeurs donc :

VALUES('', ' " . $username . " ', ' " . $password . " ', '0', ' " . $email . " ')


RE: Bête Insert qui plante ... - Eluox - 21-06-2008

Fiou, j'devrais dormir plus souvent, avait pas tout vu ^^


RE: Bête Insert qui plante ... - Stefff - 21-06-2008

xD

Merci ^^

€dit : J'avais mis un edit qui servait a rien xD

€dit qui sert :
apparement, ça ne marche pas top : il ne repère le pseudo/email existant que s'il est vide.
Explications : il ne détecte pas d'égalité si je mets deux fois "stefff" lors de deux inscription, idem pour l'email, mais si je mets 2 fois un champ vide, là il s'en rend compte ... idée ?


RE: Bête Insert qui plante ... - Yoda54 - 22-06-2008

chobedo a écrit :VALUES('', '$username', '$password', '0', '$email')

la il inserera $username, $password et $email alors que tu veux insérer leurs valeurs donc :

VALUES('', ' " . $username . " ', ' " . $password . " ', '0', ' " . $email . " ')

Bonjour,

La requête est entre guillemets doubles, les variables seront donc remplacées par leurs valeurs lors de l'exécution de la requête et la concaténation est donc inutile.


Sinon, c'est du détail, mais plutôt que d'initialiser $ok à 1 et de la passer à 0 à chaque erreur, il est possible de l'initialiser à 0 à chaque erreur et d'utiliser isset dans la condition (pas de création de $ok si ce n'est pas nécessaire).


RE: Bête Insert qui plante ... - z3d - 22-06-2008

Tout d'abord je pense que tu devrais, en premier lieu, vérifier si le formulaire n'est pas soumis vide, cela évitera des requêtes "vide" et de se protéger de ce que l'on nomme le SQL injection.

Petite parenthèse : Le SQL injection permet si tu ne protèges pas tes chaines, de pouvoir faire ressortir des informations importante et mettre à mal la sécurité de ton site.

Commençons donc par le début :

Code PHP :
<?php 
$bError
= false;

/**
* récupération des variables $_POST
*
* Utilisation de la fonction trim() pour supprimer les espaces avant et après la chaîne,
* si jamais le visiteur ne rentre que des espaces,
* la chaîne retourné sera donc vide.
*/

$username = trim($_POST["username"]);
$password = trim($_POST["password"]);
$email = trim($_POST["email"]);

// Vérification du username
if(empty($username)) {
$bError = true;
}
// Vérification du password
if(empty($password)) {
$bError = true;
}
// Vérification du courriel
if(empty($email)) {
$bError = true;
}

// [...]

/**
* Si aucun champs n'est vide on continue l'enregistrement
* A partir d'ici on sait, que les variables ont une valeur
*/
if($bError === false) {
/**
* Connexion à la base de données
*/
// ...

/**
* Ici on va tester l'éxistence du pseudo
* et on n'oublie pas de protéger notre valeur contre le SQL injection
*/
$sSQL = "SELECT COUNT(*) FROM members WHERE username = '".mysql_real_escape_string($username)."'";
$rQuery = mysql_query($sSQL);
$aResult = mysql_fetch_row($rQuery);
// Cette requête renvoie le nombre de ligne trouvé avec le même username
if(0 !== (int) $aResult[0]) {
$bError = true;
}
// Tu répétes la même portion de script pour l'email
// [...]

/**
* Si aucune erreur n'a été détecté on continue le déroulement
* du script et nous allons donc enregistrer le nouvel utilisateur
*/
if($bError === false) {
/**
* L'identifiant (id) étant généré automatiquement celui-ci
* n'a pas lieu d'être dans la requête suivante
*
* 0 étant un entier le protéger par des simples quote est inutile
* sauf si tu as spécifier ce champ en tant que texte dans ce
* cas les simples quote sont obligatoires
*/
$sSQL = "INSERT INTO members(id, username, password, authlevel, email) VALUES(".
"'".mysql_real_escape_string($username)."', ".
"'".mysql_real_escape_string($password)."', ".
"0, ".
"'".mysql_real_escape_string($email)."')";

mysql_query($sSQL);

/**
* Maintenant on vérifie si l'insertion s'est bien déroulé
* en demandant à MySQL de nous retourner l'identifiant généré
*/
$iMemberID = mysql_insert_id();

if(
0 < (int) $iMemberID) {
print (
"Votre inscription a réussie.<br/>");
} else {
print (
"Un problème est survenu lors de votre inscription, essayez plus tard.<br />");
}
}
}

// Fermeture de la connexion au serveur
mysql_close($link);

Et voilà je pense t'avoir donné toutes les étapes essentiel au bon déroulement de ton script si quelque chose te tracasse n'hésite pas à poser des questions.

Par conter pour le mot de passe, pour des raisons de sécurité je te conseil vivement de crypter celui-ci en utilisant la fonction sha1().


RE: Bête Insert qui plante ... - Stefff - 22-06-2008

Grand merci à tout le monde pour les coups de mains ^^ ça donne encore plus envie de s'investir xD

Reste plus qu'à rajouter certains paramètres Smile

Je posterai ici une fois que j'aurai fini Smile

€dit : pourrait-on me donner un coup de main pour la compréhension de cette ligne?
Code PHP :
<?php 
if(0 !== (int) $uResult[0])



RE: Bête Insert qui plante ... - Anthor - 22-06-2008

Si l'entier du résultat n'est pas égal à zéro.


RE: Bête Insert qui plante ... - Stefff - 22-06-2008

xD

Je voulais savoir pourquoi la variable $uResult renvoyait elle même les informations sous la forme d'un tableau Confused

J'ai réussi à intégrer les infos de z3d dans mon propre code Smile

Maintenant une petite question au niveau de l'avis : pour les réglementation de longueur (par exemple), est-il mieux de vérifier en javascript ou par le php ? (idem pour la validité de l'email) ...

Le javascript à l'avantage d'afficher directement sur le formulaire d'inscription, mais dans le cas où il est désactivé, c'est plutôt génant ...

Ou faut-il, afin d'avoir un résultat optimal, faire une vérification dans le formulaire, pour le confort de l'utilisateur, et vérifier dans le code php afin d'avoir une sécurisation ?

Deuxième petite question Tongue
mysql_real_escape_string est-il suffisant ? ou faut-il aussi passer par html entities, addslash, etc ?

Merci encore pour vos réponses ^^