mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows usw... parameter erwartet 1 Ressource oder Ergebnis
Ich versuche, wählen Sie die Daten aus einer MySQL Tabelle, aber ich erhalte eine der folgenden Fehlermeldungen angezeigt:
mysql_fetch_array() erwartet parameter 1 to be resource, boolean given
oder
mysqli_fetch_array() erwartet parameter 1 to be mysqli_result, boolean given
oder
Rufen Sie an eine member function fetch_array() on boolean /nicht-Objekt -
Dies 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'];
}
Das gleiche gilt für code wie
$result = mysqli_query($mysqli, 'SELECT ...');
//mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given
while( $row=mysqli_fetch_array($result) ) {
...
und
$result = $mysqli->query($mysqli, 'SELECT ...');
//Call to a member function fetch_assoc() on a non-object
while( $row=$result->fetch_assoc($result) ) {
...
und
$result = $pdo->query('SELECT ...', PDO::FETCH_ASSOC);
//Invalid argument supplied for foreach()
foreach( $result as $row ) {
...
und
$stmt = $mysqli->prepare('SELECT ...');
//Call to a member function bind_param() on a non-object
$stmt->bind_param(...);
und
$stmt = $pdo->prepare('SELECT ...');
//Call to a member function bindParam() on a non-object
$stmt->bindParam(...);
Sie erhalten weitere nützliche eroor msg mit:: QUERY or die(mysql_error());
Der obligatorische Hinweis: Dein code ist anfällig für SQL-injection. sollten Sie überprüfen, und/oder die Flucht der Benutzereingaben. Haben Sie einen Blick auf
Eigentlich ist der OP-code zu einem Syntaxfehler, die auf dem MySQL-server, aber zumindest ist es nicht anfällig für SQL-Injection, weil die einzelnen Zitate nicht variable interpolation.
Ich weiß, dies ist eine sehr alte, und wahrscheinlich der möglichst genaue Zeitpunkt, aber dein Kommentar ist jetzt gefährlich falsch in einer Art und Weise:
Neben den ersten Fehler, was du gepostet hast würde haben geworfen ein weiterer Fehler, diese für
Der obligatorische Hinweis: Dein code ist anfällig für SQL-injection. sollten Sie überprüfen, und/oder die Flucht der Benutzereingaben. Haben Sie einen Blick auf
mysql_real_escape_string
. Never trust user data.Eigentlich ist der OP-code zu einem Syntaxfehler, die auf dem MySQL-server, aber zumindest ist es nicht anfällig für SQL-Injection, weil die einzelnen Zitate nicht variable interpolation.
Ich weiß, dies ist eine sehr alte, und wahrscheinlich der möglichst genaue Zeitpunkt, aber dein Kommentar ist jetzt gefährlich falsch in einer Art und Weise:
mysql_real_escape_string
ist nicht sein-alles und Ende-alles von SQL-injection-Schutz, es ist immer noch anfällig für eine Reihe von Angriffen. (Nein, Sie sagte nie, dass es perfekt ist, aber Sie impliziert, es war die einzige Lösung erforderlich) Die beste Lösung ist jetzt, PDO, soweit ich weiß.Neben den ersten Fehler, was du gepostet hast würde haben geworfen ein weiterer Fehler, diese für
LIKE $username
da wir mehr als wahrscheinlich Umgang mit einem string und nicht integer. Daher würde es, zitiert zu werden.InformationsquelleAutor iamjonesy | 2010-06-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer Abfrage kann aus verschiedenen Gründen fehlschlagen, in dem Fall sowohl die mysql_* und der mysqli-Erweiterung zurück
false
aus Ihrer jeweiligen query-Funktionen/Methoden. Sie brauchen, um zu testen, dass Fehler und behandeln Sie entsprechend.mysql_* extension:
Überprüfen
$result
vor der übergabe anmysql_fetch_array
. Sie finden, dass esfalse
da die Abfrage fehlgeschlagen. Finden Sie diemysql_query
Dokumentation für mögliche Rückgabewerte und Vorschläge, wie mit Ihnen umzugehen.mysqli-Erweiterung
prozeduraler Stil:
oo-Stil:
mit einem prepared statement:
Diese Beispiele nur verdeutlichen was getan werden sollte (error handling), nicht, wie es zu tun. Produktionscode sollten nicht
- oder sterben
, wenn die Ausgabe HTML ist, sonst wird es (zumindest) erzeugt ungültiges HTML. Auch Datenbank-Fehlermeldungen sollten nicht angezeigt werden, um nicht-admin-Benutzer, wie es Preisgabe von zu viel Informationen.Ich würde design eine ganze error-handling-Mechanismus für die OP, entschied sich aber, die möglicherweise über den Rahmen meiner Antwort.
Ja, es ist auch bedeckt in mehreren anderen Antworten. Ich glaube, ich war nur den Punkt machen, denn es ist die akzeptiert Antwort auf eine hohe Sichtbarkeit Frage, zusätzlich zu den (hervorragenden) Beratung über, wie man richtig abfangen von Fehlern in der Zukunft, es sollte (IMHO) die Antwort auf die konkrete Frage (ie, erklären warum es ist ein Fehler in diesem Fall).
Statt
if($result === FALSE)
können Sieif(! $result)
. Korrigieren Sie mich, wenn ich falsch Liegemysql_query(): Die mysql-Erweiterung ist veraltet und wird entfernt werden, in der Zukunft: verwenden mysqli
InformationsquelleAutor Edward Dale
Diese Fehlermeldung wird angezeigt, wenn Sie einen Fehler in der Abfrage, die verursacht es zu scheitern. Es wird sich Ihnen zeigen, wenn Sie verwenden:
mysql_fetch_array
/mysqli_fetch_array()
mysql_fetch_assoc()
/mysqli_fetch_assoc()
mysql_num_rows()
/mysqli_num_rows()
Hinweis: Dieser Fehler tritt nicht angezeigt, wenn keine Zeilen betroffen sind, von der Abfrage. Nur eine Abfrage mit einer ungültigen syntax wird dieser Fehler generiert.
Schritte Zur Fehlerbehebung
Stellen Sie sicher, dass Ihre Entwicklungs-server konfiguriert ist, die Anzeige aller Fehler. Sie können dies tun, indem Sie diese an der Spitze Ihrer Dateien oder in deiner config-Datei:
error_reporting(-1);
. Wenn Sie irgendwelche syntax-Fehler, dies wird zeigen Sie Sie heraus auf Sie zu.Verwenden
mysql_error()
.mysql_error()
berichten alle MySQL-Fehler aufgetreten, während der Ausführung der Abfrage.Beispiel für die Nutzung:
Führen Sie Ihre Abfrage aus der MySQL-Kommandozeile oder ein tool wie phpMyAdmin. Wenn Sie einen syntax-Fehler in der Abfrage dies wird Ihnen sagen, was es ist.
Stellen Sie sicher, dass Ihre Zitate korrekt sind. Eine fehlende zitieren, um die Abfrage-oder ein Wert kann zu einem Abfragefehler.
Stellen Sie sicher, dass Sie die Flucht Ihrer Werte. Zitate in Ihre Abfrage kann zu einem Abfragefehler (und auch verlassen Sie offen für SQL-injections). Verwenden
mysql_real_escape_string()
zu entkommen Ihre Eingabe.Stellen Sie sicher, dass Sie nicht mischen
mysqli_*
undmysql_*
Funktionen. Sie sind nicht dasselbe und können nicht zusammen verwendet werden. (Wenn Sie gehen zu wählen, der eine oder andere stick mitmysqli_*
. Siehe unten für das warum.)Andere Tipps
mysql_*
Funktionen sollten nicht verwendet werden, für den neuen code. Sie werden nicht mehr gepflegt und die Gemeinschaft hat begonnen, die deprecation-Prozess. Stattdessen sollten Sie lernen, über prepared statements und verwenden Sie entweder PDO oder MySQLi. Wenn Sie sich nicht entscheiden können, dieser Artikel wird helfen, zu wählen. Wenn Sie die Pflege zu lernen, hier ist gute PDO tutorial.mysql_query()
/mysqli_query($connection)
etc."; Gedanken? Da keine anderen Antworten in diesem Q&A erwähnt.InformationsquelleAutor John Conde
Fehler ist aufgetreten, hier wurde durch die Verwendung von einfachen Anführungszeichen (
'
). Sie können Ihre Abfrage wie diese:Es ist mit
mysql_real_escape_string
für die Verhinderung von SQL-injection.Aber sollten wir verwenden MySQLi oder PDO_MYSQL-Erweiterung für die Upgrade-version von PHP (PHP 5.5.0 und später), aber für ältere Versionen
mysql_real_escape_string
wird den trick tun.Riva Ja, aber ich dachte, das ist etwas sauberer Weg, um separate Variablen aus string. 🙂
InformationsquelleAutor nik
Als die scompt.com erklärt, die Abfrage möglicherweise fehl. Verwenden Sie diesen code, der den Fehler der die Abfrage oder das richtige Ergebnis:
Sehen die Dokumentation für
mysql_query()
für weitere Informationen.Der eigentliche Fehler war, die einzelnen Angebote, so dass die variable
$username
wurde nicht analysiert. Aber Sie sollten wirklichmysql_real_escape_string($username)
zu vermeiden, SQL-injections.InformationsquelleAutor 2ndkauboy
Setzen Sie Anführungszeichen um
$username
. String-Werte, im Gegensatz zu numerischen Werten, müssen in Anführungszeichen eingeschlossen werden.Auch, es gibt keinen Punkt in der Verwendung des
LIKE
Zustand, wenn Sie nicht mit wildcards: wenn Sie brauchen eine genaue übereinstimmung verwenden Sie=
stattLIKE
.InformationsquelleAutor Matteo Riva
Bitte überprüfen Sie nachdem Sie die Datenbank ausgewählt werden, nicht, weil einige Male die Datenbank nicht ausgewählt
Überprüfen
vor der MySQL-Abfrage
und dann gehen Sie zum nächsten Schritt
InformationsquelleAutor yasin
Dein code sollte so etwas wie dieses
Einmal getan, mit, dass, würde man die Abfrage-gedruckt auf dem Bildschirm. Versuchen Sie diese Abfrage auf dem server und sehen, ob es das gewünschte Ergebnis erzeugt. Die meisten der Zeit, ist der Fehler in der Abfrage. Rest des Codes richtig ist.
InformationsquelleAutor Chaitannya
Definieren Sie die Zeichenfolge mit einfachen Anführungszeichen und PHP nicht Parsen Apostroph getrennten Zeichenfolgen. Um Variablen-interpolation, müssen Sie doppelte Anführungszeichen verwenden, ODER die string-Verkettung (oder eine Kombination da von). Sehen http://php.net/manual/en/language.types.string.php für weitere Informationen.
Außerdem sollten Sie überprüfen, dass mysql_query zurückgegebenen einem gültigen Ergebnis-resource, sonst fetch_*, num_rows, etc funktioniert nicht auf das Ergebnis als kein Ergebnis! IE:
http://us.php.net/manual/en/function.mysql-query.php für weitere Informationen.
InformationsquelleAutor derokorian
Diese Abfrage sollte funktionieren:
Das problem ist, einzelne Zitate, damit Ihre Abfrage schlägt fehl und gibt FALSE zurück, und Ihre WHILE-Schleife nicht ausführen kann. Mit % können Sie zu übereinstimmenden Ergebnisse mit Ihrer Zeichenfolge (wie SomeText-$username-SomeText).
Dies ist einfach eine Antwort auf Ihre Frage, die Sie umsetzen sollten, Sachen erwähnt, die in den anderen posts: Fehlerbehandlung, escape-Zeichenfolgen (Benutzer können geben Sie nichts in das Feld, und Sie MÜSSEN stellen Sie sicher, es ist nicht willkürlich code), verwenden Sie PDO statt mysql_connect, die jetzt ist depricated.
InformationsquelleAutor Enis P. Aginić
Manchmal unterdrücken Sie die Abfrage als
@mysql_query(your query);
InformationsquelleAutor Dip Pokhrel
Wenn Sie versucht haben alles hier, und es funktioniert nicht, möchten Sie vielleicht, um Ihre MySQL-Datenbank-Sortierung. Mir wurde auf einem schwedischen Sortierung. Dann habe ich es geändert
utf8_general_ci
und alles nur geklickt in Gang.Ich hoffe, das jemand hilft.
InformationsquelleAutor kolexinfos
Statt über eine WHERE-Abfrage, können Sie diese verwenden, UM DURCH die Abfrage. Es ist weit besser, als dies für die Verwendung einer Abfrage.
Habe ich dies getan Abfrage und erhalte keine Fehler, wie parameter oder boolean.
htmlspecialchars()
bei der Verwendung von beliebigen Daten, die im Rahmen von HTML. Ansonsten, Sie riskieren die Schaffung von gültigem HTML-Code, wenn reservierte Zeichen sind in den Daten verwendet wird.InformationsquelleAutor Gears.of.Codes
Versuchen Sie dieses, es muss funktionieren, ansonsten müssen Sie zum drucken der Fehlermeldung angeben Ihr problem
+1. @deceze ja, es ist weit offen. Aber nicht mehr so, dass die OP ' s oder der akzeptierten Beantworter code 😉 Und es ist nicht das fehlende Fehler Umgang in der OP-code den Fehler verursacht... es ist
LIKE
Ausdruck).+1 fügen Sie Bitte ein Leerzeichen zwischen WIE und '$username', der rest scheint in Ordnung zu sein, außer der SQL-Injektion. Warum nicht = statt LIKE-operator Benutzername muss genau abgestimmt
InformationsquelleAutor Amjad Omari
Versuchen Sie den folgenden code. Es kann aber funktionieren.
InformationsquelleAutor ravi
Möglicherweise gibt es zwei Gründe:
Haben Sie geöffnet, die Verbindung zur Datenbank vor dem Aufruf von mysql_query-Funktion? Ich sehe nicht, dass in Ihrem code. Verwenden mysql_connect, bevor Sie die Abfrage. Sehen
php.net/manual/en/function.mysql-connect.php
Die variable $username verwendet wird, innerhalb eines single quote string, so wird Ihr Wert nicht beurteilt werden innerhalb der Abfrage. Die Abfrage wird auf jeden Fall scheitern.
Drittens, die Struktur der query ist anfällig für SQL-injection. Sie können die Verwendung von vorbereiteten Anweisungen zu vermeiden, diese Bedrohung für die Sicherheit.
InformationsquelleAutor asim-ishaq
Gehen Sie zu Ihrem
config.php
. Ich hatte das gleiche problem. Überprüfen Sie den Benutzernamen und das Passwort ein, und auch sql-select ist der gleiche name wie die Datei config.InformationsquelleAutor user2835116
Und wenn es ein Benutzer mit einem eindeutigen Benutzernamen, den Sie verwenden können, " = " für, die. Es gibt keine Notwendigkeit, Sie zu mögen.
Ihre Anfrage:
Warum dieser code ist weit offen für sql-injection?
Dieser code nimmt die direkte Eingabe, und verkettet Sie in der Abfrage. Jemand könnte schreiben Ihre eigenen SQL in die post-Daten für
username
und es wird ausgeführt.So was zu verwenden, um zu verhindern, dass der code von SQL-injection?
InformationsquelleAutor Janak Prajapati
Umfassen eine Verbindung string-variable vor der MySQL-Abfrage. Zum Beispiel
$connt
in diesem code:InformationsquelleAutor Durairaj
Nicht die depricated mysql_* - Funktion (depricated in php 5.5 entfernt werden php 7). und Sie können diese mit mysqli oder pdo
hier ist die komplette select-Abfrage
InformationsquelleAutor Manoj Kumar
Versuchen, Diese
InformationsquelleAutor Suresh Ratten
Erste, überprüfen Sie Ihre Verbindung zur Datenbank. Ist es erfolgreich verbunden oder nicht?
Wenn es fertig ist, dann nach, dass ich geschrieben habe diesen code, und es funktioniert gut:
InformationsquelleAutor
InformationsquelleAutor Dennis Kiptugen
Jeder Zeit erhalten Sie das...
...es ist wahrscheinlich, weil es ein Problem mit Ihrer Anfrage. Die
prepare()
oderquery()
zurückkehren könnteFALSE
(a Boolean), aber diese generische Fehlermeldung nicht verlassen, Sie viel in der Art von hinweisen. Wie finden Sie heraus, was ist falsch an der Abfrage? Sie Fragen!Zunächst stellen Sie sicher, dass die Fehlerberichterstattung ist aktiviert und sichtbar: fügen Sie diese beiden Zeilen an den Anfang der Datei(en) direkt nach dem öffnen
<?php
tag:Wenn Ihr error reporting in der php.ini, die Sie nicht zu kümmern. So stellen Sie sicher behandeln von Fehlern, die sich anmutig und niemals die wahre Ursache der Probleme für Ihre Benutzer. Enthüllt die wahre Ursache der öffentlichkeit kann eine gold gravierte Einladung für diejenigen, die zu Schaden Ihre Websites und Server. Wenn Sie nicht wollen, senden Sie Fehler an den browser können Sie immer überwachen Sie Ihre web-server-Fehlerprotokolle. Log-Standorten variiert von server zu server z.B. unter Ubuntu die Fehler-Logdatei befindet sich normalerweise unter
/var/log/apache2/error.log
. Wenn Sie untersuchen, Fehlerprotokolle in einer Linux-Umgebung können Sie verwendentail -f /path/to/log
in einem Konsole-Fenster, um zu sehen, Fehler, wie Sie auftreten, in Echtzeit....oder wie Sie Sie machen.Einmal bist du squared entfernt auf standard-error-reporting hinzufügen, auf Fehler überprüft Ihre Datenbank-Verbindung und Abfragen wird Ihnen viel mehr Details über die Probleme Los. Haben Sie einen Blick auf dieses Beispiel, wo die Spalte name ist ungültig. Erstens, der code gibt die generische fatal error Nachricht:
Der Fehler ist allgemein und nicht sehr hilfreich, um Sie bei der Lösung, was Los ist.
Mit ein paar mehr Zeilen code können Sie erhalten sehr detaillierte Informationen, die Sie verwenden können, um das Problem zu lösen sofort. Überprüfen Sie die
prepare()
Anweisung für truthiness und wenn es gut ist, können Sie fortfahren, zu binden und ausführen.Wenn etwas falsch ist, können Sie spuckte eine Fehlermeldung, die Sie direkt zu dem Problem. In diesem Fall gibt es keine
foo
Spalte in der Tabelle, die Lösung des Problems ist trivial.Wenn Sie sich entscheiden, Sie können diese Prüfung in eine Funktion oder Klasse und erweitern Sie durch die Bearbeitung der Fehler anmutig wie zuvor erwähnt.
InformationsquelleAutor Jay Blanchard
Wenn Sie mit mehreren Abfragen in einem script, auch Sie sind darunter auch andere Seiten, die enthält Abfragen oder Datenbank-Verbindung, dann könnte es möglich sein, dass an jedem Ort, den Sie verwenden db_close (), schließen Sie Ihre Datenbank-Verbindung so stellen Sie sicher, dass Sie nicht tun, diese Fehler in Ihren Skripten.
InformationsquelleAutor A.Aleem11
Überprüfen Sie Ihre Verbindung ersten.
Dann, wenn Sie Holen wollen, den genauen Wert aus der Datenbank, dann sollten Sie schreiben:
Oder Sie abholen wollen die
LIKE
Typ des Wertes, dann sollten Sie schreiben:InformationsquelleAutor Omdev
Wenn Sie haben noch keine MySQL-Fehler erscheint während der Prüfung, stellen Sie sicher, dass Sie ordnungsgemäß erstellt Ihre Datenbank-Tabelle. Dies geschah zu mir. Suchen Sie für jede unerwünschte Kommas oder Anführungszeichen.
InformationsquelleAutor user1012181
Können Sie auch prüfen, ob
$result
versagt wie so, vor der Ausführung der fetch-arrayAber wenn der code funktioniert, ich glaube, Sie sollten den code Bearbeiten und geben Sie den gewünschten Filter statt castigating der code.
Einfache Verwendung von filtern nicht beheben, was falsch ist mit diesem code. Die beste Lösung ist die Verwendung vorbereitet/parametrisierte Abfragen mit PDO oder ähnliches. Ich sehe keinen Punkt in der Befestigung, als die korrekte Antwort wurde bereits gepostet hier. Im Idealfall, diese Antwort wird gelöscht. Sie sind jedoch willkommen, um fixieren Sie Ihre Antwort, und ich werde glücklich bis Sie Ihre Stimme, wenn es korrekt ist.
Nun, wenn Sie glauben, die Antwort ist nicht eine überlegung Wert, können Sie voran gehen und bekommen, Lesen Sie es. Ich dachte jedoch, dass der ganze Sinn dieser Gemeinschaft zu teilen und zu tragen wissen. Wenn Sie etwas zu teilen anstatt zu zeigen, und die Gefährdung von Personen aus.
Sie sind richtig, der Sinn dieser Gemeinschaft ist es, wissen zu teilen. Das ist, warum hinzugefügte Erklärung mit meinen downvote und weiter erklärt, warum Sie Ihre filter-Vorschlag war nicht ausreichend. Ich würde viel lieber warnt Sie, zusammen mit jemand anders, der findet die Antwort, dass der obige code ist unsicher. Es ist für alle besser, zu lernen, die richtigen Methoden, anstatt zu verewigen, schlechten code. Und ich kann nicht löschen Sie Ihre Antwort, noch würde I. Das ist bis zu Ihnen, wenn Sie wählen, dies zu tun.
InformationsquelleAutor user28864
Können Sie versuchen, diesen code. Ich fand es früher war, wenn ich ein problem ähnlich wie bei Ihnen.
InformationsquelleAutor Mithun Debnath
In der Regel ein Fehler tritt auf, wenn Ihre database conectivity fehl, so stellen Sie sicher, dass Ihre Datenbank oder die Datenbank-Datei.
ODER
mysql_query($query_variable);
.Haben Sie falsche Zitate in Ihrer beider code-Beispiele. Die syntax-Hervorhebung angewandt, um Ihre zweite code-block ist ein tot give-away, dass etwas falsch ist
Dieser code ist unter SQL-Injektion und sollte nicht verwendet werden. @EngrZardari wenn Sie mit diesem code auf Ihrer Produktionsanlagen, haben Sie zweifellos gehackt worden und soll Abhilfe zu kaufen, mit vorbereitet/parametrisierte Abfragen mit PDO oder ähnliches. Es gibt bots, die automatisierte Tests für solche Schwachstellen.
Über Ihre "es ist kein Fehler, ich habe eingefügt, hier der code, welchen ich derzeit mit." comment oben. Es war ein fehlendes Anführungszeichen in der query, die ich korrigiert. Das hätte geworfen ein (PHP) - parse-Fehler.
InformationsquelleAutor Engr Zardari
Versuchen, diesen code es funktionieren
ordnen Sie die post-Variablen, um die variable
InformationsquelleAutor Ritesh d joshi