Salut à tous !
Je rencontre actuellement un problème avec mon code pour modifier des informations personnelle depuis le site internet.
Je vous explique; Je souhaite mettre en place un système permettant aux utilisateurs de pouvoir modifier leurs informations déjà enregistrés à l'inscription ou même de nouvelle informations à rentrer.
Voici mon code :

<?php
require 'functions.php';
logged_only();
if(!empty($_POST)){

    if(empty($_POST['password']) || $_POST['password'] != $_POST['password_confirm']){
        $_SESSION['flash']['danger'] = "Les mots de passes ne correspondent pas.";
    } else{
        $user_id = $_SESSION['auth']->id;
        $password= password_hash($_POST['password'], PASSWORD_BCRYPT);
        require_once 'db.php';
        $pdo->prepare('UPDATE users SET password = ? WHERE id = ?')->execute([$password, $user_id]);
        $_SESSION['flash']['success'] = "Vous avez changer votre mot de passe.";
    }

    if(empty($_POST['username']) || $_POST['username'])
        else{
        $user_id = $_SESSION['auth']->id;
        require_once 'assets/includes/db.php';
        $pdo->prepare('UPDATE users SET username = ? WHERE id = ?')->execute([$user_id]);
        $_SESSION['flash']['success'] = "Vous avez changer de nom d'utilisateur.";
    }
}
require 'header.php';
?>

Je ne vois pas ou son mon ou mes erreurs dans le code.
Si vous pouviez m'aider, ce serrait super sympa !
Je voudrais avoir un code ou je n'est juste a changer les type d'information à modifier par exemple :
le nom d'utilisateur = username
l'adresse email = email
le numéro de téléphone = number1 / number2
En gros seulement modifier le nom de la table a modifier sur l'utilisateur.

Merci énormément au personnes qui pourront me venir en aide.

15 réponses


keulu
Réponse acceptée

if(empty($_POST['username']) || $_POST['username']) {

ca veut dire quoi ?

pour moi ca veux dire

Si ($_post de username est vide OU QUE j'ai qqch dans $_post de username) { alors. ...

donc pour moi, envoyer un username vide mettra a jour ta bdd...
ensuite ...

$pdo->prepare('UPDATE users SET password = ? WHERE id = ?')->execute([$password, $user_id]);
...
$pdo->prepare('UPDATE users SET username = ? WHERE id = ?');

Je te laisse trouver tout seul... (un indice ? une requete préparée doit etre executé...)

le code c'est pas que du copié/collé.

il faut comprendre ce qu'on fait, lire la doc officiel, comprendre a quoi servent certaines fonctions php, lire des fonctions pas encore utilisé mais qui pourrai eventuellement exister etc... avoir des notions d'algorythmie. a quoi servent les conditions ? les boucles ? etc... sinon t'arriveras jamais a rien...

Ceets
Auteur

Sachant que toute les modifications d'informations sont sur la même page.
Donc plusieur commande d'execution du "POST"

Bonjour.
Ton premier problème se situe dans les deux conditions au niveau de l'inclusion du fichier de connexion à la base de données.
Dans la première condition, tu fais un require de db.php et dans le sond un require de assets/includes/db.php.
Le second, est que dans la deuxième condition, il te manque une acolade entre le if et le else.

Ceets
Auteur

Bonjour Lartak !
Merci de ta réponse !
Voilà mon code =

<?php
require 'assets/includes/functions.php';
logged_only();
if(!empty($_POST)){

    if(empty($_POST['password']) || $_POST['password'] != $_POST['password_confirm']){
        $_SESSION['flash']['danger'] = "Les mots de passes ne correspondent pas.";
    } else{
        $user_id = $_SESSION['auth']->id;
        $password= password_hash($_POST['password'], PASSWORD_BCRYPT);
        require_once 'assets/includes/db.php';
        $pdo->prepare('UPDATE users SET password = ? WHERE id = ?')->execute([$password, $user_id]);
        $_SESSION['flash']['success'] = "Vous avez changer votre mot de passe.";
    }

    if(empty($_POST['username']) || $_POST['username'])
        if else{
        $user_id = $_SESSION['auth']->id;
        require_once 'assets/includes/db.php';
        $pdo->prepare('UPDATE users SET username = ? WHERE id = ?')->execute([$user_id]);
        $_SESSION['flash']['success'] = "Vous avez changer de nom d'utilisateur.";
    }
}
require 'assets/includes/header.php';
?>

Cela ne marche toujours pas...

je te conseil cette formation. https://www.grafikart.fr/formations/deboguer-code-php

t'as un if else{ au milieu qui veut rien dire...

Bonsoir, avec un peux de logique, tu devrais voir tes erreurs.
La façon de rentrer l'username ressemble beaucoup à la façon de rentrer le password....

Ceets
Auteur

Keulu : Merci beaucoup; seulement je travail sur serveur et non sur wamp, ou encore xampp, je n'est pas accès au fichier log pour pouvoir voir de quel ligne cela provient, je suis perdu dans mes codes....
Carouge : Je ne comprend pas d'ou vien mon erreur, voilà pourquoi je viens a vous, pour essayer de la trouver.
J'ai trouver une solution pour éviter la page blanche :

<?php
require 'assets/includes/functions.php';
logged_only();
if(!empty($_POST)){

    if(empty($_POST['password']) || $_POST['password'] != $_POST['password_confirm']){
        $_SESSION['flash']['danger'] = "Les mots de passes ne correspondent pas.";
    } else{
        $user_id = $_SESSION['auth']->id;
        $password= password_hash($_POST['password'], PASSWORD_BCRYPT);
        require_once 'assets/includes/db.php';
        $pdo->prepare('UPDATE users SET password = ? WHERE id = ?')->execute([$password, $user_id]);
        $_SESSION['flash']['success'] = "Vous avez changer votre mot de passe.";
    }

    if(empty($_POST['username']) || $_POST['username'])
        $pdo->prepare('UPDATE users SET username = ? WHERE id = ?');
        $_SESSION['flash']['success'] = "Vous avez changer de nom d'utilisateur.";
}
require 'assets/includes/header.php';
?>

Quand je clique sur modifier, là viens une page blanche.
J'aimerais aussi faire une fonction pour que cela ne capte que le champs à modifier, et donc rendre les autres optionnelle, je m'explique, Je souhaite changer mon pseudonyme et non mon mot de passe, etc...
Si je suit le code présent, si je change le pseudonyme, là va m'afficher une erreur comme quoi je n'est pas changer le mot de passe
Merci beaucoup à vous deux

Il faut que tu suives la même méthode que pour le password.

if(empty($_POST['username']) ){ // <= Ne pas oublier les accolades
    $_SESSION['flash']['danger'] .= "<br>Le nom d'utilisateur est vide."; //  .= corresponds à une concaténation avec ce qu'il y avait avant dans   $_SESSION['flash']['danger']        
} else { // Ne pas oublier de faire un else
    $pdo->prepare('UPDATE users SET username = ? WHERE id = ?'); 
     // C'est bien tu prépares ta requête, mais sans faire de "execute", tu n'iras pas plus loin
     $_SESSION['flash']['success'] .= "<br>Vous avez changer de nom d'utilisateur.";
}
Ceets
Auteur

Donc il faut que je fasse un execute->([username)]; ?

nan, il faut que tu corrige ton code... encore...

essaye de mettre ca :

<?php
error_reporting(E_ALL); // va t'afficher tes erreurs (normalement)
require 'assets/includes/functions.php';
logged_only();
if(!empty($_POST)){

    require_once 'assets/includes/db.php'; // tu n'incluais cette lib sql que si le mot de passe etait bon... pas bien

    if(empty($_POST['password']) || $_POST['password'] != $_POST['password_confirm']){
        $_SESSION['flash']['danger'] = "Les mots de passes ne correspondent pas.";
    } else{
        $user_id = $_SESSION['auth']->id;
        $password= password_hash($_POST['password'], PASSWORD_BCRYPT);
        $pdo->prepare('UPDATE users SET password = ? WHERE id = ?')->execute([$password, $user_id]);
        $_SESSION['flash']['success'] = "Vous avez changer votre mot de passe.";
    }

    if(empty($_POST['username']) || $_POST['username']) { // un if sur une ligne peut se passer d'accolade, mais pas sur 2 lignes
        $pdo->prepare('UPDATE users SET username = ? WHERE id = ?');
        $_SESSION['flash']['success'] = "Vous avez changer de nom d'utilisateur.";
     }
}
require 'assets/includes/header.php';
?>
Ceets
Auteur

Keulu :
Merci beaucoup ! Alors là la fonction marche, mais le problème c'est que ca n'apporte pas les modifications dans la base de donnée
Ca m'affiche bien que le nom d'utilisateur à bien été modifiée

Regarde, il manque toujours le execute pour le nom d'utilisateur....
Compare avec celui pour le password et tu devrais y arriver

De plus le dernier $_SESSION['flash']['success'] écrase le précédent.

Ceets
Auteur

Carouge :
Merci beaucoup pour ton implication dans mon problème !
Le problème quand je met ce code :

<?php
error_reporting(E_ALL); // va t'afficher tes erreurs (normalement)
require 'assets/includes/functions.php';
logged_only();
if(!empty($_POST)){

    require_once 'assets/includes/db.php'; // tu n'incluais cette lib sql que si le mot de passe etait bon... pas bien

    if(empty($_POST['password']) || $_POST['password'] != $_POST['password_confirm']){
        $_SESSION['flash']['danger'] = "Les mots de passes ne correspondent pas.";
    } else{
        $user_id = $_SESSION['auth']->id;
        $password= password_hash($_POST['password'], PASSWORD_BCRYPT);
        $pdo->prepare('UPDATE users SET password = ? WHERE id = ?')->execute([$password, $user_id]);
        $_SESSION['flash']['success'] = "Vous avez changer votre mot de passe.";
    }

    if(empty($_POST['username']) || $_POST['username']) { 
        $username = $_SESSION['auth']->username;
        $pdo->prepare('UPDATE users SET username = ? WHERE id = ?')->execute([$username]);
        $_SESSION['flash']['success'] = "Vous avez changer de nom d'utilisateur.";
     }
}
require 'assets/includes/header.php';
?>

Cela ne fonctionne pas... J'avoue ne pas y comprendre grand chose dans tous ça...

Ceets
Auteur

Avec tout vos indices et toute votre aide j'ai trouver par moi même ! Je suis fier de moi ahah !!

<?php
require 'assets/includes/functions.php';
logged_only();
if(!empty($_POST)){

    require_once 'assets/includes/db.php';

    if(empty($_POST['password']) || $_POST['password'] != $_POST['password_confirm']){
        $_SESSION['flash']['danger'] = "Les mots de passes ne correspondent pas.";
    } else{
        $user_id = $_SESSION['auth']->id;
        $password= password_hash($_POST['password'], PASSWORD_BCRYPT);
        $pdo->prepare('UPDATE users SET password = ? WHERE id = ?')->execute([$password, $user_id]);
        $_SESSION['flash']['success'] = "Vous avez changer votre mot de passe.";
    }

    if(empty($_POST['username']) || $_POST['username']) {
        $user_id = $_SESSION['auth']->id;
        $username = $_POST['username'];
        $pdo->prepare('UPDATE users SET username = ? WHERE id = ?')->execute([$username, $user_id]);
        $_SESSION['flash']['success'] = "Vous avez changer de nom d'utilisateur.";
     }
}
require 'assets/includes/header.php';
?>

Vous avez raison, je dois prendre le temps de lire toute la doc officiel, mais il y à tellement d'éléments, c'est compliquer de s'y mettre vraiment !
Merci beaucoup de votre aide, une dernière petite chose, ou je ne serrais vraiment pas trouver...
Comment puis-je faire pour actualisser les données lors de la connexion ?
Car dans mon champs html j'y est ajouter du php en donnant pour indication :
Votre pseudo actuel est : USERNAME
Je change de pseudonyme, sa l'applique dans la db, mais pas dans le champs "Votre pseudo est..."
Je suis obligé de me déconnecter pour actualisser les informations sur le site... Merci beaucoup pour toute votre aide !

ben très certainement qu'il faut que tu mette a jour ta session suite a un changement de username.

Quand un utilisateur se log, il se passe quoi ? tu doit certainement avoir un truc du genre
$_SESSION['auth'] = $logged_user (ou un truc du genre)

ben la pareil...

if(empty($_POST['username']) || $_POST['username']) {
        $user_id = $_SESSION['auth']->id;
        $username = $_POST['username'];
        $pdo->prepare('UPDATE users SET username = ? WHERE id = ?')->execute([$username, $user_id]);
        $_SESSION['flash']['success'] = "Vous avez changer de nom d'utilisateur.";
        $_SESSION['auth']->username = $_POST['username'];
     }

Attention, je te rapelle que ta condition d'edition du nom est totallement foireux !

if(empty($_POST['username']) reviens a dire "si j'ai rien"... tu va mettre a jour ton utilisateur avec rien ? t'es sur que c'est ce que tu veux ?