Bonjour,

Je suis buté à un problème depuis cette apres-midi, j'essai de faire en sorte que les administrateurs du site puisse se connectés via une page admin et un compte (déjà enregistré). Le script sert à comparer les logs tapés et les logs de la BDD.
Voici donc ce que j'ai commencé :

<?php 

    $dsn = 'mysql:dbname=mysql;host=localhost';
    $user = 'masso';
    $pass = '0000'; 

    try{

        $bdd = new PDO($dsn, $user, $pass);

    }catch(PDOException $e) {

        echo "Connection échouée : ".$e->getMessage();

    }

    $login = htmlspecialchars($_POST['login']);
    $password = htmlspecialchars($_POST['password']);
    $verif_login = $bdd->query("SELECT COUNT(*) FROM user WHERE User= " + $login);

    if($verif_login == 0){

        header('location:../index.php');

    }else{

        $result_login = $bdd->query('SELECT Password FROM user WHERE User = '+ $login +' LIMIT 1');
        $donnees = $result_login->fetch();

        if(!$password == $donnees['password']){

            echo "Pas de bol";

        }else{

            echo "ENFIN !!!!!";

        }

        $result_login->closeCursor();

    }

 ?>

J'ai constater que le fonction COUNT() de la requete ne renvoi rien alors qu'elle devrait non ? (je precise quand même que les coordonnées de la base de donnée sont correctes).
Quand je remplace le premier header par un print c'est la page blanche.
j'ai essayé plusieurs fonction de PDO et PDOStatement, il n'y en a qu'une qui m'a retourné un résultat mais erroné..

Si vous avez des idées je suis preneur car personnellement je plante ^^.

21 réponses


Carouge10
Réponse acceptée

Ah oui, au tant pour moi.
query renvoie des données qu'il faut "fetcher" avec un $data = $verif_login->fetch();
et c'est $data qu'il faudra exploiter

Carouge10
Réponse acceptée

oui, si vous regarder la doc de fetch ou fetchall, vous pourrez aussi retourner un tableau ou un objet....

Bonsoir.
La concaténation de chaîne se fait par un . et non par +
Le +, c'est en js (^_^)

De plus le "if( !$password == ..." ne va pas

Masso
Auteur

j'ai de toute façon essayé les deux :/
(ps : je crois que dans des requetes SQL l'injection se fait avec '+'.

Mais ce n'est pas ça le soucis il m'aurait retourné une erreur, mais là rien

Pour concaténer des chaînes en php il faut utiliser des . et non des +

$verif_login = $bdd->query("SELECT COUNT(*) FROM user WHERE User=".$login);

Sinon pourquoi ne pas directement faire un select * from user where login = $login and password = $password ?

Et par convention les champs en bdd sont en miniscule :)

j'en ai jamais vu alors de + hormis pour les addictions de table
Vous avez tester directement dans phpmyadmin votre requête ?

print_r($bdd->errorInfo());

Utilise errorInfo pour savoir quel est l'erreur SQL

Masso
Auteur

@TrimA74 : comme je l'ai dit avant ce n'est de toute façon pas la concaténation qui pose problème.
C'est pour faire des conditions dérière.

@Carouge10 Ok, Oui sur SQL directe la requete marche bien est retourne belle et bien 1

Regarde ce qu'il y a dans $login avant que la requête s'éxécute ou remplace cette variable par une valeur brute

Essayer un ajoutant un espace entre User et =

Masso
Auteur

Pour le errorInfo() Trim, il me renvoi ceci :
Array ( [0] => 42S22 [1] => 1054 [2] => Unknown column 'masso' in 'where clause' )
C'est la même erreur que j'obtiens quand je rentre directement la requete sur phpmyadmin sans mettre de ' ' à masso.
J'ai deja remplacé $login par masso et même resultat

utiliser la fonction quote de pdo ou utiliser les requêtes préparés

$verif_login = $bdd->query("SELECT COUNT(*) FROM user WHERE User='".$login."'");

Et comme ça, cela donne quoi ?

Masso
Auteur

Ok plus d'erreur du coté quote TrimA74 merci.
Par contre il me dit un truc rigolo c'est que les objets de la class PDOStatement ne peuvent pas etre converti en int (en faisait reference à mon if d'apres). Alors que query() n'est pas de cette class ^^

faite un var_dump de $verif_login et vous comprendrez votre erreur

Masso
Auteur

Je n'ai pas compris Carouge, le fait qu'il considere que query() = queryString() qui lui est de Statement ?.
Si non j'ai remplacé COUNT() par seulement et du coup j'ai remplacé le if par == false.
Mais ça revient au même, il me renvoi au else que j'ai rentré le bon nom ou non :/

après le query faite

var_dump($verif_login);

et vous verrez ce que vous le query

Masso
Auteur

il me dit rien de spécial :
object(PDOStatement)[2]
public 'queryString' => string 'SELECT * FROM user WHERE User='masso'' (length=37)
(quand j'ecris masso dans le formulaire)

Masso
Auteur

Ha ok Carouge :) Je crois que c'est la bonne voie.
Du coup il me renvoi un tableau avec tous les parametres de l'utilisateur.
Je n'ai plus qu'à selectionner l'element que je veux tester je pense

Masso
Auteur

Super ! Merci à toi en tout cas (vive les couche-tard)
Il y a quelques erreur apres mais c'est normal ^^.

A bientôt.

De rien. A bientôt