Fehler mit mysql_num_rows

Scope

Erfahrenes Mitglied
Keine Ahnung wieso, aber ich kriege regelmäßig Ärger mit der Funktion mysql_num_rows

Kommt immer folgender Fehler:
Warning: Supplied argument is not a valid MySQL result resource in C:\apache\htdocs\checkuser.php on line 14


Hier mal der Text von dem Fehler als Beispiel
PHP:
<?


@session_start (); // Starte eine Session. 

// ======== AUFBAU DER DATENBANKVERBINGUN ======== 
$connID = mysql_connect ("host", "me", "xxx"); 
@mysql_select_db ("dbname", $connID); 

// Generiere und starte die Abfrage 
$sql = "SELECT * FROM benutzerdaten WHERE (Benutzername like '$username') AND (Kennwort = '$password')"; 
$result = mysql_query ($sql, $connID); 

if (mysql_num_rows ($result) > 0) { [
// Ein Datensatz wurde gefunden. 
$datenrichtig = true; 

// Variable $user_eingeloggt erstellen. 
$user_eingeloggt = true; 
} else { 
// Die Benutzerdaten waren falsch. 
$datenrichtig = false; 

// Variable $user_eingeloggt erstellen. 
$user_eingeloggt = false; 
} 

// Variable $user_eingeloggt in der Session registrieren. 
session_register ("user_eingeloggt");


Vielen Dank schon mal für die Hilfe. Wird wahrscheinlich ein total dummer Fehler sein, aber auf sowas kommt man ja immer als letztes...

Scope
 
moin also ich habe da nie probleme mit, allerdings sind meine connect abläufe auch etwas anders aber das sollte egal sein, wo ich allerdings zwei fragen zu habe ist folgende zeile:

PHP:
if (mysql_num_rows ($result) > 0) { [

1. was ist das für ne eckige klammer die dahinten aufgeht ? auf jedenfall machst du die nicht mehr zu

2. ich weiss es nicht genau, aber darf zwischen mysql_num_rows und ($result) ein space sein oder nicht ? probier mal ohne.
 
Wie leuchte schon geschrieben hat, gehört dieses [ wohl nicht da hin. Leerzeichen zwischen Funktionsname und Parameterliste sind jedoch syntaxkonform.
Der Fehler liegt hier wahrscheinlich am mySQL-Query.
Versuch mal folgendes:
PHP:
// Zeile 12:
$result = mysql_query($sql, $connID) or die(mysql_error());
Wenn die Abfrage fehlerhaft ist, wird dadurch das Script angehalten und die Errormessage ausgegeben. Anhand dieser Information kannst du dann versuchen, deinen mySQL-Query zu korrigieren.
 
hab mal eine offtopic frage, heisst ist auch php (mysql) hat auch bezug zu dem topic aber net genau das thema:

also ich sehe immer wieder dinge wie folgendes hier:

PHP:
@mysql_select_db ("dbname", $connID);

1. Wat soll das @ davor und warum macht man nicht einmal vorher mysql_connect(host, user, pass);

dann hat sich dieses anhängen von $connID an sämtliche queries doch erledigt, oder ist das irgendwie verboten ??? ;)
 
1. Das mit der eckigen Klammer ist nichts besonderes, eher ein Zufall, das die da noch drin ist, ist in meinem QT nicht drin, würde aber zu lange dauern, das jetzt zu erklären.

Noch mal eine andere Frage: Wie lautet die ideale DB-Abfrage? Ich habe hier schon 2 Versionen gesehen

1. Version
PHP:
$connID = mysql_connect ("host", "me", "xxx"); 
@mysql_select_db ("dbname", $connID); 

// Generiere und starte die Abfrage 
$sql = "SELECT * FROM benutzerdaten WHERE (Benutzername like '$username') AND (Kennwort = '$password')"; 
$result = mysql_query ($sql, $connID);

2. Version (so kannte ich es)
PHP:
$db = mysql_connect("host", "me", "xxx"); 
$res = mysql_db_query("data", "select * from links order by cat desc");
$num = mysql_num_rows($res);

Oder ist beides richtig?
Oder ist beides nur ein etwas anders aufgebauter Syntax? Blicke da sowieso nicht 100%ig durch.
Scope
 
@leuchte: Das @ vor einer Funktion bewirkt, dass evtl. auftretende Warnungen bei der Abarbeitung der Funktion unterdrückt werden. Hm. Déjà vu... das hab ich doch heute schon mal hier geschrieben ;)
Das Anhängen der Connection ID bei sämtlichen Queries ist zwar nicht unbedingt nötig, schafft aber Sicherheit. Besonders wichtig ist das vor allem, wenn man an mehreren Servern gleichzeitig Abfragen tätigen will, ohne jedes mal neu zu connecten.

@Scope: Grundsätzlich ist beides möglich. Ich hab´s mir z.B. angewöhnt, eine Abfrage so zu formulieren:
PHP:
// In einer externen Datei, die bei Bedarf inkludiert wird:
$mysqlserver = "xxx";
$mysqluser = "xxx";
$mysqlpass = "xxx";
$mysqldb = "xxx";

$mysqlid = mysql_connect($mysqlserver, $mysqluser, $mysqlpass);
mysql_select_db($mysqldb, $mysqlid);

----------
// Die eigentliche Abfrage
$result = mysql_query("select * from bla", $mysqlid);
Ich überleg mir aber schon seit einiger Zeit, ob ich mir nicht eine Wrapper-Klasse für das ganze schreibe... das ist wieder eine andere Möglichkeit ;)

Hast du dein Script jetzt schon mit der geänderten Zeile 12 getestet?
 
Im Prinzip ist eine Wrapper-Klasse eine Möglichkeit, Funktionen und Variablen eines bestimmten Anwendungsbereiches sinnvoll in einem Objekt zusammenzufassen. Anstatt z.B. 'hardcoded' mit mysql_query zu arbeiten, abstrahiert man die Datenbankabfragen durch eine Klasse. Dann sieht ein Script z.B. so aus:
PHP:
<?
include("./dbwrapper.inc.php");

$db = new dbwrap;
$db->connect("server", "user", "pass", "datenbank");
$result = $db->query("SELECT * FROM tabelle");
while ($row = $db->fetch_row($result))
{
  echo $row[0]." ".$row[1]."<br>";
}
?>
Ein Hauch OOP weht da durch PHP ;)
 
Also, erstmal vielen Dank für die schnellen Replies.

1. Das Problem ist inzwischen gelöst und das ganze klappt auch problemlos mit meinem Login
2. Noch eine Frage: Wie ist denn die Ordnerstruktur auf dem Server. Ich hab bei mir alles in C:\apache\htdocs und die Bilder zur HP noch im Unterordner \img
Wie ist das mit einem Server, den ich mir bei einem Provider hole. Kann ich mir das selbst einrichten? Oder ist es anders aufgebaut? Und wenn ja wie?

Danke.
Scope.
 
Zurück