mysql_fetch_array () / mysql_fetch_assoc () / mysql_fetch_row () / mysql_num_rows usw.… erwartet, dass Parameter 1 eine Ressource ist

960

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'];
}
iamjonesy
quelle
15
Sie können nützlichere eroor msg erhalten mit :: QUERY oder die (mysql_error ());
Nik
123
Auch der obligatorische Hinweis: Ihr Code ist anfällig für SQL-Injection . Sie sollten die Benutzereingaben validieren und / oder umgehen. Schau es dir an mysql_real_escape_string. Vertraue niemals Benutzerdaten.
Felix Kling
7
Tatsächlich verursacht der OP-Code einen Syntaxfehler auf dem MySQL-Server, ist jedoch zumindest nicht anfällig für SQL Injection, da einfache Anführungszeichen keine variable Interpolation aufweisen.
Szgal
4
@FelixKling Mir ist klar, dass dies sehr alt und zu diesem Zeitpunkt wahrscheinlich das genaueste ist, aber Ihr Kommentar ist jetzt in einer Hinsicht gefährlich falsch: Ist nicht das A und O mysql_real_escape_stringdes 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.
Fund Monica Klage
2
Gah. Es war eine schlechte Idee, diese Frage auf MySQLi und PDO auszudehnen. Sie haben jeweils ihre eigene, leicht unterschiedliche Syntax und Fehlermeldungen, und sie hätten durchaus ihre eigenen Fragen haben können. Wenn Sie alles zu einer riesigen dreiteiligen Frage zusammenfassen, wird dies weniger googleable und zwingt die Leute, die hier ankommen, durch irrelevante Inhalte zu waten, um zu dem zu gelangen, was sie wollen. Es hat auch viele der folgenden Antworten ungültig gemacht und macht diese Frage nach den Standards, die wir normalerweise anwenden, "zu breit". Meiner Meinung nach ist es ein Chaos, aber es ist zu spät, um es jetzt zu beheben.
Mark Amery

Antworten:

667

Eine Abfrage kann aus verschiedenen Gründen fehlschlagen. In diesem Fall kehren sowohl die Erweiterung mysql_ * als auch die Erweiterung mysqli falsevon ihren jeweiligen Abfragefunktionen / -methoden zurück. Sie müssen diesen Fehlerzustand testen und entsprechend behandeln.

mysql_ * Erweiterung :

HINWEIS Die mysql_ Funktionen sind veraltet und wurden in PHP - Version 7 entfernt.

Überprüfen Sie dies, $resultbevor Sie es weiterleiten mysql_fetch_array. Sie werden feststellen, dass falsedie Abfrage fehlgeschlagen ist. In der mysql_queryDokumentation finden Sie mögliche Rückgabewerte und Vorschläge zum Umgang damit.

$username = mysql_real_escape_string($_POST['username']);
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '$username'");

if($result === FALSE) { 
    die(mysql_error()); // TODO: better error handling
}

while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}


Verfahrensstil der mysqli-Erweiterung :

$username = mysqli_real_escape_string($mysqli, $_POST['username']);
$result = mysqli_query($mysqli, "SELECT * FROM Users WHERE UserName LIKE '$username'");

// mysqli_query returns false if something went wrong with the query
if($result === FALSE) { 
    yourErrorHandler(mysqli_error($mysqli));
}
else {
    // as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach
    foreach( $result as $row ) {
        ...

oo-style :

$username = $mysqli->escape_string($_POST['username']);
$result = $mysqli->query("SELECT * FROM Users WHERE UserName LIKE '$username'");

if($result === FALSE) { 
    yourErrorHandler($mysqli->error); // or $mysqli->error_list
}
else {
    // as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach
    foreach( $result as $row ) {
      ...

mit einer vorbereiteten Aussage:

$stmt = $mysqli->prepare('SELECT * FROM Users WHERE UserName LIKE ?');
if ( !$stmt ) {
    yourErrorHandler($mysqli->error); // or $mysqli->error_list
}
else if ( !$stmt->bind_param('s', $_POST['username']) ) {
    yourErrorHandler($stmt->error); // or $stmt->error_list
}
else if ( !$stmt->execute() ) {
    yourErrorHandler($stmt->error); // or $stmt->error_list
}
else {
    $result = $stmt->get_result();
    // as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach
    foreach( $result as $row ) {
      ...

Diese Beispiele veranschaulichen nur, was zu tun ist (Fehlerbehandlung), nicht wie es zu tun ist. Produktionscode sollte or diebei 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 .

Edward Dale
quelle
9
Richtig, aber die Verwendung eines Würfels (), wenn die Abfrage fehlschlägt, ist etwas zu viel.
2ndkauboy
28
Ich wollte einen vollständigen Fehlerbehandlungsmechanismus für das OP entwerfen, entschied jedoch, dass dies den Rahmen meiner Antwort sprengen könnte.
Edward Dale
@ scompt.com Ja, es wird auch in mehreren anderen Antworten behandelt. Ich denke, ich habe nur darauf hingewiesen, dass dies (IMHO) tatsächlich die spezifische Frage beantworten sollte , da dies die akzeptierte Antwort auf eine Frage mit hoher Sichtbarkeit ist, zusätzlich zu den (ausgezeichneten) Ratschlägen, wie Fehler in Zukunft richtig erkannt werden können erklären, warum in diesem Fall ein Fehler vorliegt).
September
2
Anstelle von können if($result === FALSE)Sie verwenden if(! $result). Korrigieren Sie mich, wenn ich falsch
liege
1
mysql_query (): Die mysql-Erweiterung ist veraltet und wird in Zukunft entfernt: benutze mysqli
Greg
165

Diese 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:

    mysql_connect($host, $username, $password) or die("cannot connect"); 
    mysql_select_db($db_name) or die("cannot select DB");
    
    $sql = "SELECT * FROM table_name";
    $result = mysql_query($sql);
    
    if (false === $result) {
        echo mysql_error();
    }
  • 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_*und mysql_*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 .

John Conde
quelle
1
Angesichts dieser Frage heute stackoverflow.com/q/43804651/1415724 und andere ähnliche in letzter Zeit; Ich denke, es kann sich lohnen, Ihre Antwort so zu aktualisieren, dass sie Folgendes enthält: "Dieser Fehler kann auch dadurch verursacht werden, dass die Abfrage nicht mit mysql_query()/ mysqli_query($connection)usw. ausgeführt wird." ;; Gedanken? Da keine anderen Antworten in diesem Q & A dies erwähnen.
Funk Forty Niner
111

Der hier aufgetretene Fehler war auf die Verwendung von einfachen Anführungszeichen ( ') zurückzuführen. Sie können Ihre Anfrage folgendermaßen stellen:

mysql_query("
SELECT * FROM Users 
WHERE UserName 
LIKE '".mysql_real_escape_string ($username)."'
");

Es wird mysql_real_escape_stringzur 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 reicht mysql_real_escape_stringdies aus.

nik
quelle
5
Warum Rauschen mit Zeichenfolgenverkettung hinzufügen, anstatt nur die Variable in die Abfragezeichenfolge einzufügen?
Matteo Riva
1
@Matteo Riva Ja, aber ich dachte, dies ist eine etwas sauberere Möglichkeit, Variablen von Zeichenfolgen zu trennen. :)
Nik
60

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:

$username = $_POST['username'];
$password = $_POST['password'];

$result = mysql_query("
SELECT * FROM Users 
WHERE UserName LIKE '".mysql_real_escape_string($username)."'
");

if($result)
{
    while($row = mysql_fetch_array($result))
    {
        echo $row['FirstName'];
    }
} else {
    echo 'Invalid query: ' . mysql_error() . "\n";
    echo 'Whole query: ' . $query; 
}

Weitere Informationen finden Sie in der Dokumentationmysql_query() .

Der eigentliche Fehler waren die einfachen Anführungszeichen, damit die Variable $usernamenicht analysiert wurde. Aber Sie sollten wirklich verwenden mysql_real_escape_string($username), um SQL-Injektionen zu vermeiden.

2ndkauboy
quelle
52

Setzen Sie Anführungszeichen $username. Zeichenfolgenwerte müssen im Gegensatz zu numerischen Werten in Anführungszeichen gesetzt werden.

$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '$username'");

Es macht auch keinen Sinn, die LIKEBedingung zu verwenden, wenn Sie keine Platzhalter verwenden: Wenn Sie eine genaue Übereinstimmung benötigen, verwenden Sie =stattdessen LIKE.

Matteo Riva
quelle
1
Und was ist, wenn $ username lautet: "'; DROP TABLES;" ? Dies ist der Vorteil der Verwendung vorbereiteter Anweisungen und gebundener Werte, die der Fragesteller meiner Meinung nach gerne beibehalten würde.
HoldOffHunger
42

Bitte überprüfen Sie, ob die ausgewählte Datenbank nicht ausgewählt ist, da manchmal die Datenbank nicht ausgewählt ist

Prüfen

mysql_select_db('database name ')or DIE('Database name is not available!');

vor der MySQL-Abfrage und dann mit dem nächsten Schritt fortfahren

$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');

f($result === FALSE) {
    die(mysql_error());
Yasin
quelle
40

Ihr Code sollte ungefähr so ​​sein

$username = $_POST['username'];
$password = $_POST['password'];
$query = "SELECT * FROM Users WHERE UserName LIKE '$username'";
echo $query;
$result = mysql_query($query);

if($result === FALSE) {
    die(mysql_error("error message for the user")); 
}

while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}

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.

Chaitannya
quelle
3
Verwenden Sie diesen Code nicht. Es ist offen für SQL-Injection-Angriffe.
Brad
34
$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');

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:

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');

if( $result === FALSE ) {
   trigger_error('Query failed returning error: '. mysql_error(),E_USER_ERROR);
} else {
   while( $row = mysql_fetch_array($result) ) {
      echo $row['username'];
   }
}

Weitere Informationen finden Sie unter http://us.php.net/manual/en/function.mysql-query.php .

derokorian
quelle
2
Verwenden Sie diesen Code nicht, auch wenn Sie Anführungszeichen hinzufügen. Es ist offen für SQL-Injection-Angriffe.
Brad
33

Diese Abfrage sollte funktionieren:

$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'");
while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}

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.

Enis P. Aginić
quelle
28
$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'") or die(mysql_error());

while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}

Manchmal wird die Abfrage als unterdrückt @mysql_query(your query);

Tauchen Sie Pokhrel ein
quelle
2
Verwenden Sie diesen Code nicht. Es ist offen für SQL-Injection-Angriffe.
Brad
27

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_ciund alles hat einfach einen Gang eingelegt.

kolexinfos
quelle
25
$query = "SELECT Name,Mobile,Website,Rating FROM grand_table order by 4";

while( $data = mysql_fetch_array($query))
{
    echo("<tr><td>$data[0]</td><td>$data[1]</td><td>$data[2]</td><td>$data[3]</td></tr>");      
}

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.

Gears.of.Codes
quelle
Denken Sie daran, 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.
Brad
25

Versuchen Sie dies, es muss funktionieren, andernfalls müssen Sie den Fehler drucken, um Ihr Problem anzugeben

$username = $_POST['username'];
$password = $_POST['password'];

$sql = "SELECT * from Users WHERE UserName LIKE '$username'";
$result = mysql_query($sql,$con);

while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}
Amjad Omari
quelle
8
1) Weit offen für SQL-Injection, 2) beinhaltet keine Fehlerbehandlung, die den Fehler im Fall von OP verursacht.
Täuschung
+1. @deceze Ja, es ist weit offen. Aber nicht mehr , so dass die OPs oder der Code des akzeptierten Antworter ;-) Und es ist nicht der Mangel an Fehlern Handhabung im Code der OP des Fehler verursacht ... es ist der Fehler , und diese Antwort zumindest versucht , das zu lösen (indem einzelne Anführungszeichen um das Zeichenfolgenliteral im LIKEAusdruck).
September
1
+1 Bitte fügen Sie ein Leerzeichen zwischen LIKE und '$ username' ein. Der Rest scheint in Ordnung zu sein, mit Ausnahme der SQL-Injection. Warum nicht verwenden = anstelle von LIKE Operator Benutzername muss genau übereinstimmen
asim-ishaq
21

Es kann zwei Gründe geben:

  1. 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. Sehenphp.net/manual/en/function.mysql-connect.php

  2. 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.

asim-ishaq
quelle
20

Versuchen Sie den folgenden Code. Es kann gut funktionieren.

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName ='$username'");

while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}
Ravi
quelle
4
Dieser Code unterliegt der SQL-Injection und sollte nicht verwendet werden.
Brad
15

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.

user2835116
quelle
15

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

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

$sql = "SELECT id, firstname, lastname FROM MyGuests";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
    // output data of each row
    while($row = $result->fetch_assoc()) {
        // code here 
    }
} else {
    echo "0 results";
}
$conn->close();
?>
Manoj Kumar
quelle
Ihr Beitrag behandelt nicht die in der Frage angesprochenen Probleme, bei denen es sich um eine ungültige Abfrage und eine unzureichende Fehlerberichterstattung handelt. Dieser Beitrag ist nicht zum Thema.
Paul Spiegel
14
<?php
    $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'];
    }
?>

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:

mysql_query("SELECT * FROM Users WHERE UserName ='".$username."'");
Janak Prajapati
quelle
3
Dieser Code ist offen für SQL-Injection und sollte nicht verwendet werden.
Brad
@AnujGarg Dieser Code nimmt direkte Eingaben entgegen und verkettet sie mit der Abfrage. Jemand könnte sein eigenes SQL in die Post-Daten für schreiben usernameund es wird ausgeführt.
Brad
Was ist also zu verwenden, um zu verhindern, dass der Code SQL injiziert?
Anuj Garg
14

Fügen Sie vor der MySQL-Abfrage eine Verbindungszeichenfolgenvariable ein. Zum Beispiel $conntin diesem Code:

$results = mysql_query($connt, "SELECT * FROM users");
Durairaj
quelle
1
Dies geht nicht auf die Probleme in der Frage ein. Es ist auch falsch und würde einen weiteren Fehler auslösen.
Paul Spiegel
12

Jedes Mal, wenn Sie die ...

"Warnung: mysqli_fetch_object () erwartet, dass Parameter 1 mysqli_result ist, boolescher Wert"

... es ist wahrscheinlich, weil es ein Problem mit Ihrer Anfrage gibt. Das prepare()oder query()könnte zurückkehren FALSE(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 <?phpTags oben in Ihre Datei (en) ein :

error_reporting(E_ALL);
ini_set('display_errors', 1);

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 Sie tail -f /path/to/login 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:

$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
$query = $mysqli->prepare($sql)); // assuming $mysqli is the connection
$query->bind_param('s', $definition);
$query->execute();

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.

$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";
if($query = $mysqli->prepare($sql)) { // assuming $mysqli is the connection
    $query->bind_param('s', $definition);
    $query->execute();
    // any additional code you need would go here.
} else {
    $error = $mysqli->errno . ' ' . $mysqli->error; // 1054 Unknown column 'foo' in 'field list'
    // handle error
}

Wenn etwas nicht stimmt, können Sie eine Fehlermeldung ausspucken, die Sie direkt zum Problem führt. In diesem Fall gibt es keine fooSpalte 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.

Jay Blanchard
quelle
2
Wie können Sie schreiben: "Stellen Sie einfach sicher, dass Sie mit Fehlern ordnungsgemäß umgehen und Ihren Benutzern niemals die wahre Ursache von Problemen mitteilen." und echo $error;in einem Beitrag?
Paul Spiegel
Vielen Dank für das Heads-up @PaulSpiegel. Es ist eine Weile her, seit ich die Antwort geschrieben oder überarbeitet habe und übersehen habe, dass ich das Echo dort gelassen habe.
Jay Blanchard
11
<?php
      $username = $_POST['username'];
       $password = $_POST['password'];

     $result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '".mysql_real_escape_string($username)."'")or die(mysql_error());
while($row=mysql_fetch_array($result))
  {
 echo $row['FirstName'];
 }
 ?>
Dennis Kiptugen
quelle
11

Versuche dies

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysqli_query('SELECT * FROM Users WHERE UserName LIKE $username');

if($result){
while($row = mysqli_fetch_array($result))
{
    echo $row['FirstName'];
}
}
SuReSh
quelle
4
@panjehra mysql_ * ist jetzt beraubt und wird aus PHP 7 entfernt. Verwenden Sie stattdessen mysqli_ *
Manoj Kumar
9

Ü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:

if (isset($_GET['q1mrks']) && isset($_GET['marks']) && isset($_GET['qt1'])) {
    $Q1mrks = $_GET['q1mrks'];
    $marks = $_GET['marks'];
    $qt1 = $_GET['qt1'];

    $qtype_qry = mysql_query("
        SELECT *
        FROM s_questiontypes
        WHERE quetype_id = '$qt1'
    ");
    $row = mysql_fetch_assoc($qtype_qry);
    $qcode = $row['quetype_code'];

    $sq_qry = "
        SELECT *
        FROM s_question
        WHERE quetype_code = '$qcode'
        ORDER BY RAND() LIMIT $Q1mrks
    ";
    $sq_qry = mysql_query("
        SELECT *
        FROM s_question
        WHERE quetype_code = '$qcode'
        LIMIT $Q1mrks
    ");
    while ($qrow = mysql_fetch_array($sq_qry)) {
        $qm = $qrow['marks'] . "<br />";
        $total += $qm . "<br />";
    }
    echo $total . "/" . $marks;
}
Peter Mortensen
quelle
2
Verwenden Sie diesen Code nicht. Es ist offen für SQL-Injection-Angriffe.
Brad
9

Stellen Sie sicher, dass Sie die Datenbank nicht schließen, indem Sie db_close () verwenden, bevor Sie Ihre Abfrage ausführen:

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.

A.Aleem11
quelle
8

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.

user1012181
quelle
7

Überprüfen Sie zuerst Ihre Verbindung.

Wenn Sie dann den genauen Wert aus der Datenbank abrufen möchten, sollten Sie Folgendes schreiben:

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName =`$usernam`");

Oder Sie möchten den Werttyp LIKEabrufen, dann sollten Sie schreiben:

$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'");
Omdev
quelle
3
Dieser Code ist offen für SQL-Injection und sollte nicht verwendet werden.
Brad
6

Sie können auch überprüfen, ob dies $resultfehlschlägt, bevor Sie das Abrufarray ausführen

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');
if(!$result)
{
     echo "error executing query: "+mysql_error(); 
}else{
       while($row = mysql_fetch_array($result))
       {
         echo $row['FirstName'];
       }
}
user28864
quelle
3
Verwenden Sie diesen Code nicht. Es ist offen für SQL-Injection-Angriffe.
Brad
Aber wenn der Code funktioniert, sollten Sie den Code bearbeiten und die erforderlichen Filter eingeben, anstatt den Code zu kritisieren.
user28864
Durch die einfache Verwendung von Filtern wird nicht behoben, was mit diesem Code nicht stimmt. Die beste Lösung besteht darin, vorbereitete / parametrisierte Abfragen mit PDO oder ähnlichem zu verwenden. Ich sehe keinen Grund, dies zu beheben, da die richtige Antwort bereits hier veröffentlicht wurde. Im Idealfall wird diese Antwort gelöscht. Sie können jedoch gerne Ihre Antwort korrigieren, und ich werde sie gerne abstimmen, wenn sie korrekt ist.
Brad
Wenn Sie der Meinung sind, dass die Antwort nicht erwägenswert ist, können Sie sie lesen. Ich dachte jedoch, der Sinn dieser Community sei es, Wissen zu teilen und beizutragen. Wenn Sie etwas zu teilen haben, anstatt Leute zu zeigen und abzuschrecken.
user28864
2
Sie haben Recht, der springende Punkt dieser Community ist es, Wissen zu teilen. Aus diesem Grund habe ich mit meiner Ablehnung eine Erklärung hinzugefügt und weiter erklärt, warum Ihr Filtervorschlag nicht ausreichte. Ich würde Sie und alle anderen, die Ihre Antwort finden, lieber darauf aufmerksam machen, dass der obige Code unsicher ist. Es ist besser für alle, die richtigen Methoden zu lernen, als schlechten Code aufrechtzuerhalten. Und ich kann Ihre Antwort nicht löschen, und ich auch nicht. Das liegt an Ihnen, wenn Sie sich dafür entscheiden.
Brad
4

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.

include_once(db_connetc.php');

ODER

// Create a connection
$connection = mysql_connect("localhost", "root", "") or die(mysql_error());

//Select database
mysql_select_db("db_name", $connection) or die(mysql_error());

$employee_query = "SELECT * FROM employee WHERE `id` ='".$_POST['id']."'";

$employee_data = mysql_query($employee_query);

if (mysql_num_rows($employee_data) > 0) {

    while ($row = mysql_fetch_array($employee_data)){
        echo $row['emp_name'];
    } // end of while loop
} // end of if
  • Es wird empfohlen, die Abfrage in sqlyog auszuführen und sie dann in Ihren Seitencode zu kopieren.
  • Speichern Sie Ihre Abfrage immer in einer Variablen und geben Sie diese Variable dann wieder. Dann weiter zu mysql_query($query_variable);.
Engr. Zardari
quelle
2
1) Sie wissen nicht, ob ich hier oben oder unten über eine Antwort abgestimmt habe oder nicht. 2) Wie ich in meinem ersten Kommentar erklärt habe; Ihre Antwort bezieht sich nicht auf das Problem ( Boolescher Wert an mysql_fetch_array übergeben ) und Sie haben Syntaxfehler
Phil
2
Sie haben in beiden Codebeispielen falsche Anführungszeichen. Die Syntaxhervorhebung, die auf Ihren zweiten Codeblock angewendet wird, ist ein totes Zeichen dafür, dass etwas nicht stimmt
Phil
4
Dieser Code unterliegt der SQL-Injection und sollte nicht verwendet werden. @EngrZardari Wenn Sie diesen Code auf Ihren Produktionssystemen verwenden, wurden Sie zweifellos gehackt und sollten die Kaufsituation durch vorbereitete / parametrisierte Abfragen mit PDO oder ähnlichem beheben. Es gibt Bots, die automatisierte Tests auf solche Schwachstellen durchführen.
Brad
1
@EngrZardari Über Ihr "Es gibt keinen Fehler, ich habe hier Code eingefügt, den ich derzeit verwende." Kommentar oben. In der Abfrage fehlte ein Zitat, das ich korrigierte. Das hätte einen (PHP) Analysefehler ausgelöst.
Funk Forty Niner
2

Versuchen Sie diesen Code, es funktioniert gut

Weisen Sie der Variablen die Post-Variable zu

   $username = $_POST['uname'];

   $password = $_POST['pass'];

  $result = mysql_query('SELECT * FROM userData WHERE UserName LIKE $username');

if(!empty($result)){

    while($row = mysql_fetch_array($result)){
        echo $row['FirstName'];
     }
}
Ritesh d Joshi
quelle
3
Dieser Code unterliegt SQL-Injection-Angriffen und sollte nicht verwendet werden.
Brad
1

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. "').

$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'];
     }

$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'];
     }

Die Verwendung von MySQL hat jedoch stark abgenommen. Verwenden Sie stattdessen PDO. Es ist einfach, aber sehr sicher

Dennis Kiptugen
quelle
Aber die Nutzung von MySQL hat abgenommen. Sie können stattdessen PDO verwenden. Lassen Sie mich Ihnen ein Beispiel-Login geben.
Dennis Kiptugen
2
Passwörter sollten NIEMALS im Klartext gespeichert werden. Verwenden Sie die integrierten Funktionen von PHP, um mit dem Hashing von Passwörtern und der Überprüfung von gehashten Passwörtern umzugehen!
SpacePhoenix