Bonjour, a chaque fois que j'upload mon site sur mon ftp mon site m'affiche une erreur 500 alors que sur wamp sa marche très bien, j'ai transphéré le sql de ma bdd mais rien ... ps: je n'oublie biensur pas de mofif la connection a la bdd, Et puis aussi, quand je me register sa marche (en localhost) je recois pas le mail et puis j'ai une erreur sur la page login dès que je me login !!
et puis voila mes erreur quand j'essaye de me connecter (le compte est bien créer sur phpmyadmin)

Mon db.php

<?php
try
{
    $bdd = new PDO('mysql:host=localhost;dbname=bykertix_site;charset=utf8', 'root', '');
    array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);
}
catch(Exception $e)
{
    die('Erreur : '.$e->getMessage());
}

?>

Mon register.php

<?php
require_once 'inc/fonctions.php';
session_start();
if(!empty($_POST)){
    require_once 'inc/db.php';

    $errors = array();

    if(empty($_POST['username']) || !preg_match('/^[a-zA-Z0-9_]+$/', $_POST['username'])){
        $errors['username'] = "Votre pseudo n'est pas valide";
    } else {
        $req = $bdd->prepare('SELECT id FROM users WHERE username = ?');
        $req->execute([$_POST['username']]);
        $user = $req->fetch();
        if($user){
            $errors['username'] = 'Ce pseudo est déja utilisé pour un autre compte';
        }

     }

    if(empty($_POST['email']) || !filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)){
        $errors['email'] = "Votre email n'est pas valide";
     }else {
        $req = $bdd->prepare('SELECT id FROM users WHERE email = ?');
        $req->execute([$_POST['email']]);
        $user = $req->fetch();
        if($user){
            $errors['email'] = 'Cet email est déja utilisé';
        }
    }

    if(empty($_POST['password']) || $_POST['password'] !=$_POST['password_confirm']){
        $errors['password'] = "Votre mot de passe ne correspond pas";
    }

    if(empty($errors)){

        $req = $bdd->prepare("INSERT INTO users SET username = ?, password = ?, email = ?,confirmation_token = ?");
        $password = password_hash($_POST['password'], PASSWORD_BCRYPT);
        $token = str_random(60);
        $req->execute([$_POST['username'], $password, $_POST['email'], $token]);
        $user_id = $bdd->lastInsertId();
        mail($_POST['email'], 'Confirmation de votre compte', "Afin de valider votre compte merci de cliquer sur ce lien\n\nhttp://localhost/site/confirm.php?id=$user_id&token=$token");
        $_SESSION['flash']['success'] = 'Un email de confirmation vous a été envoyé pour valider votre compte';
        header('Location: login.php');
        exit();

    }
}

?>

<?php require 'inc/header.php'; ?>

<h1>S'inscrire</h1>

<?php if(!empty($errors)): ?>
<div class="alert alert-danger">
    <p>Vous n'avez pas rempli le formulaire correctement</p>
    <ul>
        <?php foreach($errors as $error): ?>
            <li><?= $error; ?></li>
        <?php endforeach; ?>
    </ul>
</div>
<?php endif; ?>

<form action="" method="POST">

    <div class="form-group">
        <label for="">Pseudo</label>
        <input type="text" name="username" class="form-control" required/>
    </div>

    <div class="form-group">
        <label for="">Email</label>
        <input type="email" name="email" class="form-control" required/>
    </div>

    <div class="form-group">
        <label for="">Mot de passe</label>
        <input type="password" name="password" class="form-control" required/>
    </div>

    <div class="form-group">
        <label for="">Confirmez votre mot de passe</label>
        <input type="password" name="password_confirm" class="form-control" required/>
    </div>

    <button type="submit" class="btn btn-primary">M'inscrire</button>
</form>

<?php require 'inc/footer.php'  ?>

Mon login.php

<?php
if(!empty($_POST) && !empty($_POST['username']) && !empty($_POST['password'])){
    require_once 'inc/db.php';
    require_once 'inc/fonctions.php';
    $req = $bdd->prepare('SELECT * FROM users WHERE (username = :username OR email = :username) AND confirmed_at IS NOT NULL');
    $req->execute(['username' => $_POST['username']]);
    $user = $req->fetch();
    if(password_verify($_POST['password'], $user->password)){
        $_SESSION['auth'] = $user;
        $_SESSION['flash']['success'] = 'Vous êtes maintenant connecté';
        header('Location: account.php');
        exit();
    }else{
        $_SESSION['flash']['danger'] = 'Identifiant ou mot de passe incorrecte';
    }
}
?>

<?php require 'inc/fonctions.php'; ?>
<?php require 'inc/header.php'; ?>

<h1>Se connecter</h1>

<form action="" method="POST">

    <div class="form-group">
        <label for="">Pseudo ou email</label>
        <input type="text" name="username" class="form-control" required/>
    </div>

    <div class="form-group">
        <label for="">Mot de passe</label>
        <input type="password" name="password" class="form-control" required/>
    </div>

    <button type="submit" class="btn btn-primary">Se connecter</button>

</form>

<?php require 'inc/footer.php'; ?>

Mon fonctions.php

<?php
function debug($variable){
    echo '<pre>' . print_r($variable, true) . '</pre>';
}

function str_random($length){
    $alphabet = "0123456789azertyuiopqsdfghjklmwxcvbnAZERTYUIOPQSDFGHJKLMWXCVBN";
    return substr(str_shuffle(str_repeat($alphabet, $length)), 0, $length);
}

function logged_only(){
    if(session_status() == PHP_SESSION_NONE){
        session_start();

    }
    if(!isset($_SESSION['auth'])){
        $_SESSION['flash']['danger'] = "Vous n'avez pas le droit d'accéder à cette page";
        header('location: login.php');
        exit();

    }
}

Confirm.php

<?php

$user_id = $_GET['id'];
$token = $_GET['token'];
require 'inc/db.php';
$req = $bdd->prepare('SELECT * FROM users WHERE id = ?');
$req->execute([$user_id]);
$user = $req->fetch();
session_start();

if($user && $user->confirmation_token == $token ){
    $bdd->prepare('UPDATE users SET confirmation_token = NULL, confirmed_at = NOW() WHERE id = ?')->execute([$user_id]);
    $_SESSION['flash']['success'] = 'Votre compte a bien été validé';
    $_SESSION['auth'] = $user;
    header('Location: account.php');
}else{
    $_SESSION['flash']['danger'] = "Ce token n'est plus valide";
    header('Location: login.php');
}

logout.php

<?php
session_start();
unset($_SESSION['auth']);
$_SESSION['flash']['success'] = 'Vous êtes maintenant déconnecté';
header('Location: login.php');

Mon account.php

<?php

require 'inc/fonctions.php';
logged_only();
require 'inc/header.php';
?>

    <h1>Bonjour <?= $_SESSION['auth']->username; ?></h1>

<form action="" method="post">
    <div class="form-group"></div>
        <input class="form-control" type="password" name="password" placeholder="Changer votre mot de passe"/>
    </div>

    <div class="form-group"></div>
        <input class="form-control" type="password" name="password_confirm" placeholder="Confirmation du mot de passe"/>
    </div>
    <button class="btn btn-primary">Changer mon mot de passe</button>

</form>

<?php require 'inc/footer.php'; ?>

Svp, je galère depuis quelque semaines !!! aider moi

6 réponses


Bonsoir.
As-tu fais des des recherches auprès de ton hébergeur ?
Si tu nous informait de ton hébergeur et du type de serveur, nous pourrions peut-être t'aider plus efficacement car si ça se trouve, ce n'est pas dû à tes fichiers PHP, mais par exemple à une syntaxe du fichier .htaccess ou autre.

bykertix
Auteur

Bonsoir,
mon hebergeur est un particulier, "grofido.net", j'ai regarder un ancien site en html sa marche parfait avec un petit bout de php pour le formulaire de contact, mais la sa me le fait que pour sa, je ne sais pas pourquoi.

Les infos:
System Linux zpanel 2.6.32-042stab112.15 #1 SMP Tue Oct 20 17:22:56 MSK 2015 x86_64
Build Date Oct 28 2015 01:25:47
Server API Apache 2.0 Handler
Virtual Directory Support disabled
Configuration File (php.ini) Path /etc/php5/apache2
Loaded Configuration File /etc/php5/apache2/php.ini
Scan this dir for additional .ini files /etc/php5/apache2/conf.d
Additional .ini files parsed /etc/php5/apache2/conf.d/curl.ini, /etc/php5/apache2/conf.d/gd.ini, /etc/php5/apache2/conf.d/imap.ini, /etc/php5/apache2/conf.d/mcrypt.ini, /etc/php5/apache2/conf.d/mysql.ini, /etc/php5/apache2/conf.d/mysqli.ini, /etc/php5/apache2/conf.d/pdo.ini, /etc/php5/apache2/conf.d/pdo_mysql.ini, /etc/php5/apache2/conf.d/suhosin.ini, /etc/php5/apache2/conf.d/xmlrpc.ini, /etc/php5/apache2/conf.d/xsl.ini
PHP API 20090626
PHP Extension 20090626
Zend Extension 220090626
Zend Extension Build API220090626,NTS
PHP Extension Build API20090626,NTS
Debug Build no
Thread Safety disabled
Zend Memory Manager enabled
Zend Multibyte Support disabled
IPv6 Support enabled
Registered PHP Streams https, ftps, compress.zlib, compress.bzip2, php, file, glob, data, http, ftp, phar, zip
Registered Stream Socket Transports tcp, udp, unix, udg, ssl, sslv3, tls
Registered Stream Filters zlib., bzip2., convert.iconv., string.rot13, string.toupper, string.tolower, string.strip_tags, convert., consumed, dechunk, mcrypt., mdecrypt.

et je crois pas que j'ai un .htaccess

Alors, pour commencer, dans ton fichier login.php, tu devrais vérifier si un enregistrement est bien retourné, car tu fais une comparaison pour un champ, mais si aucun enregistrement est retourné il est normal que tu aies une erreur, car étant donné que ta variable $user est nulle tu n'as donc pas d'objet de défini, d'où l'erreur qui t'es retournée pour la partie suivante :

if(password_verify($_POST['password'], $user->password)){

Ensuite, si tu as besoin de ton fichier fonctions.php que le formulaire soit posté ou non, autant que tu le charges une seule fois pour les deux cas, mais si tu veux garder les 2 inclusions, tu devrais faire le require_once que la deuxième fois.
Donc, soit tu inclus le fichier dès le début avant la condition des données postées et tu supprimes la deuxième inclusion ou alors tu fais un require du fichier dans ta condition des données postées et tu fais un require_once après ta condition.
Mais le plus logique est la première proposition.

bykertix
Auteur

pour le login.php je crois que aucun enregistrement est retourné

Il te faut donc modifier :

if(password_verify($_POST['password'], $user->password)){

par par exemple :

if(isset($user) && password_verify($_POST['password'], $user->password)){
bykertix
Auteur

sa me met toujours l'erreur si je remplace sa

if(password_verify($_POST['password'], $user->password)){

par

if(isset($user) && password_verify($_POST['password'], $user->password)){

sa

Et j'ai fait comme tu as dit pour le fichier fonctions, je l'ai mis qu'une fois sa ma déjà enlever une erreur