Erreur anodine dans un code PHP (débutant)
banban6971
Messages postés
11
Date d'inscription
Statut
Membre
Dernière intervention
-
Utilisateur anonyme -
Utilisateur anonyme -
Bonjour,
j'essaye d'intégré un code php de création de compte à ma page internet et j'ai l'erreur suivante, j'ai lu qu'elle était anodine mais je n'y connais rien, voici l'erreur :
Notice: Undefined index: accname in D:\xampp\htdocs\index.php on line 386
Notice: Undefined index: password in D:\xampp\htdocs\index.php on line 386
Notice: Undefined index: email in D:\xampp\htdocs\index.php on line 386
Error: Duplicate entry '' for key 'idx_username'
Et voici le code php :
<?php
$host = "localhost";
$user = "root";
$pass = "root";
$con = mysql_connect($host, $user, $pass);
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db("realmd", $con);
$sql="INSERT INTO account (username, sha_pass_hash, email, expansion)
VALUES
('$_POST[accname]','$_POST[password]','$_POST[email]','2')";
if (!mysql_query($sql,$con))
{
die('Error: ' . mysql_error());
}
echo "Account Created";
mysql_close($con)
?>
-----------------------------------
Si quelqu'un pouvait corriger mon code ce serait vraiment gentil ... :) Bonne journée !
j'essaye d'intégré un code php de création de compte à ma page internet et j'ai l'erreur suivante, j'ai lu qu'elle était anodine mais je n'y connais rien, voici l'erreur :
Notice: Undefined index: accname in D:\xampp\htdocs\index.php on line 386
Notice: Undefined index: password in D:\xampp\htdocs\index.php on line 386
Notice: Undefined index: email in D:\xampp\htdocs\index.php on line 386
Error: Duplicate entry '' for key 'idx_username'
Et voici le code php :
<?php
$host = "localhost";
$user = "root";
$pass = "root";
$con = mysql_connect($host, $user, $pass);
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db("realmd", $con);
$sql="INSERT INTO account (username, sha_pass_hash, email, expansion)
VALUES
('$_POST[accname]','$_POST[password]','$_POST[email]','2')";
if (!mysql_query($sql,$con))
{
die('Error: ' . mysql_error());
}
echo "Account Created";
mysql_close($con)
?>
-----------------------------------
Si quelqu'un pouvait corriger mon code ce serait vraiment gentil ... :) Bonne journée !
A voir également:
- Erreur anodine dans un code PHP (débutant)
- Code ascii - Guide
- Comment déverrouiller un téléphone quand on a oublié le code - Guide
- Code puk bloqué - Guide
- Code activation windows 10 - Guide
- Code blocks - Télécharger - Langages
8 réponses
'lut, sur la ligne suivante:
Tu as omis les guillemets autour des noms de paramètres.
Aussi, l'extension MySQL est obsolète, vieille, lente, dangereuse car plus maintenue et induisant de mauvaises pratiques comme le
Qui plus est ton code actuel est sujet aux injections SQL qui peuvent modifier ou détruire tes tables/ta base de données à la volonté de n'importe quel visiteur. Passe à mysqli ou PDO et utilises les requêtes préparées.
from human import idiocy
del idiocy
('$_POST[accname]','$_POST[password]','$_POST[email]','2')";
Tu as omis les guillemets autour des noms de paramètres.
Aussi, l'extension MySQL est obsolète, vieille, lente, dangereuse car plus maintenue et induisant de mauvaises pratiques comme le
dieque tu utilises, et la gestion d'erreur (
mysql_error) est archaïque et inefficace.
Qui plus est ton code actuel est sujet aux injections SQL qui peuvent modifier ou détruire tes tables/ta base de données à la volonté de n'importe quel visiteur. Passe à mysqli ou PDO et utilises les requêtes préparées.
from human import idiocy
del idiocy
Ce que tu veux dire c'est qu'il y a un risque d'intrusion vis a vis de ce code ?
('$_POST["accname"]','$_POST["password"]','$_POST["email"]','2')";
Quand je rajoute les guillemets comme ceci cela met une autre erreur ...
Parse error: syntax error, unexpected '"', expecting identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in D:\xampp\htdocs\index.php on line 386
Mais carrément sur toute la page cette fois
('$_POST["accname"]','$_POST["password"]','$_POST["email"]','2')";
Quand je rajoute les guillemets comme ceci cela met une autre erreur ...
Parse error: syntax error, unexpected '"', expecting identifier (T_STRING) or variable (T_VARIABLE) or number (T_NUM_STRING) in D:\xampp\htdocs\index.php on line 386
Mais carrément sur toute la page cette fois
Oups j'ai raté ce 2e détail: la concaténation de chaines de caractère se fait via l'opérateur
Et OUI il y a un risque d'intrusion, un paramètre POST façonné comme il faut permet de modifier ou détruire la table/base. Il y a un exemple (via un paramètre GET mais le principe est exactement le même) dans mon article concernant l'extension MySQL, dans son paragraphe le plus important.
Les requêtes préparées, en plus d'être plus élégantes et lisibles, réduisent ce risque à zéro si on s'en sers bien.
., comme ceci:
('.$_POST["accname"].','.$_POST["password"].','.$_POST["email"].','2')";
Et OUI il y a un risque d'intrusion, un paramètre POST façonné comme il faut permet de modifier ou détruire la table/base. Il y a un exemple (via un paramètre GET mais le principe est exactement le même) dans mon article concernant l'extension MySQL, dans son paragraphe le plus important.
Les requêtes préparées, en plus d'être plus élégantes et lisibles, réduisent ce risque à zéro si on s'en sers bien.
Okay je vais lire ça, je ne connais pas grand chose, mais j'ai une connaissance qui a fait des études dans l'informatique, je vais voir si il y a des alternatives. Et pour info j'ai toujours la même erreur même avec les points. C'est normal ?
Bonjour
C'est normal que tu aies toujours l'erreur avec les points, vu que ton écriture initiale était correcte. Contrairement à ce que t'avait dit gravgun dans son premier message, il ne fallait pas ajouter d'apostrophes.
Par contre, il a parfaitement raison en ce qui concerne l'obsolescence de l'extension mysql_ et les risques associés.
L'erreur que tu avais, et que tu as toujours, vient du fait que tu traites des variables d'un formulaire qui n'est pas reçu. Soit il n'est pas reçu du tout, soit il n'utilise pas la méthode GET, soit les noms des champs sont incorrects...
Peux-tu ajouter print_($_POST); au début de ton script pour voir ce que tu reçois vraiment ?
C'est normal que tu aies toujours l'erreur avec les points, vu que ton écriture initiale était correcte. Contrairement à ce que t'avait dit gravgun dans son premier message, il ne fallait pas ajouter d'apostrophes.
Par contre, il a parfaitement raison en ce qui concerne l'obsolescence de l'extension mysql_ et les risques associés.
L'erreur que tu avais, et que tu as toujours, vient du fait que tu traites des variables d'un formulaire qui n'est pas reçu. Soit il n'est pas reçu du tout, soit il n'utilise pas la méthode GET, soit les noms des champs sont incorrects...
Peux-tu ajouter print_($_POST); au début de ton script pour voir ce que tu reçois vraiment ?
J'ai pas précisé.
Il n'y avait rien à préciser car il n'y avait aucun problème de guillemets simples ou doubles.
Quand on met une variable tableau dans une chaîne entre guillemets doubles, il ne faut pas de guillemets simples autour de l'index.
D'ailleurs PHP ne signalait aucune erreur de syntaxe, seulement une erreur d'exécution, preuve que la syntaxe était correcte.
Il n'y avait rien à préciser car il n'y avait aucun problème de guillemets simples ou doubles.
Quand on met une variable tableau dans une chaîne entre guillemets doubles, il ne faut pas de guillemets simples autour de l'index.
D'ailleurs PHP ne signalait aucune erreur de syntaxe, seulement une erreur d'exécution, preuve que la syntaxe était correcte.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
J'ai enlevé les guillemets et ajouté ton code au debut et ca donne :
Parse error: syntax error, unexpected '$host' (T_VARIABLE) in D:\xampp\htdocs\index.php on line 373
Pour la sécurité je vais voir ça avec mon beau frère, il travaille des sites web
merci
Parse error: syntax error, unexpected '$host' (T_VARIABLE) in D:\xampp\htdocs\index.php on line 373
Pour la sécurité je vais voir ça avec mon beau frère, il travaille des sites web
merci
En enlevant les guillements, les points puis en ajoutant ton code j'obtient : Array ( )
Notice: Undefined index: accname in D:\xampp\htdocs\index.php on line 387
Notice: Undefined index: password in D:\xampp\htdocs\index.php on line 387
Notice: Undefined index: email in D:\xampp\htdocs\index.php on line 387
Error: Duplicate entry '' for key 'idx_username'
Notice: Undefined index: accname in D:\xampp\htdocs\index.php on line 387
Notice: Undefined index: password in D:\xampp\htdocs\index.php on line 387
Notice: Undefined index: email in D:\xampp\htdocs\index.php on line 387
Error: Duplicate entry '' for key 'idx_username'
Si $_POST vaut simplement un Array ( ) vide, c'est que tu ne reçois pas de formulaire par POST.
Peux-tu donner le code du formulaire ?
Peux-tu donner le code du formulaire ?
Je n'ai pas tout compris :
<?php
$host = "localhost";
$user = "root";
$pass = "root";
$con = mysql_connect($host, $user, $pass);
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db("realmd", $con);
$sql="INSERT INTO account (username, sha_pass_hash, email, expansion)
VALUES
('$_POST[accname]','$_POST[password]','$_POST[email]','2')";
if (!mysql_query($sql,$con))
{
die('Error: ' . mysql_error());
}
echo "Account Created";
mysql_close($con)
?>
La machine ne prendrais pas en compte certaine fonction ? oO
<?php
$host = "localhost";
$user = "root";
$pass = "root";
$con = mysql_connect($host, $user, $pass);
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db("realmd", $con);
$sql="INSERT INTO account (username, sha_pass_hash, email, expansion)
VALUES
('$_POST[accname]','$_POST[password]','$_POST[email]','2')";
if (!mysql_query($sql,$con))
{
die('Error: ' . mysql_error());
}
echo "Account Created";
mysql_close($con)
?>
La machine ne prendrais pas en compte certaine fonction ? oO
Ce n'est pas un problème de machine...
Tu lui demandes d'enregistrer les valeurs de accname,password et email mais d'où viennent ces valeurs ? Tu n'as pas un formulaire où le visiteur remplit ces informations ?
[edit] J'avais oublié de préciser : le code de ta réponse précédente N'EST PAS le code du formulaire. Le formulaire est ce que le visiteur remplit et qui envoie les informations au serveur. Le code que tu donnes est celui qui traite les informations envoyées par le formulaire.
Tu lui demandes d'enregistrer les valeurs de accname,password et email mais d'où viennent ces valeurs ? Tu n'as pas un formulaire où le visiteur remplit ces informations ?
[edit] J'avais oublié de préciser : le code de ta réponse précédente N'EST PAS le code du formulaire. Le formulaire est ce que le visiteur remplit et qui envoie les informations au serveur. Le code que tu donnes est celui qui traite les informations envoyées par le formulaire.
Je n'ai aucune connaissance en informatique donc je ne savais pas qu'il n'y avait pas de formulaire en fait !
J'avais un site avant et ce code marchait très bien :
--------------------------------------------
<?php
/*Config*/
$realmd = array(
'db_host'=> 'localhost', //ip of db realm
'db_username' => 'root',//realm user
'db_password' => 'root',//realm password
'db_name'=> 'realmd',//realm db name
);
q
///////////////Start script//////////////////
/*
Function name: CHECK FOR SYMBOLS
Description: return TRUE if matches. ( True = OK ) ( False = NOT OK)
function check_for_symbols($string){
$len=strlen($string);
$alowed_chars="1234567890abcdefghijklmnopqrstuvwxyzÃf¦Ãf¸ÃfÂ¥ABCDEFGHIJKLMNOPQRSTUVWXYZÃf+Ãf~Ãf...&é"'(-è_çà)=$*!ù^^"";
for($i=0;$i<$len;$i++) {
if (!strstr($alowed_chars,$string[$i]))
return TRUE;
}
return FALSE;
}
/*
Function name: OUTPUT USERNAME:PASSWORD AS SHA1 crypt
Description: obious.
function sha_password($user,$pass){
$user = strtoupper($user);
$pass = strtoupper($pass);
return SHA1($user.':'.$pass);
}
if (isset($_POST['registration']) && $_POST['registration']) {
/*Connect and Select*/
$realmd_bc_new_connect = mysql_connect($realmd['db_host'],$realmd['db_username'],$realmd['db_password']);
$selectdb = mysql_select_db($realmd['db_name'],$realmd_bc_new_connect);
if (!$realmd_bc_new_connect || !$selectdb) {
$information = array('status' => 'nok', 'message' => 'Could NOT connect to db, please check the config part of the file!');
}
/*Checks*/
$username = mysql_real_escape_string($_POST['username']);
$password = sha_password($username,$_POST['password']);
$qry_check_username = mysql_query("SELECT username FROM `account` WHERE username='$username'");
if (check_for_symbols($_POST['password']) == TRUE || check_for_symbols($username) == TRUE || mysql_num_rows($qry_check_username) != 0){
$information = array('status' => 'nok', 'message' => 'Erreur lors de la création de votre compte : utilisateur déjà existant ou username/password invalide');
}
else{
mysql_query("INSERT INTO account (username,sha_pass_hash) VALUES ('$username','$password')");// Insert into database.
$information = array('status' => 'ok', 'message' => 'Votre compte a été créé');;
}
}
?>
---------------------------------------------------------------
sauf que maintenant j'ai cette erreur :
Parse error: syntax error, unexpected 'function' (T_FUNCTION) in D:\xampp\htdocs\index.php on line 389
---------------------------------------------------------------
Tu sais d'où viens le soucis ? il y a le formulaire + le code pour la base de donnée la je me trompe ?
J'avais un site avant et ce code marchait très bien :
--------------------------------------------
<?php
/*Config*/
$realmd = array(
'db_host'=> 'localhost', //ip of db realm
'db_username' => 'root',//realm user
'db_password' => 'root',//realm password
'db_name'=> 'realmd',//realm db name
);
q
///////////////Start script//////////////////
/*
Function name: CHECK FOR SYMBOLS
Description: return TRUE if matches. ( True = OK ) ( False = NOT OK)
- /
function check_for_symbols($string){
$len=strlen($string);
$alowed_chars="1234567890abcdefghijklmnopqrstuvwxyzÃf¦Ãf¸ÃfÂ¥ABCDEFGHIJKLMNOPQRSTUVWXYZÃf+Ãf~Ãf...&é"'(-è_çà)=$*!ù^^"";
for($i=0;$i<$len;$i++) {
if (!strstr($alowed_chars,$string[$i]))
return TRUE;
}
return FALSE;
}
/*
Function name: OUTPUT USERNAME:PASSWORD AS SHA1 crypt
Description: obious.
- /
function sha_password($user,$pass){
$user = strtoupper($user);
$pass = strtoupper($pass);
return SHA1($user.':'.$pass);
}
if (isset($_POST['registration']) && $_POST['registration']) {
/*Connect and Select*/
$realmd_bc_new_connect = mysql_connect($realmd['db_host'],$realmd['db_username'],$realmd['db_password']);
$selectdb = mysql_select_db($realmd['db_name'],$realmd_bc_new_connect);
if (!$realmd_bc_new_connect || !$selectdb) {
$information = array('status' => 'nok', 'message' => 'Could NOT connect to db, please check the config part of the file!');
}
/*Checks*/
$username = mysql_real_escape_string($_POST['username']);
$password = sha_password($username,$_POST['password']);
$qry_check_username = mysql_query("SELECT username FROM `account` WHERE username='$username'");
if (check_for_symbols($_POST['password']) == TRUE || check_for_symbols($username) == TRUE || mysql_num_rows($qry_check_username) != 0){
$information = array('status' => 'nok', 'message' => 'Erreur lors de la création de votre compte : utilisateur déjà existant ou username/password invalide');
}
else{
mysql_query("INSERT INTO account (username,sha_pass_hash) VALUES ('$username','$password')");// Insert into database.
$information = array('status' => 'ok', 'message' => 'Votre compte a été créé');;
}
}
?>
---------------------------------------------------------------
sauf que maintenant j'ai cette erreur :
Parse error: syntax error, unexpected 'function' (T_FUNCTION) in D:\xampp\htdocs\index.php on line 389
---------------------------------------------------------------
Tu sais d'où viens le soucis ? il y a le formulaire + le code pour la base de donnée la je me trompe ?
?>
<h2><span>Formulaire de création de compte</span></h2>
<?php if (isset($information) && 'nok' === $information['status']) { echo '<span style="color:red;">'.$information['message'].'</span>'; } ?>
<div class="clr"></div>
<p>En créant un compte, vous acceptez les conditions générales d'utilisation ci-dessus.</p>
<form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="POST">
<div>
<p><strong>Identifiant </strong>
<input type="text" name="username">
</p>
<p><strong>Mot de passe</strong>
<input type="password" name="password">
</p>
<p>
<input name="registration" type="submit" value="S'enregistrer" />
</p>
</div>
</form>
<?php } ?>
Voilà le code du formulaire, j'ai essayé de l'insérer mais j'ai l'erreur :
Parse error: syntax error, unexpected '}' in D:\xampp\htdocs\index.php on line 392
Désolé
<h2><span>Formulaire de création de compte</span></h2>
<?php if (isset($information) && 'nok' === $information['status']) { echo '<span style="color:red;">'.$information['message'].'</span>'; } ?>
<div class="clr"></div>
<p>En créant un compte, vous acceptez les conditions générales d'utilisation ci-dessus.</p>
<form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="POST">
<div>
<p><strong>Identifiant </strong>
<input type="text" name="username">
</p>
<p><strong>Mot de passe</strong>
<input type="password" name="password">
</p>
<p>
<input name="registration" type="submit" value="S'enregistrer" />
</p>
</div>
</form>
<?php } ?>
Voilà le code du formulaire, j'ai essayé de l'insérer mais j'ai l'erreur :
Parse error: syntax error, unexpected '}' in D:\xampp\htdocs\index.php on line 392
Désolé
, j'ai essayé de l'insérer mais j'ai l'erreur ...
Impossible de détecter l'erreur si tu modifies le code en parallèle.
Surtout que je n'ai aucune idée d'où tu as fait ton insertion.
Et que je ne sais pas où se trouve la ligne 392.
Mais tu n'as qu'à vérifier les correspondances entre les { et les }, tu devrais bien voir où est le problème. Si tu utilises un éditeur de texte correct, il doit avoir une fonction pour t'aider à trouver ces correspondances;
Impossible de détecter l'erreur si tu modifies le code en parallèle.
Surtout que je n'ai aucune idée d'où tu as fait ton insertion.
Et que je ne sais pas où se trouve la ligne 392.
Mais tu n'as qu'à vérifier les correspondances entre les { et les }, tu devrais bien voir où est le problème. Si tu utilises un éditeur de texte correct, il doit avoir une fonction pour t'aider à trouver ces correspondances;