Vérification de syntaxe

Résolu/Fermé
barnabe0057 Messages postés 14454 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 30 novembre 2024 - Modifié le 23 août 2021 à 23:11
yg_be Messages postés 23383 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 9 décembre 2024 - 24 août 2021 à 15:51
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 23383 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 9 décembre 2024 Ambassadeur 1 556
24 août 2021 à 11:02
bonjour,
pourquoi ne testes-tu pas ton code afin d'en vérifier la syntaxe?
0
barnabe0057 Messages postés 14454 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 30 novembre 2024 4 918
24 août 2021 à 12:05
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 23383 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 9 décembre 2024 1 556 > barnabe0057 Messages postés 14454 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 30 novembre 2024
24 août 2021 à 12:11
ne comprends-tu pas le message d'erreur?
0
barnabe0057 Messages postés 14454 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 30 novembre 2024 4 918 > yg_be Messages postés 23383 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 9 décembre 2024
24 août 2021 à 12:41
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 23383 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 9 décembre 2024 1 556 > barnabe0057 Messages postés 14454 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 30 novembre 2024
24 août 2021 à 12:49
tu pourrais probablement également correctement préparer la requête, en y insérant les données variables ensuite.
0
barnabe0057 Messages postés 14454 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 30 novembre 2024 4 918 > yg_be Messages postés 23383 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 9 décembre 2024
24 août 2021 à 14:02
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
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 23383 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 9 décembre 2024 1 556
24 août 2021 à 12:15
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 14454 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 30 novembre 2024 4 918 > yg_be Messages postés 23383 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 9 décembre 2024
24 août 2021 à 12:40
Oui à chaque création d'identifiant il y aura préalablement une vérification pour éviter les doublons.
0
yg_be Messages postés 23383 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 9 décembre 2024 1 556 > barnabe0057 Messages postés 14454 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 30 novembre 2024
24 août 2021 à 12:48
le plus simple, alors, n'est-il pas de chercher le maximum des identifiants existants, et d'y ajouter 1?
0