Login PHP

pistopisto Messages postés 6 Statut Membre -  
pistopisto Messages postés 6 Statut Membre -
Bonjour Mesdames et Messieurs Web masters.
J'ai l'honneur de venir auprès de votre haute bienveillance, vous soumettre mon inquiétude en login PHP. En effet, je code en php, j'ai essayé avec peu de connaissances que j'ai en programmation PHP pour permettre aux utilisateurs de se connecter à l'espace "personnel" mais j'y arrive pas. Sql m'envoie le message d'erreur suivant: " Fatal error: Call to a member function prepare() on a non-object in C:\wamp\www\zoom\Preview\admin\checklogin.php on line 17
Call Stack
. "

S'il vous plait, aidez-moi à résoudre ce problème.
Je joints mes codes.
1) checklogin.php

<?php
ob_start();
include("config.php");
session_start();

$myusername=$_POST['myusername'];
$mypassword=$_POST['mypassword'];

if(isset($_POST['myusername']) AND !empty($_POST['myusername']) AND !preg_match("#^[-. ]+$#", $_POST['myusername'])) {

$myusername = stripslashes($myusername);
$mypassword = stripslashes($mypassword);
$myusername = mysql_real_escape_string($myusername);
$mypassword = mysql_real_escape_string($mypassword);

$encrypted_mypassword=md5($mypassword);
$query = $db_name->prepare("SELECT * FROM $tbl_name WHERE username=:$myusername and password=:$encrypted_mypassword");
$query->execute(array(
'myusername' => $myusername
));
$count=$query->rowCount();

// If result matched $myusername and $mypassword, table row must be 1 row

if($count == 1) {
session_register("myusername");
session_register("mypassword");
$_SESSION['login_user'] = $myusername;

header("location: ../www.espace_perso.php");
}else {
$error = "Your Login Name or Password is invalid";
}
}
$query->closeCursor();
ob_end_flush();
?>


2) config.php

<?php
$host="localhost";
$username="root";
$password="root";
$db_name="database_name";
$tbl_name="members";

mysql_connect("$host", "$username", "$password")or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");
?>


3) session.php

<?php
include('config.php');
session_start();

$user_check = $_SESSION['login_user'];

$ses_sql = mysql_query($db,"select username from $tbl_name where username = '$user_check' ");

$row = mysql_fetch_array($ses_sql,MYSQL_ASSOC);

$login_session = $row['username'];

if(!isset($_SESSION['login_user'])){
header("location:../login.php");
}
?>


4)logout.php

<?php
session_start();

if(session_destroy()) {
header("Location: ../login.php");
}
?>

4 réponses

  1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
     
    Bonjour
    tu as mélangé du mysql .... et du pdo !
    Modifie ton fichier config.php
    0
    1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
       
      Et aussi ton fichier session.php qui utilise l'ancienne extension mysql.et qu'il faut passer en PDO
      0
      1. pistopisto Messages postés 6 Statut Membre > jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Bonjour Jordan45,

        Merci de vos remarques
        J'ai essayé de rectifier mon code. Mon script d'inscription fonctionne bien alors que quand je veux me connecter, on m'affiche le message d'erreur suivant : " Array().

        S'il vous plait corrigez-moi ce code. J'envoie tous mes codes.

        inscription.php:


        <?php
        ob_start();
        try
        {
        // connexion au serveur
        include('config.php');

        $username= NULL;
        $usercode= NULL;

        $username = stripslashes(htmlspecialchars($_POST['login']));
        $usercode = stripslashes(htmlspecialchars($_POST['pass']));

        // on teste si le visiteur a soumis le formulaire
        if (isset($_POST['inscription']) && $_POST['inscription'] == 'Inscription') {
        // on teste l'existence de nos variables. On teste également si elles ne sont pas vides
        if ((isset($_POST['login']) && !empty($_POST['login'])) && (isset($_POST['pass']) && !empty($_POST['pass'])) && (isset($_POST['pass_confirm']) && !empty($_POST['pass_confirm']))) {
        // on teste les deux mots de passe
        if ($_POST['pass'] != $_POST['pass_confirm']) {
        $erreur = 'Les 2 mots de passe ne sont pas identiques.';
        }
        else {
        // on recherche si ce login est déjà utilisé par un autre membre
        $query = $bdd->prepare("SELECT * FROM members WHERE login=:val1 and pass=:val2");
        $donnees = array('val1' => $username, 'val2' => $usercode);
        $query->execute($donnees);
        $array_result = $query->fetchAll();

        $nb = count($array_result);
        print_r($array_result);
        if ($nb== 0) {

        $societe = $_POST['society'];
        $email = $_POST['email'];
        $pays = $_POST['country'];
        $adresse_de_societe = $_POST['adresse'];
        $ville_d_activite = $_POST['ville'];
        $code_postal = $_POST['postcode'];
        $secteur_d_activite = $_POST['sectory'];
        $descriptions = $_POST['descriptif'];
        $telephone = $_POST['phone'];
        $faxe = $_POST['fax'];
        $login = $_POST['login'];
        $pass = $_POST['pass'];
        $pass_confirm = $_POST['pass_confirm'];
        $adresse_url = $_POST['siteweb'];
        $nom = $_POST['user_name'];

        $req = $bdd->prepare('INSERT INTO members(societe,email,pays,adresse_de_societe,ville_d_activite,code_postal,secteur_d_activite,descriptions,telephone,faxe,login,pass,pass_confirm,adresse_url,nom ) VALUES(:val1,:val2, :val3, :val4, :val5,:val6, :val7,:val8, :val9, :val10, :val11, :val12, :val13, :val14, :val15)');
        $donnees = array(
        ':val1' => $societe,
        'val2' => $email,
        'val3' => $pays,
        'val4' => $adresse_de_societe,
        'val5' => $ville_d_activite,
        'val6' => $code_postal,
        'val7' => $secteur_d_activite,
        'val8' => $descriptions,
        'val9' => $telephone,
        'val10' => $faxe,
        'val11' => $login,
        'val12' => $pass,
        'val13' => $pass_confirm,
        'val14' => $adresse_url,
        'val15' => $nom
        );

        include('session.php');
        header('Location: ../www.espace_perso.php');
        exit();
        }
        else {
        $erreur = 'Un membre possède déjà ce login.';
        }
        }
        }
        else {
        $erreur = 'Au moins un des champs est vide.';
        }
        }

        }
        catch(Exception $e)
        {
        die('Erreur : '.$e->getMessage());
        }
        ?>



        session.php:

        <?php
        include('config.php');
        session_start();
        $_SESSION['login'] = $_POST['login'];
        $_SESSION['societe'] = $_POST['society'];
        $_SESSION['email'] = $_POST['email'];
        $_SESSION['pays'] = $_POST['country'];
        $_SESSION['adresse_de_societe'] = $_POST['adresse'];
        $_SESSION['ville_d_activite'] = $_POST['ville'];
        $_SESSION['code_postal'] = $_POST['postcode'];
        $_SESSION['secteur_d_activite'] = $_POST['sectory'];
        $_SESSION['descriptions'] = $_POST['descriptif'];
        $_SESSION['telephone'] = $_POST['phone'];
        $_SESSION['faxe'] = $_POST['fax'];
        $_SESSION['pass'] = $_POST['pass'];
        $_SESSION['pass_confirm'] = $_POST['pass_confirm'];
        $_SESSION['adresse_url'] = $_POST['siteweb'];
        $_SESSION['nom'] = $_POST['user_name'];


        checklogin.php:

        <?php
        ob_start();
        try
        {
        // connexion au serveur
        include('config.php');

        $username= NULL;
        $usercode= NULL;

        $username = stripslashes(htmlspecialchars($_POST['login']));
        $usercode = stripslashes(htmlspecialchars($_POST['pass']));

        // on teste si le visiteur a soumis le formulaire de connexion
        if (isset($_POST['connexion']) && $_POST['connexion'] == 'Connexion') {
        if ((isset($_POST['login']) && !empty($_POST['login'])) && (isset($_POST['pass']) && !empty($_POST['pass']))) {

        // on teste si une entrée de la base contient ce couple login / pass
        $query = $bdd->prepare("SELECT * FROM members WHERE login=:val1 and pass=:val2");
        $donnees = array('val1' => $username, 'val2' => $usercode);
        $query->execute($donnees);
        $array_result = $query->fetchAll();

        // si on obtient une réponse, alors l'utilisateur est un membre
        $nb = count($array_result);
        print_r($array_result);
        if ($nb== 1) {
        session_start();
        $_SESSION['login'] = $_POST['login'];
        header('Location: ../www.espace_perso.php');
        exit();
        }
        // si on ne trouve aucune réponse, le visiteur s'est trompé soit dans son login, soit dans son mot de passe
        elseif ($nb== 0) {
        $erreur = 'Compte non reconnu.';
        }
        // sinon, alors la, il y a un gros problème :)
        else {
        $erreur = 'Problème dans la base de données : plusieurs membres ont les mêmes identifiants de connexion.';
        }
        }
        else {
        $erreur = 'Au moins un des champs est vide.';
        }
        }

        }
        catch(Exception $e)
        {
        die('Erreur : '.$e->getMessage());
        }
        ?>


        espace-perso.php:

        <?php
        print_r($_SESSION);
        error_reporting(E_ALL);
        session_start();
        if (!isset($_SESSION['login'])) {
        header ('Location: ../index.php');
        exit();
        }
        ?>
        <!DOCTYPE html><!-- HTML5 -->
        <html prefix="og: http://ogp.me/ns#" lang="fr-FR" dir="ltr">
        <head>
        <title>www.espace_perso.php </title>
        <!-- code -->
        </head>
        <body>

        <div id="">
        <div id="Header_load">
        <h1 class="imHidden">www.espace_perso.php </h1>
        <!-- le reste de mes codes s'en suivent... -->


        main_login.php:

        <!DOCTYPE html><!-- HTML5 -->
        <?php
        session_start();
        print_r($_SESSION);
        error_reporting(E_ALL);
        ?>
        <html prefix="og: http://ogp.me/ns#" lang="fr-FR" dir="ltr">
        <head>
        <title>main_login.php </title>
        <!-- le reste des codes... -->
        0
      2. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832 > pistopisto Messages postés 6 Statut Membre
         
        Dans ta page espace-perso.php: tu fais un
        print_r($_SESSION);
        

        Alors que tu n'y a pas démarré les sessions.....

        N'oublie pas non plus de placer l'instruction
        error_reporting(E_ALL);
        AVANT TOUT LE RESTE du code....
        0
      3. pistopisto Messages postés 6 Statut Membre > jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Vous êtes génial !
        Je mets en pratique vos conseils et je vous fais part du résultat. Cette fois ci, j'espère que ça va marcher.

        Vraiment grand merci.
        0
  2. pistopisto Messages postés 6 Statut Membre
     
    Bonjour Mesdames et Messieurs,

    Merci beaucoup pour vos remarques et conseils.
    J'ai compris vos conseils et j'ai essayé de corriger mes codes en php, mais j'y arrive pas. J'ai dû donc fait des recherches sur le net et j'ai trouvé un exemplaire de login en "Mysql" que j'ai essayé d'adapter en php, mais on m'envoie le message d'erreur qui ressemble à ceci: Undefine ($donnees) on line 26 and 33.

    S'il vous plait, corrigez-moi ce code. j'utilise php5.

    Code trouvé en ligne:

    <?php
    // on teste si le visiteur a soumis le formulaire de connexion
    if (isset($_POST['connexion']) && $_POST['connexion'] == 'Connexion') {
    if ((isset($_POST['login']) && !empty($_POST['login'])) && (isset($_POST['pass']) && !empty($_POST['pass']))) {

    $base = mysql_connect ('localhost', 'User', 'password');
    mysql_select_db ('base_name', $base);

    // on teste si une entrée de la base contient ce couple login / pass
    $sql = 'SELECT count(*) FROM membre WHERE login="'.mysql_escape_string($_POST['login']).'" AND pass_md5="'.mysql_escape_string(md5($_POST['pass'])).'"';
    $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
    $data = mysql_fetch_array($req);

    mysql_free_result($req);
    mysql_close();

    // si on obtient une réponse, alors l'utilisateur est un membre
    if ($data[0] == 1) {
    session_start();
    $_SESSION['login'] = $_POST['login'];
    header('Location: membre.php');
    exit();
    }
    // si on ne trouve aucune réponse, le visiteur s'est trompé soit dans son login, soit dans son mot de passe
    elseif ($data[0] == 0) {
    $erreur = 'Compte non reconnu.';
    }
    // sinon, alors la, il y a un gros problème :)
    else {
    $erreur = 'Probème dans la base de données : plusieurs membres ont les mêmes identifiants de connexion.';
    }
    }
    else {
    $erreur = 'Au moins un des champs est vide.';
    }
    }
    ?>


    Code adapté en php:

    checklogin.php:
    <?php
    ob_start();
    try
    {
     // connexion au serveur
     include('config.php');
     
     $username= NULL;
     $usercode= NULL;
     
     $username = stripslashes(htmlspecialchars($_POST['login']));
     $usercode = stripslashes(htmlspecialchars($_POST['pass']));
     
    // on teste si le visiteur a soumis le formulaire de connexion
    if (isset($_POST['connexion']) && $_POST['connexion'] == 'Connexion') {
     if ((isset($_POST['login']) && !empty($_POST['login'])) && (isset($_POST['pass']) && !empty($_POST['pass']))) {
    
     // on teste si une entrée de la base contient ce couple login / pass
    $query = $bdd->prepare("SELECT * FROM members WHERE login=:val1 and pass=:val2");  
    $query->execute(array(
     'val1' => $username,
     'val2' => $usercode
    )); 
    $donnees = $query->fetch();
     // si on obtient une réponse, alors l'utilisateur est un membre
     if ($donnees[0] == 1) {
      session_start();
      $_SESSION['login'] = $_POST['login'];
      header('Location: ../www.espace_perso.php');
      exit();
     }
     // si on ne trouve aucune réponse, le visiteur s'est trompé soit dans son login, soit dans son mot de passe
     elseif ($donnees[0] == 0) {
      $erreur = 'Compte non reconnu.';
     }
     // sinon, alors la, il y a un gros problème :)
     else {
      $erreur = 'Problème dans la base de données : plusieurs membres ont les mêmes identifiants de connexion.';
     }
     }
     else {
     $erreur = 'Au moins un des champs est vide.';
     }
    }
    
    }
    catch(Exception $e)
    {
    die('Erreur : '.$e->getMessage());
    }
    ?>
    

    config.php:
    <?php
    $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    $bdd = new PDO(
    'mysql:
    host=localhost;
    dbname=base_name', 
    'User', 
    'password',
    $pdo_options);
    

    </code>
    0
  3. Pitet Messages postés 2845 Statut Membre 530
     
    Salut,

    Concernant la variable $donnees, tu affectes dans celle-ci le retour de la fonction fetch() pour récupérer les résultats de la requête puis tu accès juste après au premier élément du résultat ($donnees[0]) pour faire ton contrôle sur l'utilisateur.

    Si la requête sql ne retourne aucun résultat, la variable $donnees sera vide et l'élément $donnees[0] ne sera donc pas défini, d'où le message d'erreur que tu rencontres.
    Il faut donc simplement vérifier que cette données est définie avant de l'utiliser, par exemple :
    $donnees = $query->fetch();
    // si on obtient une réponse, alors l'utilisateur est un membre
    if (isset($donnees[0]) && $donnees[0] == 1) {
    


    Idem ligne 36.

    Bonne journée,
    0