1
votes

Quelle est la signification de ces deux lignes de code PHP?

Je suis en train de programmer un script pour connecter l'utilisateur si l'utilisateur tape les bonnes informations dans le champ Mot de passe et Login sur une page de connexion. Le script fonctionne très bien, mais je ne sais pas vraiment ce que ces deux lignes de code signifient et font pour l'expérience utilisateur globale.

Je vais bientôt passer un examen où je dois expliquer la signification du code , et ce serait absolument incroyable si vous m'aidiez en expliquant ce que font les deux lignes de code ci-dessous. Voici le script complet:

$result = mysqli_query($connection, $query) or die(mysqli_error($connection));
$count = mysqli_num_rows($result);

Les deux lignes de code que j'ai du mal à comprendre sont:

<?php  

require('db_connect.php');

if (isset($_POST['user_id']) and isset($_POST['user_pass'])) {

    $username = $_POST['user_id'];
    $password = $_POST['user_pass'];

    $query = "SELECT * FROM dataforlogin WHERE username='$username' and password='$password'";

    $result = mysqli_query($connection, $query) or die(mysqli_error($connection));
    $count = mysqli_num_rows($result);

    if ($count == 1) {

        header("location: ../staudal/dashboard/index.php");

    } else {

        echo "Fail";

  }
}

?>

Que font-ils et pourquoi?


6 commentaires

Ce code semble quelque peu obsolète (complet avec vulnérabilités d'injection SQL ) - vous voudrez peut-être trouver un didacticiel plus moderne ...


Le premier exécute une requête MySQL, le second compte le nombre de lignes renvoyées par la requête. Tout cela est dans la documentation, et également expliqué dans un certain nombre de tutoriels.


@ CD001 Bien que ce ne soit pas un bon code, il n'est pas vraiment obsolète. Il utilise mysqli plutôt que mysql . Malheureusement, la plupart des programmeurs (y compris les rédacteurs de didacticiels) ne se protègent pas contre l'injection SQL.


@Barmar Je dirais qu'un didacticiel plus moderne utiliserait des paramètres liés et password_hash () et ne ferait pas simplement écho à "Fail" en cas de problème.


@ CD001 Je ne pense pas que ce soit une question de «vieux» ou de «moderne», c'est juste «mauvais» contre «bon». Un mauvais code ne se démode pas.


@Barmar "Le mauvais code ne se démode pas." : D - oki, j'ai ri! Bon point - faites juste une petite substitution de chaîne dans mon commentaire original alors;)


4 Réponses :


0
votes

  • $ result = mysqli_query ($ connection, $ query) ou die (mysqli_error ($ connection));
  • Cela exécute la requête MySQL, telle que SELECT * FROM table WHERE id =? , puis enregistre les résultats. Ou il renvoie un message d'erreur si la requête échoue.

  • $ count = mysqli_num_rows ($ result);
  • Cela renvoie simplement le nombre de lignes renvoyées par votre requête.


    0 commentaires

    0
    votes

    Tout d'abord, j'aime dire, veuillez utiliser une instruction préparée.

    $count = mysqli_num_rows($result);
    

    La fonction mysqli_query () effectue une requête sur la base de données et $ connection ouvre une nouvelle connexion au serveur MySQL que vous avez déjà créée dans db_connect.php et vous vérifie si la connexion est établie ou non. Sinon, la fonction die () s'exécutera. Il est utilisé pour imprimer le message et quitter le script php actuel.

    $result = mysqli_query($connection, $query) or die(mysqli_error($connection));
    

    mysqli_num_rows () renvoie le nombre de lignes dans un jeu de résultats et vous stockez ce nombre dans $ count code> variable.

    J'espère que cela vous aidera


    0 commentaires

    21
    votes

    C'est une bonne question car ces lignes sont pour la plupart fausses ou inutiles selon les normes modernes de sécurité et de conception d'applications. Cela ne m'est jamais venu à l'esprit avant qu'il puisse y avoir autant de mal en seulement deux lignes de code.

    voici comment cela devrait être

    $stmt = $mysqli->prepare("SELECT * FROM dataforlogin WHERE username = ?");
    $stmt->bind_param("s", $username);
    $stmt->execute();
    $result= $stmt->get_result()
    $user = $result->fetch_assoc();
    
    if ($user && password_verify($password, $user['password']))
    {
        // write some info into the session
        header("location: ../staudal/dashboard/index.php");
        exit;
    } else {
        echo "invalid";
    }
    
    • dans la première ligne, nous préparons la requête SQL avec des points d'interrogation placés là où les variables doivent aller (on l'appelle donc un espace réservé).
    • dans la deuxième ligne, nous lions la variable réelle à l'espace réservé, elle sera donc envoyée au serveur mysql séparé de la requête et il n'y aura aucun moyen pour eux d'interférer.
    • alors la requête est effectivement exécutée.
    • alors nous obtenons la variable mysqli_result , familière à tous les utilisateurs de l'ancienne requête mysql ou de la nouvelle requête mysqli - la source réelle des données renvoyées par la requête.
    • alors nous essayons de récupérer la ligne sélectionnée.
    • alors nous vérifions deux choses à la fois,
      • si notre requête a renvoyé une ligne
      • et si oui, si le mot de passe envoyé depuis le formulaire est le même que celui stocké dans la base de données à l'aide de la fonction password_verify ()
    • le reste est le même que dans votre code, sauf pour deux choses
      • avant de rediriger un utilisateur, vous êtes censé écrire des informations à son sujet dans la session, afin de le reconnaître sur d'autres pages
      • il est recommandé d'ajouter exit après l'envoi de l'en-tête Location.

    J'espère que ces explications seront suffisantes pour vos professeurs

    Sérieusement, cette question devrait sensibiliser à l'état de l'éducation PHP. La plupart des sources, en ligne et hors ligne, enseignent comme s'il s'agissait toujours de PHP3, avec seulement un lifting mineur en ce qui concerne les fonctions obsolètes. Mais l'approche, qui est erronée à bien des égards, reste la même.


    7 commentaires

    en effet, vous ne devez pas utiliser de filtre de colonne de mot de passe dans la clause WHERE car il peut être utilisé pour chronométrer des attaques car les bases de données sont conçues pour renvoyer des données aussi rapidement que possible, surtout lorsque la colonne de mot de passe fait partie d'un index (multicolonne) , password_hash () vous oblige à utiliser password_verify () de quelle manière vous êtes entièrement protégé contre attaques de temps sur votre mot de passe.


    ou au lieu d'utiliser ou die (mysqli_error ($ connection)) , vous voudrez peut-être implémenter en utilisant mysqli_report (MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); pour lancer des exceptions et utiliser try { ...} catch (Exception $ e) {...} blocs autour du code associé à MySQL.


    @raymond vous ne devez pas intercepter les exceptions par défaut.


    question de goûts et d'objectifs je geuss et je pense que vous vouliez dire jeter des exceptions par défaut, mais il s'agit probablement d'une meilleure gestion en effet par une classe personnalisée où vous lancez manuellement une exception MySQLConnectException lorsqu'une connexion échoue car je crois aussi qu'il y a aussi du code > mysqli_report () bogues sur certaines versions de PHP maintenant je me souviens.


    Votre code devrait inclure un exit () ou __halt_compiler () après header () car vous ne pouvez pas faites confiance au client pour suivre l'en-tête de redirection http et empêcher toute exécution indésirable (possible) ultérieure.


    Veuillez lire les Principes de base des rapports d'erreurs PHP


    Cela a plus ou moins de sens ce que je fais aussi. Eh bien, j'ai écrit un gestionnaire d'exceptions personnalisé qui montre l'exception avec un stacktrace de débogage comprenant des parties de code par réflexion (y compris les valeurs de paramètre) lorsque je développe, lorsque le serveur le connecte La base de données SQLite car je n'aime pas vraiment utiliser les fichiers tekst pour me connecter, la base de données SQLite n'est pas téléchargeable par une URL qui serait vraiment mauvaise car je fuit ensuite le code source vers le monde extérieur



    0
    votes

    Je suis un développeur junior mais j'espère que cette réponse vous aidera en fonction de votre code:

    1. $ result = mysqli_query ($ connection, $ query) ou die (mysqli_error ($ connection));

      • $ result est une variable php

      • mysqli_query ($ connection, $ query) signifie que mysqli_query utilisera la connexion à la base de données déclarée dans votre db_connect.php pour exécuter la requête [$ query = "SELECT * FROM dataforlogin WHERE username = '$ username' et password = '$ password' ";]

      • ou die (mysqli_error ($ connection)); signifie que si mysqli_query ne trouve pas la base de données ou la table spécifiée, dans ce cas (dataforlogin), il affichera l'erreur de connexion spécifiée dans votre db_connect.php

    2. $ count = mysqli_num_rows ($ result);

      • $ count est une variable php

      • mysqli_num_rows ($ result); signifie que $ count est égal au nombre de lignes trouvées dans la table (dataforlogin) pour $ result lorsque mysqli_query ($ connection, $ query) a été exécuté.

    Remarque: veuillez éviter d'utiliser la ligne --- ou die (mysqli_error ($ connection) car cela peut empêcher le chargement de la page, ce n'est pas nécessaire.


    3 commentaires

    "Veuillez éviter d'utiliser la ligne --- ou die (mysqli_error ($ connection) car cela peut empêcher le chargement de la page, ce n'est pas nécessaire." que faire si le code ci-dessous dépend d'une connexion MySQL fonctionnelle ..


    C'est peut-être nécessaire mais je préfère l'inclure dans mon code db_connect et l'omettre dans la page principale, cela fonctionne toujours pour moi. #Développeur débutant


    Vous pouvez vérifier ma réponse pour les explications détaillées.