Vérification de syntaxe

Résolu
barnabe0057 Messages postés 14455 Date d'inscription   Statut Contributeur Dernière intervention   -  
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

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


2 réponses

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
bonjour,
pourquoi ne testes-tu pas ton code afin d'en vérifier la syntaxe?
0
barnabe0057 Messages postés 14455 Date d'inscription   Statut Contributeur Dernière intervention   4 925
 
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);

?>
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > barnabe0057 Messages postés 14455 Date d'inscription   Statut Contributeur Dernière intervention  
 
ne comprends-tu pas le message d'erreur?
0
barnabe0057 Messages postés 14455 Date d'inscription   Statut Contributeur Dernière intervention   4 925 > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
J'appelle une méthode non définie, après quelques recherches je pense que je dois utiliser execute() au lieu de exec()
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > barnabe0057 Messages postés 14455 Date d'inscription   Statut Contributeur Dernière intervention  
 
tu pourrais probablement également correctement préparer la requête, en y insérant les données variables ensuite.
0
barnabe0057 Messages postés 14455 Date d'inscription   Statut Contributeur Dernière intervention   4 925 > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
Voilà 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 ?
0
vortex
 
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 ^^
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
Les scripts générant des identifiants uniques peuvent tout autant aboutir à des doublons.
Le plus simple, c'est d'utiliser la table accounts pour garantir l'unicité de l'identifiant.
0
barnabe0057 Messages postés 14455 Date d'inscription   Statut Contributeur Dernière intervention   4 925 > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
Oui à chaque création d'identifiant il y aura préalablement une vérification pour éviter les doublons.
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > barnabe0057 Messages postés 14455 Date d'inscription   Statut Contributeur Dernière intervention  
 
le plus simple, alors, n'est-il pas de chercher le maximum des identifiants existants, et d'y ajouter 1?
0