Problem mit Mysql-Abfrage

Folgender Code ist der meinige

$name = $_POST[‚name‘];
$pass = $_POST[‚pass‘];
$doesexist = mysql_query((„Select COUNT(*) FROM users WHERE username = ‚$name‘“)OR mysql_error());
if(mysql_num_rows($doesexist) == 0)//line 26

{
mysql_query(„INSERT INTO users (username, passwort, rights) Values (’$name’, ‚$pass‘,‚user‘)“);
echo „Neuer User erfolgreich angelegt“;
}
else
{
echo „User existiert bereits“;
}

Nun beomme ich aber:

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in xxx on line 26

Ich komme nicht auf den Fehler…

moin…

Ich denke mal, dass es daran liegt, dass Du gar keine rows selectest mit Deinem Query und deswegen der Fehler hochkommt…
Du zählst mit Deinem Query ja lediglich die Anzahl der „users“ mit entsprechendem Usernamen…

wenn dann solltest Du also etwas selecten und nicht counten…

Grüße

Das ändert aber nichts, wenn ich das Count entferne…

Hallo Porfavor,
$doesexist = mysql_query((„Select COUNT(*) FROM users WHERE username = ‚$name‘“)
OR mysql_error());

sollte es wohl eher

$doesexist = mysql\_query("Select COUNT(\*) FROM users WHERE username = '$name'" 
 OR mysql\_error();

sein oder besser die im PHP-Handbuch verwendete Langform

$result = mysql\_query('SELECT my\_col FROM my\_tbl');
if (!$result) {
 die('Ungültige Abfrage: ' . mysql\_error());
}

MfG Georg V.

Danke schonmal!

Meintest du das:

$doesexist = mysql_query(„Select (*) FROM users WHERE username = ‚$name‘“)OR mysql_error();

?

Das ändert aber nichts…num_rows wird immer noch als invalid angesehen.

Was kann ich denn machen, damit das Script funktioniert?
Ich möchte einfach nur abgleich, ob der Eintrag in der DB bereits existiert,

Hallo Porfavor,
$doesexist = mysql_query(„Select COUNT(*) FROM users WHERE username = ‚$name‘“)
OR mysql_error();

Das ändert aber nichts…num_rows wird immer noch als invalid
angesehen.

Schön, dass Du meinen Hinweis auf das PHP-Manual ernst nimmst und darin stöberst, aber Dein Vorgehen bringt es wirklich nicht: Wenn was als defekt gemeldet wird, braucht man auch nicht nachfragen, wieviele Zeilen man damit erreicht hat (ich interpretiere Deinen Einwurf als Verwendung der Funktion „num_rows = mysql_affected_rows(&mysql);“.

Ich habe Dich mit Absicht auf die Langfrom versucht zu leiten, denn dann würde zu mindestens mal eine Fehlermeldung herauskommen. Ich persönlich würde mir auch das SQL-Statement erst in einer Variablen zusammenbauen und im Fehlerfall ausgeben lassen. Die Ausgabe kann man auch schnell mal kopieren und in phpMyAdmin reinkopieren. Eventuell hast Du ja die Tabelle nur user statt users genannt.

MfG Georg V.

Also die Benennungen der Tabelle etc. sind korrekt. Was für eine fehlermeldung bekomme ich denn dann? Nagut dann versuche ich mal die lange Form…wenn alles nicht klappt, mach ich einfach unique, was aber nicht Sinn der Sache ist. Ich will ja was lernen.

Also ich melde mich wieder mit dem Fehler?

Ein simpler Fehler auf den aber keiner von euch gekommen ist. Das (*) musste dem COUNT direkt folgen. Ich hatte ein Leerzeichen dazwischen. Danke trotzdem :wink:

Hallo,

was soll eigentlich das „or mysql_error()“ da ? Das macht so keinen Sinn, da das den Text zurückgibt und damit immer „true“ ist, bzw. du den Rückgabewert dann später gar nicht verwendest.

Du meinst wahrscheinlich:

$doesexist = mysql\_query("SELECT COUNT(\*) FROM users WHERE username='$name'") or die(mysql\_error());

Wenn du bei einem Fehler abbrechen willst, oder eben print statt die wenn der nur ausgegeben werden soll.

Wenn du COUNT(*) machst, liefert mysql_num_rows übrigens immer 1, weil eben im Ergebnis eine Zeile mit der Anzahl steht.
Da willst du dann stattdessen eher

list($count) = mysql\_fetch\_row($doesexist);

Alexander

-Hier brauchts ne Edit-Funktion-

Also ich dachte jetzt es geht…allerdings wird jetzt immer angezeigt „Der User existiert bereits“ und es wird nichts eingetragen.

Sieht momentan so aus:

$name = $_POST[‚name‘];
$pass = $_POST[‚pass‘];
$doesexist = „Select COUNT(*) FROM users WHERE username = ‚$name‘“;
$query = mysql_query($doesexist);
if (!$query) {
die('Fehler: ’ . mysql_error());
}

if(mysql_num_rows($query) == 0)

{
mysql_query(„INSERT INTO users (username, passwort, rights) Values (’$name’, ‚$pass‘,‚user‘)“);
echo "
Neuer User erfolgreich angelegt";
}
else
{
echo "
User existiert bereits";
}

Ich habe wohl einen Denkfehler…

Ausgeben will ich ja gar nichts. Warum liefert Count denn immer 1? Wenn doch kein Eintrag vorhanden ist, wie zählt er dann einen?
Wie schaffe ich da eine sinnvolle Lösung?
Muss doch auch ohne fetch gehen, oder?

Hallo,

das mit dem Leerzeichen ist mir leider nicht aufgefallen.

Also ich dachte jetzt es geht…allerdings wird jetzt immer
angezeigt „Der User existiert bereits“ und es wird nichts
eingetragen.

Das hatte ich ja unten schon geschrieben. mysql_num_rows liefert die Anzahl der Zeilen im Ergebnis. SELECT COUNT(*) liefert nun aber immer eine Tabelle mit einer Spalte und Zeile im Ergebnis, in welcher die Anzahl steht. Deswegen musst du das Ergebnis davon über mysql_fetch_row auslesen, weil die Anzahl der Zeilen in der DB eben das Ergebnis der Funtkion ist, welches in der Antworttabelle steht.
Du bekommst als Antworttabelle z.B.

+----------+ oder +---------+
| COUNT(\*) | | COUNT(\*)|
+==========+ +=========+
| 0 | | 122 |
+----------+ +---------+

Das ist aber immer eine Zeile, weswegen mysql_num_rows immer 1 ist.

$query = mysql_query($doesexist);
if (!$query) {
die('Fehler: ’ . mysql_error());
}

list($count) = mysql_fetch_row($query);
if($count == 0)

Alexander

Perfekt, danke!

Also muss ich sowas immer mit list machen?

Das list „löst“ nur das Array auf…
$x = mysql_fetch_row($result) würde ein Array mit einem Element geben, mit $count = $x[0] würde man das entsprechend abfragen können. Durch das list steht das eben gleich in $count.