Vérification de syntaxe
Résolu
Bonjour,
Etant débutant en PHP, je souhaiterais savoir si ma syntaxe est correcte :
Sachant que je voudrais générer un identifiant de 40 caractères de long à partir d'un email et d'un mot de passe concaténés.
Merci d'avance.
“L'intelligence artificielle se définit comme le contraire de la bêtise naturelle.”
Etant débutant en PHP, je souhaiterais savoir si ma syntaxe est correcte :
$account_id = substr(password_hash($email . $password, PASSWORD_BCRYPT), -40);
Sachant que je voudrais générer un identifiant de 40 caractères de long à partir d'un email et d'un mot de passe concaténés.
Merci d'avance.
Configuration: Linux / Firefox 91.0
“L'intelligence artificielle se définit comme le contraire de la bêtise naturelle.”
2 réponses
-
Contributeurbonjour,
pourquoi ne testes-tu pas ton code afin d'en vérifier la syntaxe?-
Parce que je n'étais pas encore en mesure de le tester, je n'avais pas encore créé et activé le vhost dans nginx, je n'avais pas encore créé le sous-domaine correspondant dans mon DNS, et surtout parce que à part mettre des echo un peu partout je ne maîtrises pas toutes les techniques pour tester mon code.
Bref, maintenant la ligne en question fonctionne, par contre j'obtiens ce message d'erreur :<b>Fatal error</b>: Uncaught Error: Call to undefined method PDOStatement::exec() in /var/www/api/index.php:96 Stack trace: #0 {main} thrown in <b>/var/www/api/index.php</b> on line <b>96</b><br />
Voilà mon fichier index.php :<?php error_reporting(E_ALL); ini_set('display_errors', TRUE); ini_set('display_startup_errors', TRUE); date_default_timezone_set('Europe/Paris'); function random_1($car) { $string = ""; $chaine = "abcdefghijklmnpqrstuvwxyABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; srand((double)microtime()*1000000); for($i=0; $i<$car; $i++) { $string .= $chaine[rand()%strlen($chaine)]; } return $string; } // // on traite la variable email // $email = $_POST['email']; echo $email; if(empty($email)) { header("Location: index.php"); exit; } if(strlen($email) < 6 OR strlen($email) > 60) { header("Location: index.php"); exit; } // // on traite la variable password // $password = $_POST['password']; echo $password; if(empty($password)) { header("Location: index.php"); exit; } if(strlen($password) < 8 OR strlen($password) > 64) { header("Location: index.php"); exit; } $account_id = substr(password_hash($email . $password, PASSWORD_BCRYPT), -40); $hash_pass = password_hash($password, PASSWORD_BCRYPT); echo $account_id; echo $hash_pass; // // on traite la variable first_name // $first_name = $_POST['first_name']; if(empty($first_name) OR strlen($first_name) > 30); { $first_name = NULL; } // // on traite la variable last_name // $last_name = $_POST['last_name']; if(empty($last_name) OR strlen($last_name) > 30); { $last_name = NULL; } // // on génère une clé pour l'api // $api_id = random_1(40); echo $api_id; // // on récupère la date du jour // $creation_date = date('Ymd'); // // on se connecte à la base de données // require_once 'sqlconnect.php'; $sql = 'INSERT INTO accounts VALUES ($first_name, $last_name, $email, $hash_pass, $account_id, $creation_date, 1, $api_id)'; $prepare = $bdd ->prepare($sql); $res = $prepare ->exec($sql); ?> -
Contributeur@barnabe0057ne comprends-tu pas le message d'erreur?
-
@yg_beJ'appelle une méthode non définie, après quelques recherches je pense que je dois utiliser execute() au lieu de exec()
-
Contributeur@barnabe0057tu pourrais probablement également correctement préparer la requête, en y insérant les données variables ensuite.
-
@yg_beVoilà c'est fait, la requête préparée fonctionne, les données sont bien insérées.
Par contre je me rends compte d'un problème : pour un même mot de passe, chaque requête génère un hash différent du précédent, j'imagine que c'est à cause du sel qui est généré automatiquement par password_hash, donc comment comparer pour vérifier la validité du mot de passe ? Je suis obligé de passer par password_verify ?
-
-
Le truc, c'est que la syntaxe est correcte, mais qui dit identifiant de compte dit identifiant unique, certes il est très peu probable qu'un doublon arrive sur 40 caractères, mais statistiquement ce n'est pas exclus.
De toute façon password_hash, comme son nom l'indique est réservé à un usage précis.
Des scripts pour générer un identifiant unique en php, doit y en avoir des pelles sur internet ^^-
-
@yg_beOui à chaque création d'identifiant il y aura préalablement une vérification pour éviter les doublons.
-
Contributeur@barnabe0057le plus simple, alors, n'est-il pas de chercher le maximum des identifiants existants, et d'y ajouter 1?
-