PHP SQL Statement mit Rückgabewert

Aixx

Ensign
Registriert
Sep. 2011
Beiträge
239
Nabend Leute,

hab mal eine Frage bzgl. PHP.. In meinem PHP File wird überprüft ob die Benutzerdaten die in einem Formular eingegeben werden schon in der Datenbank vorhanden sind. Leider ist meine Funktion im Moment dazu nicht im Stande ..
Könnte mich jemand aufklären was dort falsch läuft ?

Nachdem ich die Funktion aufrufe schafft es diese erst garnicht den Wert von $resultuser auf true/false zu setzen. Am Ende des ganzen Scripts bleibt die Variable leer.

Code:
function user_exists()
{
    $resultuser = mysql_query("SELECT name FROM mitglieder WHERE name = '$Username'");
    if(!$resultuser) 
    {
         return true;
    }
    else
    {
         return false;
    }
}

Die zweite Zeile macht mich etwas stutzig mit if(!resultuser) aber laut nem alten Forumeintrag scheint das nur Auszusagen das "WENN Variable X einen Wert besitzt , dann .. " oder sehe ich das falsch ?

Mfg
 
$Username als globale Variable? Sowas gehört sich eigentlich als Funktionsparameter...
 
PHP:
function user_exists(){
  return (mysql_result(mysql_query("SELECT COUNT(*) FROM mitglieder 
  WHERE name = '%Username'"),0) >= 1 ? true : false );
}
 
Notiz an mich selbst:
Kryptisch wirkende einzeilige Statements, die übersichtlicher wären wenn sie aus mehreren aussagekräftigen Anweisungen bestünden, befreien den Entwickler vom Ressourcen-Management.



Was soll das %Username bezwecken?

ich mein wenn man es hässlich machen will, wieso nicht gleich so?
PHP:
function user_exists(){
  return mysql_result(mysql_query("SELECT COUNT(*) FROM mitglieder WHERE name = '$Username'"), 0);
}

Und der Code schreit gerade zu nach SQL-Injection, aber warum sollte man auch darauf hinweisen...
 
Zuletzt bearbeitet:
Woran es liegt kann man aufgrund zu weniger Informationen nicht direkt sagen.

Zum einen ist, wie mein Vorredner schon sagte, die Variable $Username weder in der Funktion belegt worden, noch als Parameter übergeben worden (in den Klammern nach dem Funktionsnamen). Der Select-Befehl kann also nur korrekt ausgeführt werden, falls diese Variable vor dem Funktionsaufruf schon global gesetzt wurde.

Des Weiteren kann es aber auch sein, dass du keine Datenbankverbindung mit mysql_connect(...) vorher aufgebaut hast, das ist ebenso nicht ersichtlich.

Dann ist noch ein Punkt, dass die mysql_xxx Funktionen deprecated sind, das heißt so viel wie veraltet, überholt. Stattdessen soll man laut Dokumentation mysqli_xxx Funktionen verwenden (man achte auf das i). Die alte funktioniert dennoch wenn du die beibehalten möchtest.

Und noch ein Tipp, wenn du rausfinden willst, ob es einen Eintrag schon gibt, dann solltest du lieber die Anzahl der zurückgegebenen Zeilen checken, dafür gibt es die mysqli_num_rows() Funktion. Der Nachteil von deiner Variante wäre, dass $resultuser auch false sein kann, wenn z.B. die Datenbankzugriffsberechtigungen nicht gegeben sind.

Achja und die if Abfrage wie du sie bisher hast, testet den Wahrheitswert je nach Belegung. Das ! davor negiert das ganze, kannst du quasi als "not" lesen. Folglich würde der if Fall eintreten, wenn $resultuser false ist, da es durch das ! true wird in der Bedingung.

Hoffe solch Erklärung hat dir etwas mehr gebracht als einfach nur die Lösung.
 
Schau Dir mal das zweite Beispiel hier an oder besser den ganzen Artikel:

http://php.net/manual/de/function.mysql-query.php

Man soll es nciht glauben, die offizielle Doku hilft meistens weiter.

mysql_query gibt eine Resource zurück, Du kannst Damit nur prüfen, ob die Abfrage an sich erfolgreich war. Das Ergebnis muss noch gefetcht werden.

while ($row = mysql_fetch_assoc($result)) {
echo $row['firstname'];
echo $row['lastname'];
echo $row['address'];
echo $row['age'];
}

Oder mit mysql_num_rows testen. Und was der Rest oben geschrieben hat auch noch beachten. :)
 
Unabhängig davon: der prozedurale Stil sollte nicht mehr verwendet werden. Man sollte sich gar nicht erst den veralteten Scheiß aneignen, sondern direkt einen objektorientierten Stil mit PDO auf Basis von MySQLi verwenden.
 
Zurück
Oben