[Funktion] Loginscript

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Funktion] Loginscript

    Ich habe dieses Loginscript aus einem Tutorial von www.webmasterpro.de. Ich glaube es verstanden zu haben, trotzdem scheinen für mich unerklärliche Fehler vorhanden zu sein. Ich habe den kompletten Quellcode hier gepostet, jeweils die Fehlermeldungen notiert und Verweise angelegt.

    Das Script ist ein einfaches Loginsystem, welches ID, Name, Email und Passwort speichert und Ränge verteilt. Dies alles in einer MySQL Tabelle. Im Anmeldeformular(anmelden.php) kann man sich anmelden, und im Profil(profil.php) seine Angaben verändern und wieder speichern. schutz.php ist im Grunde der Loginbereich, welcher nur registrierte Benutzer mit korekter PW eingabe hineinlässt. Es lassen sich nun beliebig die gewünschten Seiten schützen.

    Um ein wenig Licht ins Dunkel zu bringen, würde ich mich freuen, wenn Sie sich folgendes anschauen würden.




    MySQL-Tabelle:


    CREATE TABLE usertabelle (
    id int(11) NOT NULL auto_increment,
    name varchar(30) NOT NULL default '',
    pw varchar(100) NOT NULL default '',
    rang int(2) NULL default '',
    email varchar(150) NOT NULL default '',
    PRIMARY KEY (id)
    ) TYPE=MyISAM AUTO_INCREMENT=1 ;

    Verbindung zur Datenbank:


    mysqlconnect.php


    PHP-Code:
    <?php

    $db 
    mysql_connect ('localhost','root') or die (mysql_error());
    mysql_select_db ('community',$db) or die (mysql_error());

    ?>
    Das Schutzscript:

    Es wird eine Session gestartet, in der gleich die benutzerdaten gespeichert werden. Danach folgt eine Abfrage-Schleife, ob die Daten vorhanden sind, bzw. richtig sind und unten sind die Eingabeformulare.

    schutz.php
    PHP-Code:
    <?php    session_start();

    include(
    "mysqlconnect.php");

    $connect mysql_query("SELECT * FROM $usertabelle WHERE LCASE(name) = LCASE('".$_POST["name1"]."') AND pw = '"md5($_POST["pw1"]) ."'");

    if (
    mysql_num_rows($connect) == 1


    $row=mysql_fetch_array($connect);

    $name1 $row['name'];
    session_register("name1");
    session_register("pw1");
    $userid $row['id'];
    $rang $row['rang'];
    $email $row['email'];

    }else{
    if(isset(
    $login)){
    echo 
    "Deine Eingaben waren fehlerhaft.";
    };


    echo 
    "
    <table width='200'>
    <tr>
    <td width='50'>
    Name:
    </td>
    <td width='150'>
    <form method='POST' action='schutz.php'>

    <input type='hidden' name='login' value='login'>
    <input type='text' name='name1' value='
    $name1' size='20'>
    </td>
    </tr>
    <tr>
    <td width='50'>
    Passwort:
    </td>
    <td width='150'>
    <input type='PASSWORD' size='20' value='
    $pw1' name='pw1'><br>
    </td>
    </tr>
    <tr>
    <td width='50'></td>
    <td width='150'> 
    <input type='submit' name='login' value='Login'>
    </td>
    </tr>
    </table>
    </form>"
    ;

    $rang "0";

    };

    if(
    $logout=="1"){
    session_destroy();

    echo 
    "Sie wurden erfolgreich ausgeloggt";

    $rang "0";
    };

    ?>

    Hier erscheint schonmal folgende Fehlermeldung:
    Warning:
    Parse error: parse error, unexpected '"', expecting T_STRING or T_VARIABLE or T_NUM_STRING in ...community\schipsel\schutz.php on line 5
    Zeile 5 wäre diese:
    PHP-Code:
    $connect mysql_query("SELECT * FROM $usertabelle WHERE LCASE(name) = LCASE('$_POST[name1]') AND pw = '"md5($_POST[pw1]) ."'"); 


    Anmeldungsformular mit Abfrageschleife:

    anmelden.php


    PHP-Code:
    <?php

    include("mysqlconnect.php");

    if(isset(
    $new)){
    $fehler "Folgende Fehler traten auf: <br>";

    $usertest mysql_query("SELECT * FROM $usertabelle WHERE LCASE(name) = LCASE('$_POST[nick]')");

    if (
    mysql_num_rows($usertest) == 1

    $fehler "$fehler -Dieser Benutzername wird bereits benutzt<br>"
    $fehler2 "1"
    };
    if(
    $_POST[nick]==""){
    $fehler "$fehler -Du hast keinen Namen angegeben.<br>";
    $fehler2 "1";
    };
    if(
    $_POST[email]==""){
    $fehler "$fehler -Du hast keine E-Mail Adresse angegeben.<br>";
    $fehler2 "1";
    };
    if(
    $_POST[passwort1]=="" or $_POST[passwort1]!=="$_POST[passwort2]"){
    $fehler "$fehler -Deine beiden Passwort eingaben sind unterschiedlich:<BR>";
    $fehler2 "1";
    };

    if(!isset(
    $fehler2)){

    $passwort3 md5($_POST[passwort1]);

    $new "
    INSERT INTO 
    $usertabelle
    (name, pw, email, rang) 
    VALUES 
    ('
    $_POST[nick]', '$_POST[passwort3]', '$_POST[email]','2')"

    mysql_query($new) OR die(mysql_error());

    echo 
    "<br>Deine Anmeldung war erfolgreich.";

    exit;

    }else{
    echo 
    "$fehler";
    };
    };

    echo
    "
    <form action='anmelden.php' method='post'> 
    <table><tr> 
    <td>Name:</td> 
    <td><input type='text' name='nick' value='
    $nick'></td> 
    </tr> 
    <tr> 
    <td>E-Mail:</td> 
    <td><input type='text' name='email' value='
    $email'></td> 
    </tr> 
    <tr> 
    <td>Passwort:</td> 
    <td><input type='password' name='passwort1' value='
    $passwort1'></td> 
    </tr><tr> 
    <td>Passwort wiederholen:</td> 
    <td><input type='password' name='passwort2' value='
    $passwort2'></td> 
    </tr> 
    <td>
    <input type='hidden' name='new' value='
    $new'>
    <input type='submit' name='new' value='Anmelden'></td> 
    </form> 
    <td></td> 
    <td> 
    </td> 
    </tr> 
    </table>"
    ;

    ?>


    Die Daten werden nicht in die Tabelle übertragen.




    Profileditscript:

    profil.php



    PHP-Code:
    <?php

    include("schutz.php");
    if(
    $rang>0){

    if(isset(
    $_POST["edit"])){

    $passwort3 md5($_POST["passwort1"]);

    $usertest mysql_query("SELECT * FROM $usertable WHERE id='userid'");

    if (
    mysql_num_rows($usertest) == 1

    $fehler "$fehler -Dieser Benutzername wird bereits benutzt.<br>"
    $fehler2 "1"
    };
    if(
    $_POST["passwort1"]!==$_POST["passwort2"]){
    $fehler "$fehler -Deine beiden Passwort eingaben sind nicht identisch.<br>";
    $fehler2 "1";
    };
    if(
    $passwort3=$row['pw']){
    $passwort3 $row['pw'];
    };

    if(!isset(
    $fehler)){
    $sql"UPDATE $db_name.".$usertable.
    SET 
    name = 
    $_POST[name1],
    email = 
    $_POST[email],
    pw = '
    $passwort3'
    WHERE id = '
    $userid'";

    mysql_query($sql) OR die(mysql_error());

    $pw1 "$passwort3";

    session_register("pw1");

    echo 
    "<br>Dein Passwort wurde geändert.";

    exit;
    };

    };

    echo 
    "
    <form action='profil.php' method='post'> 
    <table>
    <tr>
    <td>
    Username:
    </td> 
    <td>
    <input type='text' name='name1' value='
    $name1'>
    </td></tr>

    <tr>
    <td>
    E-Mail
    </td> 
    <td>
    <input type='test' name='email' value='
    $email'>
    </td></tr>


    <tr>
    <td>
    Neues Passwort:
    </td> 
    <td>
    <input type='password' name='passwort1' value='
    $passwort1'>
    </td></tr>
    <tr> 
    <td>
    Neues Passwort wiederholen:
    </td> 
    <td>
    <input type='password' name='passwort2' value='
    $passwort2'>
    </td></tr> 
    <tr>
    <td>
    </td>
    <td>
    <input type='hidden' name='edit' value='
    $edit'>
    <input type='submit' name='edit' value='Änderungen übernehmen'>
    </td></form></td></tr></table>"
    ;

    }


    ?>


    Ohne die fehlerfreie Durchführung von schutz.php funktioniert auch profil.php nicht.




    Die Daten werden außerdem nicht in die MySQL Tabelle übergeben. Und wenn ich sie auf anderem Wege eintrage, interpretiert das Script die Daten nicht.
    In der Datei userlist.php:
    PHP-Code:
    <?php


    include("mysqlconnect.php");

    echo 
    "
    <table>
    "
    ;

    $sql "
    SELECT 

    FROM 
    $usertable
    ORDER by
    name"
    ;

    $result mysql_query($sql);

    while(
    $row=mysql_fetch_array($result)) {

    echo 
    "
    <tr>
    <td>"
    .$row["name"]."</td>
    <td>"
    .$row["email"]."</td>
    </tr>
    "
    ;

    }

    echo 
    "
    </table>
    "
    ;


    ?>

    wird die Fehlermeldung

    "Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in ...community\schipsel\userlist.php on line 20"
    ausgegeben, was
    dies betrifft folgenden Teil:
    PHP-Code:
    $sql "
    SELECT 

    FROM 
    $usertabelle
    ORDER by
    name"
    ;

    $result mysql_query($sql);

    /* Zeile 20 */   while($row=mysql_fetch_array($result)) {

    echo 
    "
    <tr>
    <td>"
    .$row["name"]."</td>
    <td>"
    .$row["email"]."</td>
    </tr>
    "
    ;



    Für jede Hilfe wäre ich dankbar.
    Zuletzt geändert von jay^p; 03.02.2004, 23:06.

  • #2
    OffTopic:
    häng doch beim nächsten beitrag noch deine lebensgeschichte mit dran
    h.a.n.d.
    Schmalle

    http://impressed.by
    http://blog.schmalenberger.it



    Wichtige Anmerkung: Ich habe keine Probleme mit Alkohol ...
    ... nur ohne :-)

    Kommentar


    • #3
      Ich dachte mir nur: "besser alles posten!" Sonst wird oft geschrieben, schreib code dazu.

      Nochmal die Frage: kann es sein, dass die Fehler unabhängig vom script auftreten, sondern, dass es an bestimmten Einstellungen meiner progs liegen könnte.


      Nun zu Schmalles Bitte:

      Ich wurde geboren.

      Dann kam der 03.02.2004.

      Ich öffnete einen neuen Thread auf www.php-resource.de und alles änderte sich.

      Kommentar


      • #4
        Original geschrieben von jay^p
        Ich öffnete einen neuen Thread auf www.php-resource.de und alles änderte sich.
        genau, denn hier gibt's auch ein tutorial dazu *g*

        is wahrscheinlich einfacher, das umzusetzen, das geht nämlich *g*
        Ich denke, also bin ich. - Einige sind trotzdem...

        Kommentar


        • #5
          PHP-Code:
          $connect mysql_query("SELECT * FROM $usertable WHERE LCASE(name) = LCASE('$_POST[name1]') AND pw = '"md5($_POST[pw1]) ."'"); 
          woher kommt $usertable? laß dir die query mal im klartext ausgeben, teste sie in phpmyadmin

          PHP-Code:
          passwort3 md5($_POST[passwort1]); 
          das müßte zumindest $passwort3, wenn nicht sogar $_POST["passwort3"] heißen ...

          das script ist nicht so toll ....
          Die Zeit hat ihre Kinder längst gefressen

          Kommentar


          • #6
            Vielen Dank, das habe ich ganz übersehen.

            Die Tabelle, die ich bearbeiten wollte, heißt natürlich "usertabelle".

            Die Fehlermeldung bei "anmelde.php" ist beseitigt, die Daten werden aber immernoch nicht übertragen(in die tabelle).

            P.S.: Ich mache mich mal auf die Suche nach dem Tutorial auf dieser Seite.

            Ich habe dein(gemeint ist mrhappiness) Tutorial gemacht und habe wieder das gleiche Problem. Die Daten werden nicht in die Tabelle übergeben. Außerdem kommt die Fehlermeldung

            Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in ....sessionhelpers.inc.php on line 40


            Bleibt aber immernoch die Frage offen, was nun bei diesem oben aufgeführten Script die Fehler sind...
            Zuletzt geändert von jay^p; 03.02.2004, 18:25.

            Kommentar


            • #7
              poste mal die funktion, in der zeile 40 is

              und am besten noch das sql-statement ausgeben (echo $sql
              Ich denke, also bin ich. - Einige sind trotzdem...

              Kommentar


              • #8
                Die Funktion ist:

                function logged_in()
                {
                $sql="SELECT UserId
                FROM users
                WHERE UserSession='".session_id()."'
                LIMIT 1";
                $result= mysql_query($sql);
                return ( mysql_num_rows($result)==1);
                }

                Ich vermute, dass "mysql_num_rows()" bei mir deaktiviert ist. Kann das sein? Auch die nicht übergebenen Daten an die Tabelle haben vielleicht etwas damit zu tun.

                Wo muss ich denn das "echo $sql;" hinsetzten, wenn ich es ans Ende der scripte vor dem abschließenden "?>"-Tag hinsetzte, passiert zumindest nichts.

                Kommentar


                • #9
                  schreib das mal so
                  PHP-Code:
                  function logged_in()
                  {
                  $sql="SELECT UserId
                  FROM users
                  WHERE UserSession='"
                  .session_id()."'
                  LIMIT 1"
                  ;
                  echo 
                  $sql;
                  $result=mysql_query($sql) or die(mysql_error());
                  return ( 
                  mysql_num_rows($result)==1);

                  Ich denke, also bin ich. - Einige sind trotzdem...

                  Kommentar


                  • #10
                    Ich vermute, dass "mysql_num_rows()" bei mir deaktiviert ist. Kann das sein? Auch die nicht übergebenen Daten an die Tabelle haben vielleicht etwas damit zu tun.
                    das kann ich mir nun wirklich nicht vorstellen

                    der fehler sagt dir, daß du ne ungültige result-resource verwendest, die du ne zeile weiter oben erzeugst ...

                    kommt vielleicht daher, daß deine query nicht 'funktioniert'.

                    aber wir werden es ja gleich sehen ...
                    Die Zeit hat ihre Kinder längst gefressen

                    Kommentar


                    • #11
                      Vorhang auf: (*husch*)

                      Durch ganz besondere Konnexionen zu meinem Browser, verriet mir dieser, er habe folgendes Statement von SQL gehört:
                      SELECT UserId FROM users WHERE UserSession='5edb5de69e8b585d04d9a570d1f6e403' LIMIT 1Unknown column 'UserSession' in 'where clause'

                      (man erlaube mir bitte diesen kleinen Spaß am Rande)
                      Ich habe die Daten aber "von Hand" im MySQL Monitor in der Kommandozeile eingegeben, also nicht per Formular.




                      @ derHund: ich glaube, dass ich das gedacht habe weil:
                      1. ich als PHP-Anfänger einzustufen bin.
                      2. man doch bestimmte Befehle an und ausstellen kann, ich glaube mich zu erinnern, dass da auch was in Verbindung mit _POST["name"] und das ganze ohne _POST[""] möglich ist. Also dass man bei bestimmten Einstellungen das _POST benötigt oder auch nicht( z.B. : $_POST["variable"] bzw. nur $variable).

                      Gerade dazu habe ich auch noch eine klitzekleine Frage.

                      Die da wäre, ob man in den eckigen Klammern ( [] ) vor und nach dem Namen der Variablen Anführungszeichen oder Hochkommatas setzten muss. Im PHP Handbuch wird es mit Anführungzeichen beschrieben, oft sieht man es aber auch mit Hochkommatas, spielt das überhaupt eine Rolle, solange eines von beiden vorhanden ist?
                      Zuletzt geändert von jay^p; 03.02.2004, 20:27.

                      Kommentar


                      • #12
                        mach mal
                        Code:
                        DESC users
                        was kommt da raus?
                        Ich denke, also bin ich. - Einige sind trotzdem...

                        Kommentar


                        • #13
                          SELECT UserId FROM users WHERE UserSession='5edb5de69e8b585d04d9a570d1f6e403' LIMIT 1

                          Unknown column 'UserSession' in 'where clause'
                          die spalte usersession existiert nicht in der tabelle

                          Ich habe die Daten aber "von Hand" im MySQL Monitor in der Kommandozeile eingegeben, also nicht per Formular.
                          richtig so. ist imho der einfachste weg, nicht-funktionierende querys zu überprüfen, oder halt per phpmyadmin

                          Die da wäre, ob man in den eckigen Klammern ( [] ) vor und nach dem Namen der Variablen Anführungszeichen oder Hochkommatas setzten muss. Im PHP Handbuch wird es mit Anführungzeichen beschrieben, oft sieht man es aber auch mit Hochkommatas, spielt das überhaupt eine Rolle, solange eines von beiden vorhanden ist?
                          hmm,

                          ich benutze ["bar"], richtig wäre wohl ['foo'], es gibt aber auch leute, die meinen nur [foobar] nehmen zu müssen ...
                          Die Zeit hat ihre Kinder längst gefressen

                          Kommentar


                          • #14
                            Original geschrieben von derHund
                            es gibt aber auch leute, die meinen nur [foobar] nehmen zu müssen ...
                            und denen wünsche ich, dass die lieben leute vom php-team ne konstante foobar definieren und sie sich dann dumm und dämlich nach dem fehler suchen...
                            Ich denke, also bin ich. - Einige sind trotzdem...

                            Kommentar


                            • #15
                              @ mrhappiness:
                              DESC = engegengesetzt dem Alphabet nach sortieren?!

                              Wenn du das so meinst, dass ich das so mache:
                              function logged_in()
                              {
                              $sql="SELECT UserId
                              FROM DESC users
                              ";
                              echo $sql;
                              $result=mysql_query($sql) or die(mysql_error());
                              return ( mysql_num_rows($result)==1);
                              }
                              dann bekomme ich
                              SELECT UserId FROM DESC users You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'DESC users' at line 2
                              angezeigt.

                              Wenn ich stattdessen SELECT * FROM users ORDER BY UserId DESC nehme, bekomme ich auch SELECT * FROM users ODER BY UserId DESC angezeigt + das Formular und den Link darunter.


                              @derHund:

                              uuuups, ich habe die spalte auch "usersessions" und nicht "usersession" genannt.

                              Also macht es wirklich keinen Unterschied. Aber stimmt es nicht, des man bestimmte Einstellungen vornehmen kann, sodass _POST[] weggelassen werden kann?

                              Kommentar

                              Lädt...
                              X