• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

MYSQL Fatal Error

Timer

Mitglied
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:
Fatal error: Call to a member function fetch() on boolean in /users/spielberger-dev/www/php/account.php on line 10
PHP:
<?php
    session_start();
    if(isset($_POST["username"])) {
        include("php/mysql.php");
        if($_POST["password"]) {
            $username = $_POST["username"];
            $password = $_POST["password"];
            $sql ="SELECT * FROM users WHERE username = ".$username;
            $statement = $conn->query($sql);
            $user = $statement->fetch();
        }
    }
?>
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:
Werbung:
Ich habe jetzt
PHP:
if (!$conn->query("SET a=1")) {
    printf("Errormessage: %s\n", $conn->error);
}
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:
Errormessage:
Fatal error: Call to a member function fetch() on boolean in /users/spielberger-dev/www/php/account.php on line 13
 
Werbung:
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:
$sql ="SELECT * FROM users WHERE username = '".$username."'";
 
Wie gesagt:
da kommt nix
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.
 
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
 
Werbung:
Zurück
Oben