kostenloser Webspace werbefrei: lima-city


mysql eintrag problem

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    a************n

    es stimmt: verbindungsaufbau datenbank tabelle.
    es werden alle variablen übergeben.
    und was eigentlich nie passieren dürfte ist das ich einen weißen bildschrim bekomme aber ich bekomm einen warum??
    ich bin um jede hilfe dankbar.
    <?php
    $username = $_POST["username"];
    $passwort = $_POST["passwort"];
    $passwort2 = $_POST["passwort2"];
    $mail = $_POST['mail'];
    $hp = $_POST['hp'];
    $icq = $_POST['icq'];	
    
    $verbindung = mysql_connect("mysql.lima-city.de", "///////////////" , "/////////////")
    or die("Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("db/////////") or die ("Datenbank konnte nicht ausgewählt werden");
    if($passwort != $passwort2 OR $username == "" OR $passwort == "")
        {
        echo "Eingabefehler. Bitte alle Felder korekt ausfüllen. <a href=\"eintragen.htm\">Zurück</a>";
        exit;
        }
    $passwort = sha1($passwort);
    $trag = "SELECT id FROM user WHERE username LIKE '$username'";
    $result = mysql_query($trag)or die( mysql_error());
    $menge = mysql_num_rows($result)or die( mysql_error());
    
    	if($menge == 0)
        {
        $eintrag = "INSERT INTO user (username, passwort, hp, mail, icq) VALUES ('$username', '$passwort', '$hp', '$mail', '$icq')";
        $eintragen = mysql_query($eintrag);
    
        if($eintragen == true)
            {
            echo "Benutzername <b>$username</b> wurde erstellt. <a href=\"index.php?seite=login\">Login</a>";
            }
        else
            {
            echo "Fehler beim Speichern des Benutzernames. <a href=\"eintragen.htm\">Zurück</a>";
            }
        }
    
    else
        {
        echo "Benutzername schon vorhanden. <a href=\"eintragen.htm\">Zurück</a>";
        }
    
    ?>

    mfg andré
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. beim select fehlt da nicht ein '%', warum vergleichst du nicht direkt die user names: Select...From WHERE username = '$username';


    kann man denn einen mysql_query() auf true vergleichen? -> $eintragen

    Beitrag geändert: 18.8.2008 18:13:01 von itasworld
  4. Autor dieses Themas

    a************n



    itasworld schrieb:
    beim select fehlt da nicht ein '%', warum vergleichst du nicht direkt die user names: Select...From WHERE username = '$username';


    kann man denn einen mysql_query() auf true vergleichen? -> $eintragen

    soweit ich weiß kann man einen eintrag auf true überprüfen, hab ich auch schon immer gemacht...
    und wenn ich select... from where username='$username'... mache bleibt alles gleich.
    und wo genauch fehlt ein % könntest du vll bitte genau sagen wo??
  5. select ... from user where username LIKE '%$username%';

    ..ich arbeite so selten mit dem LIKE befehl

    ansonsten gucke hier http://dev.mysql.com/doc/refman/5.1/de/string-comparison-functions.html
  6. Versuch mal deine SQL-Statements in dieser Art und Weise zu schreiben:

    <?
    $trag = "SELECT id FROM user WHERE username LIKE '" . $username . "'";
    ?>




    EDIT:

    Um ein Anführungszeichen in der Echo-Funktion zu nutzen, wie in der nachfolgenden Zeile, musst du die Anführungszeichen mit einem Backslash escapen, was dann in etwa so aus sieht:

    <?
    if($passwort != $passwort2 OR $username == "" OR $passwort == "")
        {
        echo "Eingabefehler. Bitte alle Felder korekt ausfüllen. <a href=\\"eintragen.htm\\">Zurück</a>";
        exit;
        }
    ?>


    Sonst wird das so interpretiert, als würde beim Anführungszeichen die Zeichenkette aufhören ;)

    Beitrag geändert: 18.8.2008 18:26:33 von karpfen


    Beitrag geändert: 18.8.2008 18:27:36 von karpfen
  7. Autor dieses Themas

    a************n

    tut sich leider bei beiden varianten nix aber ich mein der bildschirm dürfte doch garnicht komplett weiß sein oder da musste iwas sein auch wenns nur ne fehlermeldung ist aber da ist einfach nichts, nichts....


    mfg andré

    EDIT
    alle nötigen anführungszeichen waren schon immer mit nem backslash versehen nur die werden hier nicht dargestellt

    Beitrag geändert: 18.8.2008 18:30:09 von andre-morillon
  8. wenn nicht dann gebe einfach dem submit button von der formular seite einen namen und überprüfe dann:
    if(empty($NameDesSubmit))
    {
      echo "keine submit gefunden";
    }
    else
    {
       echo "Alles klar";
    }


    sicher das du bei <form action= ..."> die richtige seite angegeben hast?


    weil so einen weißen bildschirm hatte ich auch schon öffter...und das wegen variablen ooder änhlichen blöden fehlern, das was man gerne übersieht ^^

    Beitrag geändert: 18.8.2008 18:30:42 von itasworld
  9. Autor dieses Themas

    a************n



    itasworld schrieb:

    sicher das du bei <form action= ...'> die richtige seite angegeben hast?

    ja schon ich werd ja auf die richtige seite geleitet.

    und ich bekomm ein alles klar ausgegeben. aber es tut sich immer moch nichts
  10. hast mal über konsole oder phpmyadmin nachgeguckt ob die daten denn eingetragen werden?
  11. Das kannst du rausfinden, wenn du schreibst:

    if($result = mysql_query($trag)or die( mysql_error())) {
    echo "Ja, bis hier hin war ich";
    // restlich Code, also
    // alles was jetzt noch
    // untendrunder steht.
    }
  12. also ich hab mir das jetzt auch mal erstellt und habe evtl. das problem, bzw. die stelle nur was genau das problem ist weiß ich nicht.

    die menge ist das problem:

    $result = mysql_query($trag)or die( mysql_error()." -->1"); 
    $menge = mysql_num_rows($result)or die( mysql_error()." -->2");


    wenn du die eine / die beiden zeilen ersetzt sollte:

    -->2
    ausgegeben werden!


    Noch ein paar tipps:

    - den evtl. Fehlermeldungen nummern geben also: OR DIE ("1".mysql_error);
    - du solltest die übergebene variablen noch auf schadcode überprüfen -> mysql_real_escape() und weitere funktionen, musste mal googeln


    Beitrag geändert: 18.8.2008 19:07:24 von itasworld
  13. Das wird ncith funktionieren, du musst das mit einer geschweiften Klammer öffnen, und dann auch echo vorndrannsetzen.


    @andre-morillon:

    Es kann auch sein, dass es einfach nicht funktioniert, weil du unbewusst bei phpMyAdmin eingeloggt bist, dann kannst du nichts eintragen. Wenn du morgen an den Rechner gehst, dann öffne als aller erstes die Datei mit dem Script, danach kannst du dich bei phpMyAdmin einloggen, um zu testen, ob es funktioniert, aber als aller erstes Das Script aufrufen!
  14. Das wird ncith funktionieren, du musst das mit einer geschweiften Klammer öffnen, und dann auch echo vorndrannsetzen.


    wo muss ein echo davor?
  15. Autor dieses Themas

    a************n

    also es lag nicht daran dassich bei php my admin eingelogt war weil das gb hat totzdem gefunzt.
    und wenn ich es so mache
    $trag = "SELECT id FROM user WHERE username LIKE `$username`";

    also mit actens dann kommt Unknown column 'Ironmantiger' in 'where clause' -->1

    aber es sollte doch nur schauen ob es diesen gibt.

    mfg andré


    Beitrag geändert: 19.8.2008 15:35:59 von andre-morillon
  16. also wenn ich überprüfe ob ein eintrag schon existiert / user mach ich das so:

    $open = "SELECT id FROM user WHERE username = '$username' LIMIT 1";
    $do = mysql_query($open) OR DIE("Fehler Code: 1 <br />".mysql_error());
    
    if(mysql_num_rows($do) != 0)
    {
      echo "Dieser User Existiert bereits! <br />";
    }
    else
    {
       //eintragen in DB
    }
  17. Autor dieses Themas

    a************n

    jetzt geht es

    also thx an alle

    mfg andré


    EDIT
    es lag an der überprüfung ob es den username schon gibt.
    und mit deiner lösung, itasworld, ging es

    Beitrag geändert: 19.8.2008 17:45:13 von andre-morillon
  18. wo dran lag es denn jetz letzendlich?
  19. beim select fehlt da nicht ein '%', warum vergleichst du nicht direkt die user names: Select...From WHERE username = '$username'
    Die %-Zeichen dienen als Wildcard / Platzhalter für andere Zeichen. Sofern er nicht alle Benutzer finden möchte, die den Inhalt von $username enthalten, braucht er die Wildcards nicht zu benutzen. Wie auch schon jemand anderem erwähnt, kann man in diesem Fall auch einfach nur einen Vergleich per = machen, also username = '$username'.

    Versuch mal deine SQL-Statements in dieser Art und Weise zu schreiben:
    [ code]
    <?
    $trag = "SELECT id FROM user WHERE username LIKE '" . $username . "'";
    ?>
    [ /code]
    Das ist nicht notwendig, da Variablen innerhalb von mit "-Zeichen deklarierten Stringketten ersetzt werden. Aus Performanz-Gründen könnte man jedoch auch die nachfolgende Variante verwenden:
    'SELECT id FROM user WHERE username LIKE "'.$username.'"'


    Um ein Anführungszeichen in der Echo-Funktion zu nutzen, wie in der nachfolgenden Zeile, musst du die Anführungszeichen mit einem Backslash escapen, was dann in etwa so aus sieht:
    [ code]
    <?
    if($passwort != $passwort2 OR $username == "" OR $passwort == "" )
    {
    echo "Eingabefehler. Bitte alle Felder korekt ausfüllen. <a href="eintragen.htm">Zurück</a>";
    exit;
    }
    ?>
    [ /code]
    Sonst wird das so interpretiert, als würde beim Anführungszeichen die Zeichenkette aufhören
    Prinzipiell richtig, jedoch empfiehlt es sich in solchen Fällen die Verwendung der Stringdeklarationszeichen umzukehren, um sich so das Escapen zu ersparen.

    Im Allgemeinen empfiehlt es sich sowieso, eher die '-Zeichen zu verwenden anstatt die "-Zeichen, da bei Stringketten, welche mit letzterem deklariert werden, immer nach zu ersetzenden Variablen gesucht wird. Auch $-Zeichen muss man nicht escapen, weil sie hier keinen besonderen Zweck erfüllen.

    Es kann auch sein, dass es einfach nicht funktioniert, weil du unbewusst bei phpMyAdmin eingeloggt bist, dann kannst du nichts eintragen.
    Stimmt mit Sicherheit nicht. Ich bin oft in Testphasen nebenher dort eingeloggt, um gleich bspw. die Ergebnisse zu überprüfen.

    [ code]
    $trag = "SELECT id FROM user WHERE username LIKE `$username`";
    [ /code]
    also mit actens dann kommt Unknown column 'Ironmantiger' in 'where clause' -->1

    aber es sollte doch nur schauen ob es diesen gibt.
    Das funktioniert nicht, da du hier deinen eingefügten Benutzernamen nicht als Stringkette sondern als Tabellenspalte deklarierst. Du musst dort einfach nur die `-Zeichen durch '-Zeichen ersetzen.

    Noch ein kleiner Tipp: Schreibe vor den mysql-Funktionen ein @-Zeichen (also z.B. @mysql_connect), wenn du eigene Fehlermeldung (wie bei dir durch die die()-Funktion) haben möchtest. Über dieses Zeichen unterdrückst du das Werfen von Meldungen und kannst dir so problemlos und schön deine eigenen zusammensetzen.

    @itasworld: Zumindest bei dem Problem zu seinem Beitrag davor wohl an dem, was ich dazu geschrieben habe, also an der Verwendung von `-Zeichen anstatt von '-Zeichen.

    Ansonsten dürfte das Problem an:
    $menge = mysql_num_rows($result)or die( mysql_error());
    liegen bzw. gelegen haben, da das Ergebnis der Funktion auch den int-Wert 0 annehmen kann, was als FALSE interpretiert wird und somit die Ausführung der die()-Funktion auslöst bzw. auslöste.

    Diesen Fehler hat er aber durch die Verwendung von deinem Code nicht mehr drin.

    Allgmein könntest du dir diese ganze Überprüfung auch sparen. Das macht grundsätzlich sowieso nur Probleme. Man bedenke die Nebenläufigkeit.
    Wenn zwei verschiedene Nutzer den selben Benutzernamen neu erstellen wollen, beide durch diese Überprüfung kommen, aber der Benuternamen beim zweiten Anlegen dann plötzlich doch schon vorhanden ist.

    In diesem Fall würde er bei dir beide anlegen. Dies liegt auch zum einen an deinem recht problematischen Tabellendesign (was ich mir aus den gegeben zusammengedacht habe, Abweichungen also möglich ;)). Du hast bei dir eine ID als Primärschlüssel, den du per auto-increment erstellst.

    Warum nimmst du nicht einfach username als Primärschlüssel? Das hätte auch gleichzeitig den Effekt, dass jeder nur einmal innerhalb der Tabelle existieren kann. Eventuell hast du das bisher über die Deklaration als unique gelöst, aber unique + not null = primary key ;)

    Dann könntest du das auch einfach so machen:
    $insertQuery = 'INSERT IGNORE INTO user'
            . ' (username, passwort, hp, mail, icq)'
            . " VALUES ('$username', '$passwort', '$hp', '$mail', '$icq')";
    @mysql_query($insertQuery)
            or die('Fehler beim Speichern des Benutzernames. <a href="eintragen.htm">Zurück</a>');
    
    $rows = @mysql_affected_rows($verbindung);
    if (@mysql_errno()) {
            die('Fehler bei der Überprüfung: '.@mysql_errno().' - '.@mysql_error());
    }
    
    if ($rows > 0) {
            echo 'Benutzername <b>'.$username.'</b> wurde erstellt. <a href="index.php?seite=login">Login</a>';
    }
    else {
            echo 'Benutzername schon vorhanden. <a href="eintragen.htm">Zurück</a>';
    }
    Beachte hierbei das IGNORE, da sonst Fehler beim Versuch, doppelte Einträge hinzuzufügen, ausgeworfen werden.
    Hier versucht er einfach, die Zeile einzufügen. Ist dies nicht möglich, wird sie auch nicht eingefügt. Anschließend wird überprüft, wie viele Zeilen eingefügt wurden bzw. genauer wie viele verändert wurden. Erhälst du hier 0, also das keine Zeile eingefügt wurde, weißt du automatisch, dass der Benutername schon existierte.

    PS: Noch ein paar kleine Rechtschreibfehler:
    Zeile 14: korekt => korrekt
    Zeile 33: Benutzernames => Benuternamens

    btw: Passwort auf Englisch wird password also mit d am Ende geschrieben (nur, weil du ansonsten englische Bezeichner bei deiner Tabelle verwendet hast)
  20. Warum nimmst du nicht einfach username als Primärschlüssel? Das hätte auch gleichzeitig den Effekt, dass jeder nur einmal innerhalb der Tabelle existieren kann. Eventuell hast du das bisher über die Deklaration als unique gelöst, aber unique + not null = primary key ;)


    Ein String als Primärschlüssel ist schlecht! Primärschlüssel sollten int werte sein damit Sie ohne Probleme in anderen Tabellen als Fremdschlüssel/Foreign Key verwendet werden können. Das heißt arbeitet man mit 2 verknüpften Tabellen, hat man zb.: 2 mal den user: "Hans" arbeitet man mit zahlen hat man diesen nur einmal, und in der anderen tabelle lediglich den "Fremdschlüssel" z.b: 1.

    Das würde sich schon bei wenigen usern auf die Datenbank größe auswirken und ebenso auf die performance des sql servers. Da ein computer schneller nach einer zahl suchen kann als einen string zu vergleichen.

  21. Warum nimmst du nicht einfach username als Primärschlüssel? Das hätte auch gleichzeitig den Effekt, dass jeder nur einmal innerhalb der Tabelle existieren kann. Eventuell hast du das bisher über die Deklaration als unique gelöst, aber unique + not null = primary key ;)


    Ein String als Primärschlüssel ist schlecht! Primärschlüssel sollten int werte sein damit Sie ohne Probleme in anderen Tabellen als Fremdschlüssel/Foreign Key verwendet werden können. Das heißt arbeitet man mit 2 verknüpften Tabellen, hat man zb.: 2 mal den user: "Hans" arbeitet man mit zahlen hat man diesen nur einmal, und in der anderen tabelle lediglich den "Fremdschlüssel" z.b: 1.

    Das würde sich schon bei wenigen usern auf die Datenbank größe auswirken und ebenso auf die performance des sql servers. Da ein computer schneller nach einer zahl suchen kann als einen string zu vergleichen.

    Das stimmt nicht! Wenn du ein DBMS nutzt, welches das FOREIGN KEY-Constraint richtig unterstützt, dann ist das völlig egal. MySQL unterstützt Fremdschlüssel jedoch nur beim InnoDB-Engine. Fremdschlüssel sind nur Referenzen, alles andere wäre auch Blödsinn bei der Erschaffung dieser gewesen. Diese Referenzen verweisen dann auf die wirkliche Werte, so dass diese nicht doppelt abgespeichert werden müssen.

    Solltest du natürlich Fremdschlüssel nicht zur Verfügung stehen haben wie bei MySQL bis auf InnoDB, dann magst du recht haben, dass dort das Ausweichen auf künstliche Schlüssel als Primärschlüssel günstiger sein kann, wenn man diese Fremdschlüssel-ähnlich verwenden möchte.

    Aber grundsätzlich ist deine Behauptung / Vermutung falsch.
  22. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!