1. Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!
    Information ausblenden

MYSQL Fatal Error

Dieses Thema im Forum "Datenbanken - z.B. MySQL" wurde erstellt von Timer, 12 Februar 2018.

  1. Timer

    Timer Mitglied

    Registriert seit:
    2 August 2017
    Beiträge:
    89
    Punkte für Erfolge:
    8
    Hey,
    ich wollte gerade bei einer Tabelle in einer MYSQL Datenbank eine Zeile finden, indem ich nach dem eingegebenen Username (für ein Login). Leider kommt da ein Fehler:
    Code (text):
    1. Fatal error: Call to a member function fetch() on boolean in /users/spielberger-dev/www/php/account.php on line 10
    PHP:
    1. <?php
    2.     session_start();
    3.     if(isset($_POST["username"])) {
    4.         include("php/mysql.php");
    5.         if($_POST["password"]) {
    6.             $username = $_POST["username"];
    7.             $password = $_POST["password"];
    8.             $sql ="SELECT * FROM users WHERE username = ".$username;
    9.             $statement = $conn->query($sql);
    10.             $user = $statement->fetch();
    11.         }
    12.     }
    13. ?>
    Ich habe den Ansatz für das Suchen nach dem Username von folgendem Link "abgespickt" und leicht verändert (da anfangs sehr viel mehr Fehler auftraten ^^):
    https://www.php-einfach.de/experte/php-codebeispiele/loginscript/
    Der Code ist der unter Login
     
    Werbung:

    Jetzt registrieren, damit diese Werbung verschwindet
  2. m.scatello

    m.scatello Aktives Mitglied

    Registriert seit:
    15 Februar 2017
    Beiträge:
    586
    Punkte für Erfolge:
    28
  3. Timer

    Timer Mitglied

    Registriert seit:
    2 August 2017
    Beiträge:
    89
    Punkte für Erfolge:
    8
    Das habe ich bereits gemacht. Da kommt der gleiche Fehler und nichts neues (bzw keine neuen Infos)
     
  4. m.scatello

    m.scatello Aktives Mitglied

    Registriert seit:
    15 Februar 2017
    Beiträge:
    586
    Punkte für Erfolge:
    28
  5. Timer

    Timer Mitglied

    Registriert seit:
    2 August 2017
    Beiträge:
    89
    Punkte für Erfolge:
    8
    Ich habe jetzt
    PHP:
    1. if (!$conn->query("SET a=1")) {
    2.     printf("Errormessage: %s\n", $conn->error);
    3. }
    nach die Zeile $statement... gesetzt. Nun kommt nur noch die Zeile "Errormessage:" vor dem Fehler dazu. Da steht nun der Fehler dran (immer noch der selbe nur andere Zeile):
    Code (text):
    1. Errormessage:
    2. Fatal error: Call to a member function fetch() on boolean in /users/spielberger-dev/www/php/account.php on line 13
     
  6. m.scatello

    m.scatello Aktives Mitglied

    Registriert seit:
    15 Februar 2017
    Beiträge:
    586
    Punkte für Erfolge:
    28
    Siehe Posting #4
     
  7. Timer

    Timer Mitglied

    Registriert seit:
    2 August 2017
    Beiträge:
    89
    Punkte für Erfolge:
    8
    Wie gesagt:
    da kommt nix
    Ich hab jetzt aber zufällig selber den Fehler gefunden: Ich habe die ' ' vor und nach dem $username vergessen. Sieht dann so aus:
    PHP:
    1. $sql ="SELECT * FROM users WHERE username = '".$username."'";
     
  8. m.scatello

    m.scatello Aktives Mitglied

    Registriert seit:
    15 Februar 2017
    Beiträge:
    586
    Punkte für Erfolge:
    28
    Dann hast du was falsch gemacht, denn MySQL haut dir bei der vorherigen Version ohne ' eine Fehlermeldung um die Ohren, wenn du einen Fehlerr richtig prüfst.

    Beim Einsatz von SQL-Datenbanken sollte das Abrufen aller Spalten eines Datensatzes per SELECT * vermieden werden. Stattdessen sollten die gewünschten Spaltennamen explizit aufgelistet werden (SELECT col1, col2 FROM …). Einige Vorteile:
    • Häufig werden in einer Abfrage nicht alle Spalten benötigt, die aktuell existieren oder in Zukunft existieren könnten, sodass unnötige Daten übertragen werden.
    • Bei expliziter Angabe der gewünschten Spalten können Datenbanksysteme unter Umständen Indizes zur Beantwortung von Abfragen nutzen.
    • Eine Auflistung der Spaltennamen macht den Code verständlicher, da die Tabellenstruktur nicht erst im Datenbankschema nachgelesen werden muss.
    • Bei Änderungen am Datenbankschema (etwa bei Entfernung oder Umbenennung einer Spalte) schlägt eine Query, die kein SELECT * nutzt, sofort fehl. Das ist hilfreich, da so keine Stelle im Code übersehen werden kann, an der wahrscheinlich auch die PHP-Datenstrukturen an das neue Schema angepasst werden müssen.
     
  9. sysop

    sysop Mitglied

    Registriert seit:
    10 Juli 2015
    Beiträge:
    147
    Punkte für Erfolge:
    18
    Nachteil:
    • Man muss die Spaltenstruktur vorher genau kennen.
    • Zusätzliche Spaltenanlage erfordert jedes mal Frickeleien am Code
    • Schon die Umbenennung von Spalten erfordert umfangreiche Code-Korrekturen.
    Ich meine gehört zu haben, mit Maria-DB sollten Indizes auch bei SELECT * verwendet werden. Schon der Umstieg auf MariaDB sollte performanter sein, als eine Umstellung von SELECT * auf SELECT FELD