MYSQL Fatal Error

  • Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!
2 August 2017
118
1
18
21
#1
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
 
2 August 2017
118
1
18
21
#5
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
 
2 August 2017
118
1
18
21
#7
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."'";
 

m.scatello

Aktives Mitglied
15 Februar 2017
779
79
28
#8
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.
 
10 Juli 2015
154
22
18
www.mn-portal.at
#9
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