1002 Stimmen

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

Ich versuche, Daten aus einer MySQL-Tabelle auszuwählen, aber ich erhalte eine der folgenden Fehlermeldungen:

mysql_fetch_array() erwartet, dass Parameter 1 eine Ressource ist, die boolesch ist

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

15 Stimmen

Sie können weitere nützliche eroor msg erhalten, indem Sie:: QUERY oder die(mysql_error());

124 Stimmen

Auch der obligatorische Hinweis: Ihr Code ist anfällig für SQL-Einschleusung . Sie sollten die Benutzereingaben validieren und/oder ausblenden. Werfen Sie einen Blick auf mysql_real_escape_string . Vertrauen Sie niemals auf Benutzerdaten.

7 Stimmen

Eigentlich wird der Code des OPs einen Syntaxfehler auf dem MySQL-Server verursachen, aber zumindest ist er pas anfällig für SQL Injection, da bei einfachen Anführungszeichen keine Variableninterpolation möglich ist.

15voto

user2835116 Punkte 159

Gehen Sie zu Ihrem config.php . Ich hatte das gleiche Problem. Überprüfen Sie den Benutzernamen und das Passwort, und auch Sql Select ist der gleiche Name wie die Konfiguration.

14voto

Durairaj Punkte 149

Fügen Sie eine Verbindungsstring-Variable vor der MySQL-Abfrage ein. Zum Beispiel, $connt in diesem Code:

$results = mysql_query($connt, "SELECT * FROM users");

1 Stimmen

Dies geht nicht auf die in der Frage angesprochenen Probleme ein. Es ist außerdem falsch und würde einen weiteren Fehler verursachen.

14voto

Manoj Dhiman Punkte 5014

Verwenden Sie nicht die deprivierte mysql_* Funktion (depriviert in php 5.5 wird in php 7 entfernt). und Sie können dies mit mysqli o pdo

Hier ist die vollständige Select-Abfrage

<?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();
?>

0 Stimmen

Ihr Beitrag geht nicht auf die in der Frage angesprochenen Probleme ein, nämlich eine ungültige Abfrage und eine unzureichende Fehlerberichterstattung. Dieser Beitrag ist themenfremd.

13voto

Janak Prajapati Punkte 836
<?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 ist nicht nötig, wie.

Ihre Anfrage wird lauten:

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

3 Stimmen

Dieser Code ist sehr anfällig für SQL-Injection und sollte nicht verwendet werden.

0 Stimmen

@AnujGarg Dieser Code nimmt direkte Eingaben und fügt sie in die Abfrage ein. Jemand könnte sein eigenes SQL in die Postdaten schreiben für username und sie wird ausgeführt.

0 Stimmen

Was ist also zu verwenden, um den Code vor SQL-Injection zu schützen?

11voto

Jay Blanchard Punkte 33432

Jedes Mal, wenn Sie die...

"Warning: mysqli_fetch_object() erwartet, dass Parameter 1 mysqli_result, boolean given ist"

...liegt es wahrscheinlich daran, dass es ein Problem mit Ihrer Anfrage gibt. Die prepare() o query() könnte zurückkehren FALSE (ein Boolescher Wert), aber diese allgemeine Fehlermeldung gibt nicht viele Anhaltspunkte. Wie können Sie herausfinden, was mit Ihrer Abfrage nicht stimmt? Sie fragen Sie !

Vergewissern Sie sich zunächst, dass die Fehlerberichterstattung eingeschaltet und sichtbar ist: Fügen Sie diese beiden Zeilen am Anfang Ihrer Datei(en) direkt nach dem Öffnen ein <?php Tag:

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

Wenn die Fehlerberichterstattung in der php.ini eingestellt wurde, müssen Sie sich darüber keine Gedanken machen. Achten Sie nur darauf, dass Sie Fehler anständig behandeln und Ihren Nutzern niemals die wahre Ursache von Problemen offenbaren. Die Offenlegung der wahren Ursache kann eine Einladung für diejenigen sein, die Ihren Websites und Servern schaden wollen. Wenn Sie keine Fehler an den Browser senden wollen, können Sie jederzeit die Fehlerprotokolle Ihres Webservers überwachen. Die Speicherorte der Protokolle variieren von Server zu Server, z. B. befindet sich das Fehlerprotokoll unter Ubuntu normalerweise unter /var/log/apache2/error.log . Wenn Sie die Fehlerprotokolle in einer Linux-Umgebung untersuchen, können Sie tail -f /path/to/log in einem Konsolenfenster, um Fehler zu sehen, wenn sie in Echtzeit auftreten (....) oder wenn Sie sie machen.

Sobald Sie die Standard-Fehlerberichterstattung im Griff haben, können Sie durch Hinzufügen einer Fehlerprüfung für Ihre Datenbankverbindung und Ihre Abfragen viel mehr Details über die Probleme erfahren. Schauen Sie sich dieses Beispiel an, bei dem der Spaltenname falsch ist. Zunächst der Code, der die allgemeine fatale 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();

Die Fehlermeldung ist allgemein gehalten und nicht sehr hilfreich bei der Lösung des Problems.

Mit ein paar weiteren Codezeilen können Sie sehr detaillierte Informationen erhalten, die Sie zur Lösung des Problems verwenden können sofort . Prüfen Sie die prepare() Erklärung auf ihren Wahrheitsgehalt 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 foo Spalte in der Tabelle, ist die Lösung des Problems trivial.

Wenn Sie möchten, können Sie diese Prüfung in eine Funktion oder Klasse einbinden und sie um die bereits erwähnte elegante Fehlerbehandlung erweitern.

2 Stimmen

Wie kann man schreiben: "Stellen Sie sicher, dass Sie Fehler elegant behandeln und Ihren Benutzern niemals die wahre Ursache von Problemen offenbaren. echo $error; in einem einzigen Beitrag?

0 Stimmen

Danke für die Vorwarnung @PaulSpiegel. Es ist schon eine Weile her, dass ich die Antwort geschrieben oder überarbeitet habe, und ich hatte übersehen, dass ich das Echo dort drin gelassen hatte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X