[Mysql-PHP] mysql_fetch_??

  • Hallo,
    ich habe bei meinem mysql_query einen Fehler..
    Wenn ich die Daten aus der Datenbank in ein Array wandeln will, taucht immer dieser Fehler auf:
    Fehler:

    Code
    Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\blabla.php on line 32


    Code:

    PHP
    $abfrage = "SELECT username, passwort,admin_lvl,admin_kennung FROM home WHERE username = '$name' LIMIT 1";
    $ergebnis = mysql_query($abfrage);
    $row = mysql_fetch_array($ergebnis);


    Database:


    Muss ich bei dem mysql_fetch_ irgendetwas anderes hinschreiben, dass es funktioniert?
    Bitte um hilfe

    Mit freundlichen Grüßen,
    hundi :thumbup:


    "Wuff!, Wuff!"
    hundi, 2017

  • mysql_fetch_object


    damit hat das nichts zu tun... object ist nur eine weitere möglichkeit das später zu verweden:


    PHP
    $abfrage = "SELECT * FROM home WHERE username = '".$name."' LIMIT 1"; // Dein Query: * sagt nur er soll erstmal alles anwählen
    $ergebnis = mysql_query($abfrage);// sendet deinen Query ab
    $row = mysql_fetch_array($ergebnis);// fetcht das ergebnis 
    echo $row['username'];// gibt das Ergbnis dann aus: das ['username'] ist die spalte. Alternativ gehen auch alle anderen Spalten


    Ich würde aufgrund der Fehlermeldung aber mal sagen das dein Query einen Fehler hat


    // Edit:
    Um mal zu mysql_fetch_object zu kommen.. der Unterschied liegt eigentlich nur in der Verwendung der Ergebnisse:
    (Wir gehen davon aus das in der Tabelle folgendes steht:
    Spalte: ID
    Spalte: Name
    Zeile: 1
    Zeile: Hans


    Man sieht: Es kommt aufs gleiche hinaus.

    Mit freundlichen Grüßen
    Developer
    Go/Python Developer | ehm. Webdeveloper | Fachinformatiker Anwendungsentwicklung
    Arbeitet in einem cloudigen Umfeld bei einem der größten deutschen Rechenzentrumsbetreibern

  • mysql_fetch_object


    Ihm geht es um die Ausgabe der Daten in ein Array, nicht um ein Objekt.


    hundi


    Wenn du die Ausgabe deiner Query in ein Array packen möchtest,
    kannst du (wie du schon gemacht hast) mysql_fetch_array() benutzen.


    Beachte aber bitte, dass die Funktion "mysql_fetch_array()" zwei Parameter hat.


    Einmal die Angabe der Query und der Ausgabe Typ (result type).


    Hier gibt es 3 Typen: MYSQL_ASSOC, MYSQL_NUM und MYSQL_BOTH


    MYSQL_NUM:


    Hier spricht man die Spalte direkt mit der Spaltennummer an:



    PHP
    $result = mysql_query("SELECT id, name FROM mytable");
    while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
        printf("ID: %s  Name: %s", $row[0], $row[1]);
    }




    MYSQL_ASSOC


    Hier spricht man das Ergebnis über den Spaltennamen an


    PHP
    $result = mysql_query("SELECT id, name FROM mytable");
    while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
        printf("ID: %s  Name: %s", $row["id"], $row["name"]);
    }



    MYSQL_BOTH




    Hier kann man beide oben genannten Typen benutzen



    PHP
    $result = mysql_query("SELECT id, name FROM mytable");
    while ($row = mysql_fetch_array($result, MYSQL_BOTH)) {
        printf ("ID: %s  Name: %s", $row[0], $row["name"]);
    }




    Eine gute Referenz: http://php.net/manual/de/function.mysql-fetch-array.php


    //Du kannst natürlich auch sofort mysql_fetch_assoc benutzen.

    Einmal editiert, zuletzt von Burnett ()

  • Das ist die Query und die danach folgende Verarbeitung..



    Und dazu der Error:
    Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\blabla.php on line 32

    Mit freundlichen Grüßen,
    hundi :thumbup:


    "Wuff!, Wuff!"
    hundi, 2017

  • mysql_fetch_array() expects parameter 1 to be resource, boolean given

    Das bedeutet das deine Query etwas falsches zurück gibt. mysql_fetch_array erwartet Daten, es wird aber ein Boolean übergeben.


    Fragen: Sind alle Spalten etc richtig angegeben? (NOCHMAL NACHPRÜFEN).


    Du hast folgenden Fehler in der Query: WHERE username = '".$name."'


    Da du aber den String mit doppelten Anführungszeichen definiert hast, reicht: WHERE username = '$name'



    Zum Testen:



    http://www.php.net/manual/de/function.mysql-num-rows.php


    Mit num_rows prüfen wir ob der Spieler mit dem Namen überhaupt existiert.

  • mysql_num_rows() benötigt ebenfalls eine resource, und wenn der Query nichts zurück gibt, da es nicht existiert
    kommt da ebenfalls ein Error.
    benutze:
    @mysql_query,@mysql_num_rows
    usw... um die Fehler mit der Resource zu umgehen.
    Das Problem hierbei ist aber, dass sonstige Fehler nicht angezeigt werden ( SQL Syntax errors usw ).


    Außerdem würde ich dir raten, mit mysqli oder PDO zu arbeiten.


    MfG

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen

  • benutze:
    @mysql_query,@mysql_num_rows
    usw... um die Fehler mit der Resource zu umgehen.
    Das Problem hierbei ist aber, dass sonstige Fehler nicht angezeigt werden ( SQL Syntax errors usw ).


    Was bringt mir das ? Der Error ist ja dann immernoch da, wird doch dann nur nicht angezigt.. Klasse Fehlerbehebung.. ;)



    mysql_num_rows() benötigt ebenfalls eine resource, und wenn der Query nichts zurück gibt, da es nicht existiert
    kommt da ebenfalls ein Error.


    Richtig. Nun zeigt mir das kleine Script von Burnett auch nur die else anweisung an und der Error steht auch darüber..

    Mit freundlichen Grüßen,
    hundi :thumbup:


    "Wuff!, Wuff!"
    hundi, 2017

  • mysql_num_rows() benötigt ebenfalls eine resource, und wenn der Query nichts zurück gibt, da es nicht existiert
    kommt da ebenfalls ein Error.


    Da ist soweit korrekt, allerdings funktioniert num_rows auch, wenn nichts existiert.
    ((Wenn man zb. in der Datenbank einen User mit dem Namen "Mark" hat und man sucht über die Query nach "Albert" - in dem Fall greift num_rows))



    Wo num_rows nicht greift ist, wenn die Query fehlerhaft ist. ((Wenn man zb. das FROM weglässt etc)).


    ----


    MYSQL ist ab PHP 5.5 deprecated. (http://php.net/manual/en/migration55.deprecated.php) Man wird früher oder später auf MYSQLi, PDO etc wechseln müssen.
    Wobei ich PDO hier bevorzuge. Zusammen mit Postgres.

  • Hier muss noch ein Fehler sein... -.-


    Da ist der Name:

    PHP
    $name = $_POST["username"];
    $pw = $_POST["password"];
    $kenn = $_POST["kennung"];
    $id = $_SESSION["Usr_id"];
    $No = "Nein";
    $Ja = "Ja";


    Habe ich hier einen Fehler, der mir die Query "verbaut" ?

    Mit freundlichen Grüßen,
    hundi :thumbup:


    "Wuff!, Wuff!"
    hundi, 2017

  • Sollte eig. so reichen.

    PHP
    $result = mysql_query("SELECT ID 
    						FROM home 
    						WHERE username = '{$name}'
    						AND passwort = '{$pw}'
    						AND admin_lvl > 0
    						AND admin_kennung = '{$kenn}'");
    if( mysql_num_rows($ergebnis) ) {
    	if(isset($_SESSION["admin_logIN"]) && $_SESSION["admin_logIN"] == $No)
    	  $_SESSION["admin_logIN"] = $Ja;
    }
  • Vielen, vielen Dank für eure Hilfe und Aufklärung ;)
    Es funktioniert nun, warum auch immer..
    Schlussendlicher Code, der auch funktioniert:


    Mit freundlichen Grüßen,
    hundi :thumbup:


    "Wuff!, Wuff!"
    hundi, 2017

  • Schlecht ;) Was ist wenn der User nicht existiert ?


    Setze lieber ne num_rows Abfrage rein (wie oben erklärt).


    Ein "User" der da abgearbeitet wird, ist auf jedenfall vorhanden, da dies ein schritt des acp-login's ist..

    Mit freundlichen Grüßen,
    hundi :thumbup:


    "Wuff!, Wuff!"
    hundi, 2017

  • Es funktioniert nun, warum auch immer..

    Ganz abgesehen von den unqualifizierten Posts, die Probleme loesen, die eigentlich gar keine Probleme sind und Posts, die etwas erklaeren, was absolut nichts mit dem Thread zu tun haben, wurde bereits das eigentliche Problem erwaehnt.


    Der Query schlug fehl, weswegen mysql_query() FALSE zurueckgegeben hat. (Siehe 'Rueckgabewert' unter: http://www.php.net/manual/de/function.mysql-query.php )
    Wenn mysql_query() fehlschlaegt kann man eine detailreichere Fehlermeldung via mysql_error() bekommen. mysql_error() haette sicherlich gemeldet, dass der Query fehlgeschlagen ist, da die Spalte 'admin_lvl' nicht gefunden wurde. (Die korrekte Spalte ist, wie im korrigierten Code vom Themenersteller zu sehen ist und auch in der Datenbank Uebersicht im ersten Post zu sehen ist, 'user_lvl'.)


    Schade, dass die eigentlich korrekte Problemloesung mit Hilfe von mysql_error unter den ganzen falschen Problemloesungen und nutzlosen Randinformationen so untergegangen ist.
    Im offiziellen php Handbuch (php.net/manual/de/) nachzusehen, wann mysql_query eine Boolean-Variable zurueckgibt und, wie die offiziellen Beispiele zu mysql_query aussehen (die offiziellen Beispiele zeigen auch die Nutzung von mysql_error bei Fehlschlag auf) haette sicherlich Zeit gespart. Ein Blick in die offizielle Dokumentation kann sich bei Problemen oftmals lohnen. (Und, wenn man manch eine 'hilfreiche' Antwort in diesem Thread sieht, kann es sich auch lohnen, wenn man anderen Helfen will und sich selbst nicht so ganz mit dem Thema auskennt.)


    PS.:

    Ein "User" der da abgearbeitet wird, ist auf jedenfall vorhanden, da dies ein schritt des acp-login's ist..

    Jeder kann auf die Login Seite zugreifen und $name kommt via $_POST vom Benutzer. Bei einem Falschen Benutzernamen wird eine Error Nachricht gezeigt, da mysql_fetch_array kein Array zurueckliefern wird, sondern FALSE ( http://www.php.net/manual/de/function.mysql-fetch-array.php ).
    Probier es einfach mal aus, in dem Du als Benutzernamen eine zufaellige Zeichenkette angibst. PHP sollte einen Fehler/eine Warnung fuer die Zeile 'if($row["user_lvl"]> 0)' melden.


    Problematischer ist, aber, dass die Login Seite (ausser bei eingestellter htaccess) von jedem besucht werden kann, und so wie es sich hier im Thread darstellt ist eine SQL-Injektion moeglich:

    PHP
    $name = $_POST["username"];
    $pw = $_POST["password"];
    $kenn = $_POST["kennung"];

    $name, $pw und $kenn kommen direkt vom Benutzer. Wenn Variablen die vom Benutzer kommen, ohne mysql_real_escape_string() oder aehnliche Sicherheitsmassnahmen in ein Query eingefuegt werden besteht die Gefahr, dass ein Benutzer alle Daten (auch die Datensaetze vom admin, oder sogar die Login-Daten vom SQL-Server selbst) vom SQL-Server auslesen/veraendern kann und unter Umstaenden die Sicherheit des gesamten Webservers gefaehrdet ist. Dies ist bei '$name' die Gefahr, da diese anscheinend direkt in den Query eingefuegt wird, ohne eine real_escape Funktion durchlaufen zu haben.

  • SBIKA :
    bez. escape_string :
    Ist dierser Query "sicher und richtig" ausgeführt, egal was in meinem string steht ?

    PHP
    $nummer = "1";
    $query = sprintf("SELECT name FROM tabelle1 WHERE nummer='$nummer'",
                mysql_real_escape_string($nummer));
    $abfrage = mysql_query($query);
    $array = mysql_fetch_array($abfrage);
    echo $array["name"];
    echo $nummer;


    bez. htaccess :
    Wie stelle ich es richtig ein, damit nur Personen mit einem user_lvl, der höher als 1 ist zugriff auf das acp-login haben ?

    Mit freundlichen Grüßen,
    hundi :thumbup:


    "Wuff!, Wuff!"
    hundi, 2017

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen