Registration MySQL und PHP: Registration MySQL und PHP

Hi,
Ich habe mir ein kleines Registrations Script gebastellt nur leider bekomme ich es nicht hin das ein Benutzername nur einmal Vorkommen darf.
Ich habe es mal mit folgendem Script versucht :

$abfrage=mysql_query("SELECT Nickname FROM benutzerdaten WHERE Nickname = $benutzer[0]['Nickname']");
$ergebnis=mysql_num_rows($abfrage);
if($ergebnis == 0){

Nur leider erscheint dort der Error :
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /usr/export/www/vhosts/funnetwork/hosting/vanhellsehn/3.php on line 47

Line 47 = $ergebnis=mysql_num_rows($abfrage);

Habt ihr ne Idee woran es liegen kann ?
Oder habt ihr noch ne andere IDee wie man es machen könnte ?

Mfg,
Marv

  1. $abfrage=mysql_query("SELECT Nickname FROM benutzerdaten WHERE Nickname = $benutzer[0]['Nickname']");
    $ergebnis=mysql_num_rows($abfrage);

    Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource

    Habt ihr ne Idee woran es liegen kann ?

    Das Übliche: Nicht in die Anleitung geguckt, sondern Funktion benutzt und einfach blind weitergemacht ohne zu prüfen, ob sie vielleicht fehlgeschlagen ist. Halbwegs ordentlich wäre

    if (! $abfrage = mysql_query("blafasel")) {
        die("Fehler bei blafasel: " . mysql_error());
    }

    Vermutlich wird er Dir erzählen, dass der Fehler hinterm Gleichheitszeichen steckt, da fehlen in Deinem SQL-Befehl nämlich ein paar kleine Striche.

    Du solltest Dich davon abgesehen mit mysql_real_escape_string() anfreunden. PHP-Variablen direkt in Zeichenketten einzulagern ist zudem eine von vielen PHP-Unsitten, aber wohl Geschmackssache.

    1. Hello,

      ... Du schwankst ob der Sorge um den Poster?

      Oder hast Du Dir gestern einen "über die Sorgen gegossen"?

      So langsam würde es sich glatt mal lohnen, die (deine?) ganzen Nicks einzusammeln und ihnen eine Bedeutung zu unterstellen ;-))

      Harzliche Grüße vom Berg
      http://bergpost.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
      Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

  2. Hello,

    Hi,
    Ich habe mir ein kleines Registrations Script gebastellt nur leider bekomme ich es nicht hin das ein Benutzername nur einmal Vorkommen darf.
    Ich habe es mal mit folgendem Script versucht :

    error_reporting(E_ALL);    ## mindestens auch Notices anzeigen

    $abfrage=mysql_query("SELECT Nickname FROM benutzerdaten WHERE Nickname =

    $benutzer[0]['Nickname']");

    echo $abfrage;

    $ergebnis=mysql_num_rows($abfrage);

    hier fehlt auch noch die Kontrolle, ob das MySQL-Statement überhaupt verstanden worden ist.

    if (mysql_errno($connection) > 0))
    {
      ## Fehlerbehandlung, Wiederholung, Abbruch, usw.
      echo mysql_error($connection);
    }

    if($ergebnis == 0){

    Die Abfrage kommt zu spät.
    Du musst erst abfragen, ob eine gültige Ergebniskennung vorliegt und erst dann damit arbeiten...

    Nur leider erscheint dort der Error :
    Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /usr/export/www/vhosts/funnetwork/hosting/vanhellsehn/3.php on line 47

    Oder habt ihr noch ne andere IDee wie man es machen könnte ?

    Man sollte immer vorne anfangen bei der Programmierung.

    Wie sieht denn Dein Create-Statement für die Tabelle aus?

    $sql = "show create $tablename";
       $res = mysql_query($sql, $connection);
       if (mysql_errno($connection > 0))
       {
         echo "<p> MySQL-Fehler: " . htmlspecialchars(mysql_error($connection)) . "</p>\n";
       }
       elseif ($res and mysql_num_rows($res) == 1)
       {
         $statement = mysql_fetch_row($res);

    echo "<pre>\n";
         echo htmlspecialchars($statement);
         echo "</pre>\n";
       }
       else
       {
         echo "<p> kein Abfrageergebnis"</p>\n";
       }

    So ungefähr könntest Du erstmal abfragen, wie Deine Tabelle aufgebaut ist.

    Um zu vermeiden, dass doppelte Einträge in Spalten oder Spaltengruppen möglich sind, verwendet man i.d.R. einen UNIQUE INDEX üder die betroffenen Spalten.

    Dieser würde dann dazu führen, dass ein Eintragsversuch einer Doublette abgelehnt wird.
    Die Statusmeldung (das ist KEIN Fehler!) der Datenbank nach einem Query wertet man ja aus, und ist dann informiert über das vorausgegangene Query.

    Harzliche Grüße vom Berg
    http://bergpost.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

    1. Hello,

      elseif ($res and mysql_num_rows($res) == 1)
         {
           $statement = mysql_fetch_row($res);

      echo "<pre>\n";

      echo htmlspecialchars($statement[0]);  ## da fehlte der Index...

      echo "</pre>\n";
         }

      Harzliche Grüße vom Berg
      http://bergpost.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
      Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

  3. echo $begrüßung;

    Habt ihr ne Idee woran es liegen kann ?
    Oder habt ihr noch ne andere IDee wie man es machen könnte ?

    Es sind immer wieder die gleichen Grundprinzipien der Fehlersuche anzuwenden. Lass dir die Werte der beteiligten Variablen ausgeben. Für einfache Werte eignet sich echo, für mehr Genauigkeit ist var_dump() die bessere Variante. Vergleiche diese ausgegebenen Werte mit dem vor dir erwarteten oder dem in der Dokumentation beschrieben Wert.

    Desweiteren geben einige PHP-Funktionen im Fehlerfall etwas anderes zurück als im Gutfall. Informiere dich stets im PHP-Handbuch über die Arbeitsweise der von dir eingesetzten Funktion und ignoriere keinen der Ergebniswerte.

    Es ist ebenfalls von Vorteil, sich das SQL-Statement zunächst in einer separaten Variable zusammenzubauen, um sich dann anzuschauen, was dabei rausgekommen ist.

    $abfrage=mysql_query("SELECT Nickname FROM benutzerdaten WHERE Nickname = $benutzer[0]['Nickname']");
    $ergebnis=mysql_num_rows($abfrage);
    Nur leider erscheint dort der Error :
    Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /usr/export/www/vhosts/funnetwork/hosting/vanhellsehn/3.php on line 47

    Das ist ein Folgefehler, weil du den Hinweis von mysql_query() auf einen Fehlerzustand missachtet hast. Diese Meldung ist unter Anfängern so alltäglich, dass ein kurzes Suchmaschine-Anwerfen dir zu ihr eine Menge Fundstellen gebracht hätte.

    Einige PHP-Teile werfen nicht sofort mit Fehlermeldugen um sich, wenn etwas Unerwartetes eingetreten ist. Die mysql-Funktionen gehören zu dieser Sorte. Man muss hier das Funktionsergebnis auswerten und im Falle eines false gibt es über die Funktion mysql_error() den Fehlertext abzufragen.

    Falls dir bei deiner weiteren Recherche ein Konstrukt à la

    $ergebnis = mysql_query($sql) or die(mysql_error());

    über den Weg läuft, so sei noch gesagt, dass das Sterbenlassen des Scripts mit die() keine Fehlerbehandlung ist, sondern eher als Flucht aus der Verantwortung zu betrachten ist. So ein die() hinterlässt eine unfertige Webseite, verunstaltet dabei das so mühevoll aufgesetzte Design, und gibt außerdem noch Informationen an den Anwender, mit der er nichts anfangen kann. Besser ist es, im Gutfall das gewünschte Ergebnis und im Fehlerfall eine allgemein gehaltene Hinweismeldung auszugeben, anschließend normal mit dem Programm fortzufahren. Füe deine Suche nach dem Fehler musst du aber dennoch den genauen Wortlauf ausgeben. Diese für das Debugging notwendigen Ausgaben kannst du nach selbigem ja wieder entfernen oder du notierst sie gleich bedingt:

    if (DEBUG)
        echo ...;

    Ein

    define('DEBUG', false);

    am Anfang des Scripts schaltet dann, auf true gestellt, alle Debug-Ausgaben an.

    Noch ein Hinweis: Es ist immer empfehlenswert, beim Entwickeln das error_reporting auf E_ALL (und display_errors auf on) zu stellen, damit PHP alle Hinweismeldungen ausgeben kann.

    echo "$verabschiedung $name";

  4. Hallo Marv,

    Ich habe mir ein kleines Registrations Script gebastellt nur leider bekomme ich es nicht hin das ein Benutzername nur einmal Vorkommen darf.

    Oder habt ihr noch ne andere IDee wie man es machen könnte ?

    ein paar gute Tipps hast Du ja bereits bekommen.
    Grundsätzlich empfehle ich Dir einen anderen Ansatz als Deinen bisherigen:

    1. Statte Deine Spalte Nickname mit einem eindeutigen Index aus.
       Wie das geht, steht im MySQL-Handbuch.

    2. Bei einer Neuregistrierung versuche einfach den Datensatz einzutragen,
       _ohne_ vorher nachzuschauen, ob er bereits vorhanden war.

    3. Wenn es geklappt hat, prima.
       Wenn es nicht geklappt hat - und zwar wegen einer Schlüsselverletzung,
       dann teile dem Neubenutzer mit, dass der Nickname bereits vergeben ist.

    Das bedeutet übrigens, dass Du Dich mit den Grundlagen von Datenbankmanagementsystemen (DBMS) wie MySQL, mit den Grundlagen der Sprache SQL und natürlich den Grundlagen von PHP vertraut machen solltest.

    Freundliche Grüße

    Vinzenz

    1. Hello,

      1. Statte Deine Spalte Nickname mit einem eindeutigen Index aus.
           Wie das geht, steht im MySQL-Handbuch.

      2. Bei einer Neuregistrierung versuche einfach den Datensatz einzutragen,
           _ohne_ vorher nachzuschauen, ob er bereits vorhanden war.

      3. Wenn es geklappt hat, prima.
           Wenn es nicht geklappt hat - und zwar wegen einer Schlüsselverletzung,
           dann teile dem Neubenutzer mit, dass der Nickname bereits vergeben ist.

      Vielleicht sollte man 'was klarstellen dazu. Ich hatte es eben unterschwellig ja schon gesagt:

      Einen MySQL-Status-Wert > 0 zu erzeugen, ist KEIN FEHLER, sondern wird oft gezielt dazu genutzt, um eine sogenannte "Race Condition" http://de.wikipedia.org/wiki/Race_condition zu vermeiden.

      Die von marv hier versuchte Methode ist daher schlichtweg FALSCH.
      Zwischen der Abfrage, ob ein Nickname bereits eingetragen worden ist, und dem tatsächlichen Eintrag ist soviel Zeit, dass andere Prozesse diese Lücke für sich nutzen könnten. Vermeiden kann man das nur durch die Bindung der beiden Statements zu einem einzigen "atomaren Prozess". Während des Ablaufes eines solchen gebundenen Prozesses lässt das beauftragte System keinen zweiten Prozess an die betroffenen Daten heran.

      Man kann diese Sperre als Programmierer künstlich herbeiführen (Semaphore, Locking) oder aber es dem beauftragten System direkt übertragen. Da die künstliche Variante, die sich leider nicht immer vermeiden lässt, i.d.R. ein Performance-Killer ist, sollte man also immer mit der "eingebauten Lösung" arbeiten und Statuswerte und Fehlermeldungen als seine Freunde ansehen und nicht als lästige Dinge, die man möglichset unterdrücken sollte.

      Aber auch die nicht beabsichtigten oder vorhergesehen Fehlermeldungen sollte man in PHP immer alle zulassen, also während der Entwicklung zur Anzeige kommen lassen. PHP bitete die Möglichkeit, durch Umstellen/Einstellen weniger Konfigurationsvariablen die Fehlermeldungen später im laufenden Betrieb  zu filtern un d die wichtigen in eine Datei umzulenken. Das geht auch ganz außerhalb der Scripte, wenn der Provider nicht verblödet ist, in einer .htaccess-Datei oder einer eigenen php.ini.

      http://de3.php.net/manual/en/ref.errorfunc.php

      Man muss nur zu unterscheiden lernen, wann ein "Fehler" zum normalen vorhersehbaren Programmablauf gehört, der im Programm automatisch behandelt wird, oder wann er eine unvorhergesehene oder zumindesrt unerwünschte Störung des Programmablaufes darstellt, die im Logbuch auflaufen sollte, um dann durch Änderungen am Programm oder der Konfiguration die Fehlerquelle beseitigen zu können.

      Soweit ich mich erinnere, hatte sich Dedlfix schon mal das <I> angezogen?
      Mit einer einfachen Strategie, wie man bei PHP Fehlermeldungen gezielt in ein File umleitet, sollte man vielleicht mal beginnen...

      Harzliche Grüße vom Berg
      http://bergpost.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
      Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)