Ich versuche, Daten aus einer MySQL-Tabelle auszuwählen, erhalte jedoch eine der folgenden Fehlermeldungen:
mysql_fetch_array () erwartet, dass Parameter 1 eine Ressource ist, boolescher Wert
Das ist mein Code:
$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');
while($row = mysql_fetch_array($result)) {
echo $row['FirstName'];
}
mysql_real_escape_string
. Vertraue niemals Benutzerdaten.mysql_real_escape_string
des SQL-Injection-Schutzes; Es ist immer noch anfällig für eine Reihe von Angriffen. (Nein, Sie haben nie gesagt, dass es perfekt ist, aber Sie haben impliziert, dass es die einzig erforderliche Lösung ist.) Die beste Lösung ist jetzt, soweit ich weiß, PDO.Antworten:
Eine Abfrage kann aus verschiedenen Gründen fehlschlagen. In diesem Fall kehren sowohl die Erweiterung mysql_ * als auch die Erweiterung mysqli
false
von ihren jeweiligen Abfragefunktionen / -methoden zurück. Sie müssen diesen Fehlerzustand testen und entsprechend behandeln.mysql_ * Erweiterung :
Überprüfen Sie dies,
$result
bevor Sie es weiterleitenmysql_fetch_array
. Sie werden feststellen, dassfalse
die Abfrage fehlgeschlagen ist. In dermysql_query
Dokumentation finden Sie mögliche Rückgabewerte und Vorschläge zum Umgang damit.Verfahrensstil der mysqli-Erweiterung :
oo-style :
mit einer vorbereiteten Aussage:
Diese Beispiele veranschaulichen nur, was zu tun ist (Fehlerbehandlung), nicht wie es zu tun ist. Produktionscode sollte
or die
bei der Ausgabe von HTML nicht verwendet werden, da er sonst (zumindest) ungültiges HTML generiert. Außerdem sollten Datenbankfehlermeldungen nicht für Benutzer ohne Administratorrechte angezeigt werden, da sie zu viele Informationen enthalten .quelle
if($result === FALSE)
Sie verwendenif(! $result)
. Korrigieren Sie mich, wenn ich falschDiese Fehlermeldung wird angezeigt, wenn Ihre Abfrage einen Fehler enthält, der zum Fehlschlagen geführt hat. Es wird sich manifestieren, wenn:
mysql_fetch_array
/.mysqli_fetch_array()
mysql_fetch_assoc()
/.mysqli_fetch_assoc()
mysql_num_rows()
/.mysqli_num_rows()
Hinweis : Dieser Fehler wird nicht angezeigt, wenn Ihre Abfrage keine Zeilen betrifft . Nur eine Abfrage mit einer ungültigen Syntax generiert diesen Fehler.
Schritte zur Fehlerbehebung
Stellen Sie sicher, dass Ihr Entwicklungsserver so konfiguriert ist, dass alle Fehler angezeigt werden. Sie können dies tun, indem Sie dies oben in Ihre Dateien oder in Ihre Konfigurationsdatei einfügen :
error_reporting(-1);
. Wenn Sie Syntaxfehler haben, werden Sie darauf hingewiesen.Verwenden Sie
mysql_error()
.mysql_error()
meldet alle Fehler, die MySQL beim Ausführen Ihrer Abfrage festgestellt hat.Beispielnutzung:
Führen Sie Ihre Abfrage über die MySQL-Befehlszeile oder ein Tool wie phpMyAdmin aus . Wenn Ihre Abfrage einen Syntaxfehler enthält, erfahren Sie, um was es sich handelt.
Stellen Sie sicher, dass Ihre Zitate korrekt sind. Ein fehlendes Anführungszeichen um die Abfrage oder einen Wert kann dazu führen, dass eine Abfrage fehlschlägt.
Stellen Sie sicher, dass Sie Ihren Werten entkommen. Anführungszeichen in Ihrer Abfrage können dazu führen, dass eine Abfrage fehlschlägt (und Sie auch für SQL-Injektionen offen bleiben). Verwenden
mysql_real_escape_string()
Sie diese Option , um Ihrer Eingabe zu entkommen.Stellen Sie sicher, dass Sie nicht mischen
mysqli_*
undmysql_*
funktionieren. Sie sind nicht dasselbe und können nicht zusammen verwendet werden. (Wenn Sie den einen oder anderen Stick wählen möchten,mysqli_*
siehe unten, warum.)Andere Tipps
mysql_*
Funktionen sollten nicht für neuen Code verwendet werden. Sie werden nicht mehr gepflegt und die Community hat mit dem Abschreibungsprozess begonnen . Stattdessen sollten Sie sich mit vorbereiteten Anweisungen vertraut machen und entweder PDO oder MySQLi verwenden . Wenn Sie sich nicht entscheiden können, hilft Ihnen dieser Artikel bei der Auswahl. Wenn Sie lernen möchten, finden Sie hier ein gutes PDO-Tutorial .quelle
mysql_query()
/mysqli_query($connection)
usw. ausgeführt wird." ;; Gedanken? Da keine anderen Antworten in diesem Q & A dies erwähnen.Der hier aufgetretene Fehler war auf die Verwendung von einfachen Anführungszeichen (
'
) zurückzuführen. Sie können Ihre Anfrage folgendermaßen stellen:Es wird
mysql_real_escape_string
zur Verhinderung der SQL-Injection verwendet. Wir sollten zwar die Erweiterung MySQLi oder PDO_MYSQL für die aktualisierte Version von PHP (PHP 5.5.0 und höher) verwenden, aber für ältere Versionen reichtmysql_real_escape_string
dies aus.quelle
Wie scompt.com erklärte , schlägt die Abfrage möglicherweise fehl. Verwenden Sie diesen Code, um den Fehler der Abfrage oder das richtige Ergebnis zu erhalten:
Weitere Informationen finden Sie in der Dokumentation
mysql_query()
.Der eigentliche Fehler waren die einfachen Anführungszeichen, damit die Variable
$username
nicht analysiert wurde. Aber Sie sollten wirklich verwendenmysql_real_escape_string($username)
, um SQL-Injektionen zu vermeiden.quelle
Setzen Sie Anführungszeichen
$username
. Zeichenfolgenwerte müssen im Gegensatz zu numerischen Werten in Anführungszeichen gesetzt werden.Es macht auch keinen Sinn, die
LIKE
Bedingung zu verwenden, wenn Sie keine Platzhalter verwenden: Wenn Sie eine genaue Übereinstimmung benötigen, verwenden Sie=
stattdessenLIKE
.quelle
Bitte überprüfen Sie, ob die ausgewählte Datenbank nicht ausgewählt ist, da manchmal die Datenbank nicht ausgewählt ist
Prüfen
vor der MySQL-Abfrage und dann mit dem nächsten Schritt fortfahren
quelle
Ihr Code sollte ungefähr so sein
Sobald Sie damit fertig sind, wird die Abfrage auf dem Bildschirm gedruckt. Probieren Sie diese Abfrage auf Ihrem Server aus und prüfen Sie, ob die gewünschten Ergebnisse erzielt werden. Meistens ist der Fehler in der Abfrage. Der Rest des Codes ist korrekt.
quelle
Sie definieren die Zeichenfolge in einfachen Anführungszeichen und PHP analysiert keine durch einfache Anführungszeichen getrennten Zeichenfolgen. Um eine variable Interpolation zu erhalten, müssen Sie doppelte Anführungszeichen ODER Zeichenfolgenverkettung (oder eine Kombination davon) verwenden. Weitere Informationen finden Sie unter http://php.net/manual/en/language.types.string.php .
Sie sollten auch überprüfen, ob mysql_query eine gültige Ergebnisressource zurückgegeben hat, da sonst fetch_ *, num_rows usw. nicht mit dem Ergebnis funktionieren, da es kein Ergebnis ist! IE:
Weitere Informationen finden Sie unter http://us.php.net/manual/en/function.mysql-query.php .
quelle
Diese Abfrage sollte funktionieren:
Das Problem sind einfache Anführungszeichen, daher schlägt Ihre Abfrage fehl und gibt FALSE zurück, und Ihre WHILE-Schleife kann nicht ausgeführt werden. Mit% können Sie alle Ergebnisse abgleichen, die Ihre Zeichenfolge enthalten (z. B. SomeText- $ username-SomeText).
Dies ist einfach eine Antwort auf Ihre Frage. Sie sollten die in den anderen Beiträgen erwähnten Dinge implementieren: Fehlerbehandlung, Escape-Zeichenfolgen verwenden (Benutzer können alles in das Feld eingeben, und Sie MÜSSEN sicherstellen, dass es sich nicht um beliebigen Code handelt), PDO anstelle von mysql_connect verwenden das ist jetzt beraubt.
quelle
Manchmal wird die Abfrage als unterdrückt
@mysql_query(your query);
quelle
Wenn Sie hier alles versucht haben und es nicht funktioniert, möchten Sie möglicherweise Ihre MySQL-Datenbankkollatierung überprüfen. Meins war auf eine schwedische Zusammenstellung eingestellt. Dann habe ich es geändert
utf8_general_ci
und alles hat einfach einen Gang eingelegt.quelle
Anstatt eine WHERE-Abfrage zu verwenden, können Sie diese ORDER BY-Abfrage verwenden. Es ist weitaus besser als dies für die Verwendung einer Abfrage.
Ich habe diese Abfrage durchgeführt und erhalte keine Fehler wie Parameter oder Boolesche Werte.
quelle
htmlspecialchars()
bei der Verwendung beliebiger Daten im Kontext von HTML zu verwenden. Andernfalls besteht die Gefahr, dass gültiges HTML erstellt wird, wenn reservierte Zeichen in den Daten verwendet werden.Versuchen Sie dies, es muss funktionieren, andernfalls müssen Sie den Fehler drucken, um Ihr Problem anzugeben
quelle
LIKE
Ausdruck).Es kann zwei Gründe geben:
Haben Sie die Verbindung zur Datenbank geöffnet, bevor Sie die Funktion mysql_query aufrufen? Ich sehe das nicht in deinem Code. Verwenden Sie mysql_connect, bevor Sie die Abfrage durchführen. Sehen
php.net/manual/en/function.mysql-connect.php
Die Variable $ username wird in einer einfachen Anführungszeichenfolge verwendet, sodass ihr Wert in der Abfrage nicht ausgewertet wird. Die Abfrage wird definitiv fehlschlagen.
Drittens ist die Struktur der Abfrage anfällig für SQL-Injection . Sie können vorbereitete Anweisungen verwenden, um diese Sicherheitsbedrohung zu vermeiden.
quelle
Versuchen Sie den folgenden Code. Es kann gut funktionieren.
quelle
Geh zu deinem
config.php
. Ich hatte das gleiche Problem. Überprüfen Sie den Benutzernamen und das Passwort, und auch SQL Select hat den gleichen Namen wie die Konfiguration.quelle
Verwenden Sie nicht die Funktion "beraubt mysql_ *" (entzogen in PHP 5.5 wird in PHP 7 entfernt). und du kannst das mit mysqli oder pdo machen
Hier ist die vollständige Auswahlabfrage
quelle
Und wenn es einen Benutzer mit einem eindeutigen Benutzernamen gibt, können Sie dafür "=" verwenden. Es besteht keine Notwendigkeit zu mögen.
Ihre Anfrage lautet:
quelle
username
und es wird ausgeführt.Fügen Sie vor der MySQL-Abfrage eine Verbindungszeichenfolgenvariable ein. Zum Beispiel
$connt
in diesem Code:quelle
Jedes Mal, wenn Sie die ...
... es ist wahrscheinlich, weil es ein Problem mit Ihrer Anfrage gibt. Das
prepare()
oderquery()
könnte zurückkehrenFALSE
(ein Boolescher Wert), aber diese generische Fehlermeldung lässt Sie nicht viel im Weg. Wie finden Sie heraus, was mit Ihrer Anfrage nicht stimmt? Du fragst !Stellen Sie zunächst sicher, dass die Fehlerberichterstattung aktiviert und sichtbar ist: Fügen Sie diese beiden Zeilen direkt nach dem Öffnen des
<?php
Tags oben in Ihre Datei (en) ein :Wenn Ihre Fehlerberichterstattung in der php.ini festgelegt wurde, müssen Sie sich darüber keine Sorgen machen. Stellen Sie einfach sicher, dass Sie Fehler ordnungsgemäß behandeln und Ihren Benutzern niemals die wahre Ursache von Problemen mitteilen. Die Offenlegung der wahren Ursache für die Öffentlichkeit kann eine goldgravierte Einladung für diejenigen sein, die Ihren Websites und Servern Schaden zufügen möchten. Wenn Sie keine Fehler an den Browser senden möchten, können Sie jederzeit die Fehlerprotokolle Ihres Webservers überwachen. Die Protokollspeicherorte variieren von Server zu Server, z. B. befindet sich unter Ubuntu das Fehlerprotokoll normalerweise unter
/var/log/apache2/error.log
. Wenn Sie Fehlerprotokolle in einer Linux-Umgebung untersuchen, können Sietail -f /path/to/log
in einem Konsolenfenster Fehler anzeigen, wie sie in Echtzeit auftreten ... oder wie Sie sie erstellen.Sobald Sie mit der Standardfehlerberichterstattung fertig sind, erhalten Sie durch Hinzufügen von Fehlerprüfungen für Ihre Datenbankverbindung und Abfragen viel mehr Details zu den auftretenden Problemen. Schauen Sie sich dieses Beispiel an, in dem der Spaltenname falsch ist. Zunächst der Code, der die generische schwerwiegende Fehlermeldung zurückgibt:
Der Fehler ist allgemein und für Sie bei der Lösung der Vorgänge nicht sehr hilfreich.
Mit ein paar weiteren Codezeilen erhalten Sie sehr detaillierte Informationen, mit denen Sie das Problem sofort lösen können . Überprüfen Sie die
prepare()
Aussage auf Richtigkeit und wenn sie gut ist, können Sie mit dem Binden und Ausführen fortfahren.Wenn etwas nicht stimmt, können Sie eine Fehlermeldung ausspucken, die Sie direkt zum Problem führt. In diesem Fall gibt es keine
foo
Spalte in der Tabelle. Die Lösung des Problems ist trivial.Wenn Sie möchten, können Sie diese Prüfung in eine Funktion oder Klasse aufnehmen und erweitern, indem Sie die Fehler wie zuvor erwähnt ordnungsgemäß behandeln.
quelle
echo $error;
in einem Beitrag?quelle
Versuche dies
quelle
Überprüfen Sie zunächst Ihre Verbindung zur Datenbank. Ist es erfolgreich verbunden oder nicht?
Wenn es fertig ist, habe ich danach diesen Code geschrieben und es funktioniert gut:
quelle
Wenn Sie mehrere Abfragen in einem Skript verwenden, auch wenn Sie andere Seiten einschließen, die Abfragen oder Datenbankverbindungen enthalten, ist es möglich, dass Sie an jedem Ort, an dem Sie db_close () verwenden, Ihre Datenbankverbindung schließen. Stellen Sie also sicher, dass Sie es sind Diesen Fehler in Ihren Skripten nicht machen.
quelle
Wenn beim Überprüfen kein MySQL-Fehler auftritt, stellen Sie sicher, dass Sie Ihre Datenbanktabelle ordnungsgemäß erstellt haben. Das ist mir passiert. Suchen Sie nach unerwünschten Kommas oder Anführungszeichen.
quelle
Überprüfen Sie zuerst Ihre Verbindung.
Wenn Sie dann den genauen Wert aus der Datenbank abrufen möchten, sollten Sie Folgendes schreiben:
Oder Sie möchten den Werttyp
LIKE
abrufen, dann sollten Sie schreiben:quelle
Sie können auch überprüfen, ob dies
$result
fehlschlägt, bevor Sie das Abrufarray ausführenquelle
Normalerweise tritt ein Fehler auf, wenn Ihre Datenbankkonnektivität fehlschlägt. Stellen Sie daher sicher, dass Sie eine Verbindung zu Ihrer Datenbank herstellen oder die Datenbankdatei einschließen.
ODER
mysql_query($query_variable);
.quelle
Versuchen Sie diesen Code, es funktioniert gut
Weisen Sie der Variablen die Post-Variable zu
quelle
Da $ username eine PHP-Variable ist, müssen wir sie als Zeichenfolge an mysqli übergeben. Da wir in der Abfrage mit einem einfachen Anführungszeichen begonnen haben, verwenden wir das doppelte Anführungszeichen, das einfache Anführungszeichen und einen Punkt für die Konkatation ("'. $ username). '") Wenn Sie mit einem doppelten Anführungszeichen beginnen, kehren Sie die Anführungszeichen um ('". $ username. "').
Die Verwendung von MySQL hat jedoch stark abgenommen. Verwenden Sie stattdessen PDO. Es ist einfach, aber sehr sicher
quelle