jaylibII: Anzeige: wieviele Beiträge hat ein User geschrieben

Guten Abend,

stehe vor einer nicht lösbaren Aufgabe. Ich habe ein Forum geschrieben. Nun möchte ich es etwas erweitern. Ich wurde auf der Linken Seite gerne noch eine Anzeige haben, wieviele Beiträge der User schon geschrieben hat.

Damit meine ich das so:

Username: Nickname

Status: Mitglied

Anzahl der Beiträge:

Joa und genau an den Beiträgen hänge ich. Wie ich meine Daten in der Datenbank speichere das seht Ihr da.

CREATE TABLE beitraege (
   postid int(11) NOT NULL auto_increment,
   threadid int(11) NOT NULL default '0',
   von text NOT NULL,
   datum text NOT NULL,
   post text NOT NULL,
   titel text NOT NULL,
   ip text NOT NULL,
   PRIMARY KEY  (postid)
) TYPE=MyISAM AUTO_INCREMENT=16 ;

Kann mir nun jemand helfen wie ich das umsetzen muss?

Gruß jaylibII

  1. echo $begrueszung;

    stehe vor einer nicht lösbaren Aufgabe.

    Das glaube ich nicht... :-)

    ... wieviele Beiträge der User schon geschrieben hat.

    SELECT COUNT(*) AS anzahl FROM beitraegeWHEREvon = 'dedlfix';

    echo "$verabschiedung $name";

    1. Hallo,

      Das glaube ich nicht... :-)

      na ja ich meinte das auch eher so, dass wenn ich das selber machen müsste :-)

      ... wieviele Beiträge der User schon geschrieben hat.

      SELECT COUNT(*) AS anzahl FROM beitraegeWHEREvon = 'dedlfix';

      hmm wenn ich mir den Coe so ansehe, dann wir jetzt in deinem Beispiel nur die Beiträge mit 'dedlfix' ausgegeben und das will ich ja nicht denn  ich kann das ja nicht bei jedem Beitrag machen. Das soll ja schon selber gehen bei jedem User. Verstehst du was ich meine?

      Gruß jaylibII

      1. echo $begrueszung;

        ... wieviele Beiträge der User schon geschrieben hat.

        SELECT COUNT(*) AS anzahl FROM beitraegeWHEREvon = 'dedlfix';

        hmm wenn ich mir den Coe so ansehe, dann wir jetzt in deinem Beispiel nur die Beiträge mit 'dedlfix' ausgegeben und das will ich ja nicht denn  ich kann das ja nicht bei jedem Beitrag machen. Das soll ja schon selber gehen bei jedem User. Verstehst du was ich meine?

        Ich hoffe...

        Normalerweise kommen nicht immer alle User auf einer Seite vor.

        SELECT von,COUNT(*) AS 'anzahl' FROM beitraegeWHEREvonIN ('dedlfix','jaylibII') GROUP BYvon;

        Damit bekommst du einige User, wenn du alle haben willst, lass die WHERE-Klausel weg.

        echo "$verabschiedung $name";

        1. Hi,

          ich glaube du hast mich nicht so richtig verstanden. Schau dir mal das Beispiel an:

          http://www.phpbb.de/viewtopic.php?t=77573

          da steht ja auf der Linken Seite:

          Name:
          Status:
          Beiträge:

          und genau um "Beiträge" geht es.

          Gruß jaylibII

          1. hi,

            ich glaube du hast mich nicht so richtig verstanden.

            nein, ich glaube umgekehrt.

            Schau dir mal das Beispiel an:
            http://www.phpbb.de/viewtopic.php?t=77573

            lies bitte </faq/#Q-19>, danke.

            btw: die adresse ist von meinem rechner aus nicht zu erreichen.

            da steht ja auf der Linken Seite:

            Name:
            Status:
            Beiträge:

            und genau um "Beiträge" geht es.

            und wie man die auslesen kann, hat dedlfix dir doch gesagt - wo ist also jetzt das problem?

            gruß,
            wahsaga

            --
            /voodoo.css:
            #GeorgeWBush { position:absolute; bottom:-6ft; }
            1. Guten Abend,

              nein, ich glaube umgekehrt.

              hmm, verstehe ich jetzt nicht so richtig aber egal....

              btw: die adresse ist von meinem rechner aus nicht zu erreichen.

              komisch bie mir geht der Link

              und wie man die auslesen kann, hat dedlfix dir doch gesagt - wo ist also jetzt das problem?

              jepp ich weiß dass er mir das erklärt hat aber nur wenn ich ein Namen angebe also z.B. jaylibII aber wenn ich ein User nun bei mir neu Registirert und dann gleich ein Beitrag schreibt dann steht ja bei dem z.B.

              Name: XYZ

              Status: New

              Beiträge 1

              Bei mir steht dann unter dessen:

              Name: jaylibII

              Status: Admin

              Beiträge 400

              Und genau da ist mein Problem es soll immer angezeigt werden wieviel Beiträge der User schon geschrieben hat. Also net auf seinem Profil oder so nee sondern in dem Tread drin.

              verstehst du was ich meine?

              Gruß jaylibII

              1. hi,

                Und genau da ist mein Problem es soll immer angezeigt werden wieviel Beiträge der User schon geschrieben hat. Also net auf seinem Profil oder so nee sondern in dem Tread drin.

                ja dann musst du diese information wohl an der stelle, wo du dir auch die anderen informationen, die einen "thread" ausmachen, wohl aus der DB besorgen, meinst du nicht?

                du liest den thread aus der DB, und erhältst von dort die info, die antwort xy wurde von user abc geschrieben. also machst du an dieser stelle jetzt noch eine abfrage, wie viele beiträge user abc geschrieben hat, und gibst diesen wert an der richtigen stelle aus.

                gruß,
                wahsaga

                --
                /voodoo.css:
                #GeorgeWBush { position:absolute; bottom:-6ft; }
          2. echo $begrueszung;

            Hi,

            ich glaube du hast mich nicht so richtig verstanden. Schau dir mal das Beispiel an:

            http://www.phpbb.de/viewtopic.php?t=77573

            Genau das hatte ich im Sinn. Ich weiß jetzt nur nicht, wo dein Problem liegt, die Zählabfragen bei dir einzubauen. Meinst du, dass du bereits eine bestehende Abfrage hast, à la

            SELECT * FROM beitraege WHERE threadid = irgendwas

            und da jetzt noch die Anzahl mit eingebaut haben möchtest?

            Sowas geht dann mit Subselects (ab MySQL 4.1 vorhanden) und einer Verknüpfung

              
            SELECT beitraege.*, bpu.anzahl  
            FROM beitraege  
            LEFT JOIN (SELECT von,COUNT(*) AS anzahl FROM beitraege GROUP BY von) AS bpu  
              ON beitraege.von = bpu.von  
            WHERE threadid = irgendwas  
            
            

            echo "$verabschiedung $name";

            1. Hallo,

              es kann auch sein, dass ich gerade voll auf der Leitung stehe aber hier mal der Code wie ich das bis jetzt geamcht habe mit der Ausgabe. Wo müsste das dann noch von dir hin?

              Hier mal der Code:

              <?php
              include("config.php"); // config datei laden.

              //echo "<a href=index.php>Zur&uuml;ck zur &uuml;bersicht</a><br><br>";

              $threadid = $_GET['threadid']; // threadid aus adressleiste auslesen

              $fp = fopen("template_post.html","r");  // teamplate zum lesen(r) &ouml;ffnen
              $template = fread($fp,filesize("template_post.html"));  // inhalt der template datei in die teamplate variable laden.

              $sql = mysql_query("SELECT * FROM posts  WHERE threadid = '$threadid' ORDER BY postid ASC"); // mysql select befehl

              while($row = mysql_fetch_Assoc($sql)) { // l&auml;d bei jedem durchgang(immer die n&auml;chste) eine zeile aus der tabelle in einen array in die variable $row

              $titel = $row['titel'];  // titel besorgen
                  $von = $row['von'];  // von besorgen
                  $datum = $row['datum']; // datum besorgen
                  $post = $row['post']; // post besorgen

              $datum = strftime("%d.%m.%Y",$datum); //  datum formatieren

              $ausgabe = $template;

              $ausgabe = str_replace("{von}",'<a href http://../pr.php?user=' . $von . '">' . $von . '</a>',$ausgabe);  // von ins template einsetzen
                  $ausgabe = str_replace("{titel}",$titel,$ausgabe);  // titel ins template einsetzen
                  $ausgabe = str_replace("{datum}",$datum,$ausgabe); // datum ins template einsetzen

              $ausgabe = str_replace("{text}",echo_message($post,false,true),$ausgabe); // den post text ins template einsetzen

              $ausgabe = str_replace("{message}",'<a href http://../post.php?show=write&amp;empfaenger=' . $von . '">Message schreiben</a>',$ausgabe); // den post text ins template einsetzen

              echo $ausgabe;

              };
              ?>

              Gruß jaylibII

              1. echo $begrueszung;

                es kann auch sein, dass ich gerade voll auf der Leitung stehe aber hier mal der Code wie ich das bis jetzt geamcht habe mit der Ausgabe. Wo müsste das dann noch von dir hin?

                Nun... Folgende Möglichkeiten sehe ich da:

                (1) Du tauschst dein Select gegen die SubSelect-Variante aus.
                Dazu brauchst du MySQL 4.1 und das ist in freier Wildbahn momentan noch einigermaßen selten anzutreffen.

                (2) Du startest innerhalb deines while-Blocks meine erste Variante.
                Damit hast du bei mehrfachem Vorkommen des gleich Users im Thread unnötige mehrfache Abfragen. Das könnte man umgehen indem man diese Abfrageergebnisse in einem Array zwischenspeichert und erstmal da nachschaut, ob man den User schon gezählt hat ...

                (3) Du nimmst meine Variante 2 (ohne die WHERE-Klausel), setzt die vor deine Abfrage, und liest die Ergebnisse in ein Array ein, das du dann innerhalb deines while-Blocks befragst.
                Das wird mit steigender User-Anzahl aber immer uneffektiver.

                Ich würde Nummer (2) vorschlagen.

                echo "$verabschiedung $name";

                1. Hallo,

                  (2) Du startest innerhalb deines while-Blocks meine erste Variante.
                  Damit hast du bei mehrfachem Vorkommen des gleich Users im Thread unnötige mehrfache Abfragen. Das könnte man umgehen indem man diese Abfrageergebnisse in einem Array zwischenspeichert und erstmal da nachschaut, ob man den User schon gezählt hat ...

                  Ich würde Nummer (2) vorschlagen.

                  deine erste Variante war ja das odeR?

                  SELECT beitraege.*, bpu.anzahl
                  FROM beitraege
                  LEFT JOIN (SELECT von,COUNT(*) AS anzahl FROM beitraege GROUP BY von) AS bpu
                    ON beitraege.von = bpu.von
                  WHERE threadid = irgendwas

                  Gruß jaylibII

                  1. echo $begrueszung;

                    deine erste Variante war ja das odeR?

                    Nein, das war die SubSelect-Variante.
                    Variante 1 war das: https://forum.selfhtml.org/?t=103805&m=639605

                    echo "$verabschiedung $name";

                    1. Hallo,

                      Nein Variante 1 war das: https://forum.selfhtml.org/?t=103805&m=639605

                      hmm nee ich kann das doch net nehmen, ich kann ja nifcht für jeden Benutzer soetwas anlegen das währe sehr viel Arbiet und bei dem was du geschrieben hast wir in deinem Beispiel ja nur

                      SELECT COUNT(*) AS anzahl FROM beitraege WHERE von = 'dedlfix';

                      'dedlfix'

                      ausgelesen und das ist ja falsch. Was ist jetzt wenn z.B. ein Tread 100 Leute geantwortet haben. Dann muss ich da 100 Namen eintragen das ist ja wohl nicht der Sinner der Sache oder?

                      Oder habe ich das alles ganz falsch geschrieben ?`

                      Gruß jaylibII

                      1. hi,

                        hmm nee ich kann das doch net nehmen, ich kann ja nifcht für jeden Benutzer soetwas anlegen das währe sehr viel Arbiet und bei dem was du geschrieben hast wir in deinem Beispiel ja nur

                        SELECT COUNT(*) AS anzahl FROM beitraege WHERE von = 'dedlfix';

                        'dedlfix'

                        ausgelesen und das ist ja falsch.

                        Was ist jetzt wenn z.B. ein Tread 100 Leute geantwortet haben. Dann muss ich da 100 Namen eintragen das ist ja wohl nicht der Sinner der Sache oder?

                        himmel, ist das dein ernst?

                        von jemandem, der behauptet, selbst ein forum programmiert zu haben, darf man doch wohl erwarten, dass er in der lage ist, einen variableninhalt als dynamischen parameter in einem string einzufügen ...?

                        gruß,
                        wahsaga

                        --
                        /voodoo.css:
                        #GeorgeWBush { position:absolute; bottom:-6ft; }
                        1. Hi,

                          von jemandem, der behauptet, selbst ein forum programmiert zu haben, darf man doch wohl erwarten, dass er in der lage ist, einen variableninhalt als dynamischen parameter in einem string einzufügen ...?

                          nee bei der Abfrage vom Forum war es ja kein Problem einfach die ganzen Daten aus der DB abzufragen aber das ist nun was anderes. Aber wenn es dir zu viel ist mir was zu sagen dann lass es einfach ich zwing dich ja zu nichts.

                          1. hi,

                            nee bei der Abfrage vom Forum war es ja kein Problem einfach die ganzen Daten aus der DB abzufragen aber das ist nun was anderes. Aber wenn es dir zu viel ist mir was zu sagen dann lass es einfach ich zwing dich ja zu nichts.

                            wenn es dir zu viel ist, die grundzüge der von dir verwendeten techniken zu erlernen, dann lasse dieses feature in deinem forum halt auch einfach weg - da zwingt dich ja auch keiner zu was.

                            gruß,
                            wahsaga

                            --
                            /voodoo.css:
                            #GeorgeWBush { position:absolute; bottom:-6ft; }
                            1. Hi,

                              wenn es dir zu viel ist, die grundzüge der von dir verwendeten techniken zu erlernen, dann lasse dieses feature in deinem forum halt auch einfach weg - da zwingt dich ja auch keiner zu was.

                              hmm nee das will ich ja auch nicht sonst hätte ich ja hier gar nicht danach gefragt. Nur wenn ich dann solche Antworten wie von dir bekomme ob ich wohl zu doof bin ( wenn du das auch nicht so gesagt hast ) dann werde ich schon leicht sauer denn Beiträge aus einer Db auszulesen ist was anderes als das was ich will denn hier muss ja was zusammen gezähl werden und dann muss das auch noch dem richtigen Benutzer zugeordnet werden....

                              Gruß jaylibII

                              1. hi,

                                Nur wenn ich dann solche Antworten wie von dir bekomme ob ich wohl zu doof bin ( wenn du das auch nicht so gesagt hast ) dann werde ich schon leicht sauer denn Beiträge aus einer Db auszulesen ist was anderes als das was ich will denn hier muss ja was zusammen gezähl werden und dann muss das auch noch dem richtigen Benutzer zugeordnet werden....

                                und ein forum "programmieren" ist etwas anderes, als einfach mal ein paar daten auszugeben, die einem zufällig aus der DB fix und fertig entgegengeflogen kommen.

                                und wenn du an dieser m.E. trivialen stelle, eine WHERE-bedingung für eine query dynamisch in abhängigkeit von anderen, vorher ausgelesenen daten zu erstellen, scheiterst - dann fehlen dir wie gesagt noch einige der nötigen grundlagen, die man sich angeeignet haben sollte, _bevor_ man sich einer aufgabe dieser größenordnung stellt.

                                und wenn du jetzt "sauer" bist, weil ich wieder mal darauf hinweise, dass anfänger sich nicht ständig übernehmen, sondern stück für stück an _kleinen_ aufgaben lernen sollten - dann sei's von mir aus.

                                gruß,
                                wahsaga

                                --
                                /voodoo.css:
                                #GeorgeWBush { position:absolute; bottom:-6ft; }
                                1. Guten Abend,

                                  und wenn du jetzt "sauer" bist, weil ich wieder mal darauf hinweise, dass anfänger sich nicht ständig übernehmen, sondern stück für stück an _kleinen_ aufgaben lernen sollten - dann sei's von mir aus.

                                  ich habe mit dem Forum sehr klein Angefangen. Es stellt lediglich ein paar Rubriken da wo eine ID haben. Wenn ich dann ein Tread aufmache dann übergebe ich einfach die Id und wenn ich dann noch auf den Tread antworte dann übergebe ich wieder eine ID das ist kein Problem. Wenn ich groß anfagen wollte dann hätte ich noch ganz andere Ziele wie z.B.

                                  • eine Suche
                                  • Smilies
                                  • Fett. Kursiev
                                  • usw.....

                                  also du siehst ich habe ganz kleine Angefangen.

                                  Gruß jaylibII

                      2. echo $begrueszung;

                        hmm nee ich kann das doch net nehmen, ich kann ja nifcht für jeden Benutzer soetwas anlegen das währe sehr viel Arbiet und bei dem was du geschrieben hast wir in deinem Beispiel ja nur

                        SELECT COUNT(*) AS anzahl FROM beitraege WHERE von = 'dedlfix';

                        'dedlfix'

                        ausgelesen und das ist ja falsch. Was ist jetzt wenn z.B. ein Tread 100 Leute geantwortet haben. Dann muss ich da 100 Namen eintragen das ist ja wohl nicht der Sinner der Sache oder?

                        *seufz* :-) Du musst natürlich statt 'dedlfix' den $row['von'] nehmen.

                        Auf das wesentlichste reduziert sieht das dann so aus

                          
                        $ppu = array(); // posts per user  
                          
                        $sql = "SELECT * FROM posts  WHERE threadid = '$threadid'";  
                        ...  
                        while ($row = fetch...) {  
                          
                          $von = $row['von'];  
                          
                          if (!isset($ppu[$von])) {  
                            $ppusql = "SELECT COUNT(*) AS anzahl FROM `beitraege` WHERE `von`='$von'"; //[1]  
                            ...query...  
                            $ppurow = fetch...  
                            $ppu[$von] = $ppurow['anzahl'];  
                          }  
                          $anzahl = $ppu[$von];  
                          
                          ...  
                          
                        }  
                        
                        

                        Jetzt besser? :-)

                        echo "$verabschiedung $name";

                        [1] Auch wenn der User noch nichts gepostet hat liefert diese Abfrage einen Datensatz zurück.

                        1. Hi,

                          danke für deine Hilfe,

                          aber es geht nicht. Aber ist mir nun auch egal ich lass das nun doch weg denn ich rege mich darüber jetzt nicht mehr aus. Es gibt wichtigeres also eine Anzeige der Beiträge.

                          Gruß jaylibII

                          1. Hallo,

                            so hab es jetzt doch mal versucht.

                            Jetzt kommt aber nur:

                            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 'Resource id #12' at line 1

                            was mache ich denn jetzt schon wieder falsch?

                            Gruß jaylibII

                            1. echo $begrueszung;

                              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 'Resource id #12' at line 1

                              was mache ich denn jetzt schon wieder falsch?

                              Das sieht so aus, als ob du eine falsche Variable in die SQL-Abfrage eingebaut hast.

                              echo "$verabschiedung $name";

                              1. Hi,

                                hab das nun mal so gemacht:

                                <?php
                                include("config.php"); // config datei laden.

                                //echo "<a href=index.php>Zur&uuml;ck zur &uuml;bersicht</a><br><br>";

                                $ppu = array(); // posts per user

                                $threadid = $_GET['threadid']; // threadid aus adressleiste auslesen

                                $fp = fopen("template_post.html","r");  // teamplate zum lesen(r) &ouml;ffnen
                                $template = fread($fp,filesize("template_post.html"));  // inhalt der template datei in die teamplate variable laden.

                                $sql = mysql_query("SELECT * FROM simple_posts  WHERE threadid = '$threadid' ORDER BY postid ASC"); // mysql select befehl

                                while($row = mysql_fetch_Assoc($sql)) { // l&auml;d bei jedem durchgang(immer die n&auml;chste) eine zeile aus der tabelle in einen array in die variable $row

                                $von = $row['von'];

                                if (!isset($ppu[$von])) {
                                    $ppusql = "SELECT COUNT(*) AS anzahl FROM simple\_posts WHERE von='$von'"; //[1]
                                mysql_query($ppusql) OR die(mysql_error());
                                //    $ppurow = mysql_fetch_assoc($ppusql);
                                    $ppu[$von] = $ppurow['anzahl'];
                                  }
                                    $titel = $row['titel'];  // titel besorgen
                                    $von = $row['von'];  // von besorgen
                                    $datum = $row['datum']; // datum besorgen
                                    $post = $row['post']; // post besorgen
                                    $anzahl = $ppurow['anzahl'];
                                    $datum = strftime("%d.%m.%Y",$datum); //  datum formatieren

                                $ausgabe = $template;

                                $ausgabe = str_replace("{von}",'<a href http://../pr.php?user=' . $von . '">' . $von . '</a>',$ausgabe);  // von ins template einsetzen
                                    $ausgabe = str_replace("{titel}",$titel,$ausgabe);  // titel ins template einsetzen
                                    $ausgabe = str_replace("{datum}",$datum,$ausgabe); // datum ins template einsetzen

                                $anzahl = str_replace("{anzahl}",$ppu,$ausgabe);

                                $ausgabe = str_replace("{text}",echo_message($post,false,true),$ausgabe); // den post text ins template einsetzen

                                $ausgabe = str_replace("{message}",'<a href http://../post.php?show=write&amp;empfaenger=' . $von . '">Message schreiben</a>',$ausgabe); // den post text ins template einsetzen

                                echo $ausgabe;

                                };
                                ?>

                                Jetzt kommt aber keine Fehlermeldung mehr am in mein Template schreibt er auch nichts. Das heißt er macht da nur den Platzhalter, das sieht dann so aus:

                                {anzahl} Beiträge

                                Gruß jaylibII

                                1. echo $begrueszung;

                                  if (!isset($ppu[$von])) {
                                      $ppusql = "SELECT COUNT(*) AS anzahl FROM simple\_posts WHERE von='$von'"; //[1]
                                  //    $ppurow = mysql_fetch_assoc($ppusql);

                                  So muss eine Abfrage aussehen.

                                  $ppuresult = mysql_query($ppusql) OR die(mysql_error());
                                        $ppurow = mysql_fetch_assoc($ppuresult);

                                  $anzahl = $ppurow['anzahl'];

                                  Hier musst du $ppu[$von] statt $ppurow['anzahl'] nehmen, weil $ppurow['anzahl'] falsche Daten (von vorhergehenden Schleifendurchläufen) enthält, wenn für $von bereits ein Eintrag in $ppu enthalten ist. Der Block innerhalb von if !isset... wird dann ja nicht abgearbeitet.

                                  $anzahl = str_replace("{anzahl}",$ppu,$ausgabe);

                                  Meinst du nicht, es ist besser, das so zu schreiben? :-)

                                  $ausgabe = str_replace("{anzahl}",$anzahl,$ausgabe);

                                  Jetzt kommt aber keine Fehlermeldung mehr

                                  Du hättest ein paar Warnungen/Notizen erhalten, wenn du sie zulassen würdest:

                                  error_reporting(E_ALL);

                                  siehe: Handbuch-Kapitel Fehlerbehandlung

                                  Weiterhin solltest du beachten, dass du Probleme bekommst, wenn deine User ein ' im Namen haben.
                                  Deine SQL-Abfragen werden dadurch mindestens syntaktisch inkorrekt. Es könnte aber auch schlimmer kommen. siehe Handbuch-Kapitel SQL-Injection
                                  Du kannst das vermeiden, wenn du Usereingaben mit mysql_real_escape_string() behandelst.

                                  echo "$verabschiedung $name";

                                  1. HuHu,

                                    hey danke was wurde ich nur ohne deine Hilfe machen :-( Aber ich muss nochmals was fragen. Hab das nun alles so geamcht wie du mir das gesagt hast. Aber wenn ich nun mein Ergebniss ansehen will dann steht da leider nur: Beiträge  das heißt also keine Zahl und nichts dafür. Wie das Skript nun aussieht das zeige ich dir gleich etwas weiter unten.

                                    Weiterhin solltest du beachten, dass du Probleme bekommst, wenn deine User ein ' im Namen haben.
                                    Deine SQL-Abfragen werden dadurch mindestens syntaktisch inkorrekt. Es könnte aber auch schlimmer kommen. siehe Handbuch-Kapitel SQL-Injection

                                    hmm das kann eigentlich nicht vor kommen bzw. das kann gar nicht vor kommen, da ich bei der Reg schon das so geamcht habe, dass es keine Sonderzeichen erlaubt sind. Das heißt der Namen kann nur aus Buchstaben und Zahlen sein. Damit ist das Problem auch schon vom Tisch oder?

                                    Hier kommt also nochamls das Skript:

                                    <?php
                                    include("config.php"); // config datei laden.

                                    //echo "<a href=index.php>Zur&uuml;ck zur &uuml;bersicht</a><br><br>";

                                    $ppu = array(); // posts per user

                                    $threadid = $_GET['threadid']; // threadid aus adressleiste auslesen

                                    $fp = fopen("template_post.html","r");  // teamplate zum lesen(r) &ouml;ffnen
                                    $template = fread($fp,filesize("template_post.html"));  // inhalt der template datei in die teamplate variable laden.

                                    $sql = mysql_query("SELECT * FROM simple_posts  WHERE threadid = '$threadid' ORDER BY postid ASC"); // mysql select befehl

                                    while($row = mysql_fetch_Assoc($sql)) { // l&auml;d bei jedem durchgang(immer die n&auml;chste) eine zeile aus der tabelle in einen array in die variable $row

                                    $von = $row['von'];

                                    if (!isset($ppu[$von])) {
                                        $ppusql = "SELECT COUNT(*) AS anzahl FROM simple\_posts WHERE von='$von'"; //[1]
                                       $ppuresult = mysql_query($ppusql) OR die(mysql_error());
                                          $ppurow = mysql_fetch_assoc($ppuresult);
                                       $ppu[$von] = $ppu[$von];
                                      }

                                    $titel = $row['titel'];  // titel besorgen
                                        $von = $row['von'];  // von besorgen
                                        $datum = $row['datum']; // datum besorgen
                                        $post = $row['post']; // post besorgen

                                    $anzahl = $ppu[$von];

                                    $datum = strftime("%d.%m.%Y",$datum); //  datum formatieren

                                    $ausgabe = $template;

                                    $ausgabe = str_replace("{von}",'<a href http://../pr.php?user=' . $von . '">' . $von . '</a>',$ausgabe);  // von ins template einsetzen
                                        $ausgabe = str_replace("{titel}",$titel,$ausgabe);  // titel ins template einsetzen
                                        $ausgabe = str_replace("{datum}",$datum,$ausgabe); // datum ins template einsetzen

                                    $ausgabe = str_replace("{anzahl}",$anzahl,$ausgabe);

                                    $ausgabe = str_replace("{text}",echo_message($post,false,true),$ausgabe); // den post text ins template einsetzen

                                    $ausgabe = str_replace("{message}",'<a href http://../post.php?show=write&amp;empfaenger=' . $von . '">Message schreiben</a>',$ausgabe); // den post text ins template einsetzen

                                    echo $ausgabe;

                                    };
                                    ?>

                                    Gruß jaylibII

                                    1. echo $begrueszung;

                                      Aber ich muss nochmals was fragen. Hab das nun alles so geamcht wie du mir das gesagt hast.

                                      An welcher Stelle hast du denn aufgehört zu verstehen? Du sollst doch nicht nur abtippen sondern am Ende auch noch daraus was gelernt haben. :-)

                                      Handbuch-Kapitel SQL-Injection

                                      hmm das kann eigentlich nicht vor kommen bzw. das kann gar nicht vor kommen, da ich bei der Reg schon das so geamcht habe, dass es keine Sonderzeichen erlaubt sind. Das heißt der Namen kann nur aus Buchstaben und Zahlen sein. Damit ist das Problem auch schon vom Tisch oder?

                                      Nicht unbedingt. Wenn du mit "Reg" nur die Erstregistrierung meinst, hast du zwar keine solchen Sonderzeichen in der DB stehen, sie können aber immer noch beim "alltäglichen" Login eingegeben werden, und dann fragst du (möglicherweise) ungeprüft/unmaskiert die DB ab...

                                      $ppu[$von] = $ppu[$von];

                                      Diese Zeile war doch schon mal richtig gewesen. Hier hättest du nichts zu ändern brauchen.
                                      So bringt sie natürlich keine Punkte mehr...

                                      echo "$verabschiedung $name";

                                      1. Guten Morgen,

                                        Nicht unbedingt. Wenn du mit "Reg" nur die Erstregistrierung meinst, hast du zwar keine solchen Sonderzeichen in der DB stehen, sie können aber immer noch beim "alltäglichen" Login eingegeben werden, und dann fragst du (möglicherweise) ungeprüft/unmaskiert die DB ab...

                                        hmm mit "Reg" meine ich wirklich die Erstregistrierung., Klar frage ich die beim Login ob der Benutzname in der DB wsteht oder nichtwenn nicht dann wird er auf eine FehlerSeite geleitet. Wenn der Name richtig ist, dann kommt er auf die Seite wo er hin soll. Oder was meinst du genau?

                                        $ppu[$von] = $ppu[$von];

                                        Diese Zeile war doch schon mal richtig gewesen. Hier hättest du nichts zu ändern brauchen.
                                        So bringt sie natürlich keine Punkte mehr...

                                        Na ja dann habe ich das nun mal wieder so geamcht: $ppu[$von] = $ppurow['anzahl'];

                                        aber wenn ich mir das jetzt ansehen also aufdem Server dann kommt immer noch folgendes:

                                        Beiträge

                                        also wieder keine Anzalh der Beiträge :-(

                                        Gruß jaylibII

                                        1. echo $begrueszung;

                                          Nicht unbedingt. Wenn du mit "Reg" nur die Erstregistrierung meinst, hast du zwar keine solchen Sonderzeichen in der DB stehen, sie können aber immer noch beim "alltäglichen" Login eingegeben werden, und dann fragst du (möglicherweise) ungeprüft/unmaskiert die DB ab...

                                          hmm mit "Reg" meine ich wirklich die Erstregistrierung., Klar frage ich die beim Login ob der Benutzname in der DB wsteht oder nichtwenn nicht dann wird er auf eine FehlerSeite geleitet. Wenn der Name richtig ist, dann kommt er auf die Seite wo er hin soll. Oder was meinst du genau?

                                          Ich vermute, dass du bei ebendiesem Abfragen dann sowas machst:

                                          $username = $_POST['username'];
                                          $sql = "SELECT userdaten FROM user WHERE username='$username'";
                                          if (keine Datensätze)
                                            fehler
                                          else
                                            willkommen(ersterdatensatz['vorname'])

                                          Wenn nicht, dann hast du vielleicht doch richtig gemacht :-)
                                          Wenn ja, dann ergibt eine Eingabe wie O'Conner einen Syntaxfehler, und ein
                                          ' or 1 or '
                                          ergibt keinen, stattdessen gibt es alle Benutzer zurück, da die Bedingung insgesamt sich zu true auflöst und somit bei _jedem_ Datensatz wahr ist. Und da du möglicherweise von der Richtigkeit deiner Abfrage überzeugt bist, wertest du nur den ersten Datensatz aus und das könnte zufälligerweise auch der Admin sein, weil der sich meist zuerst einträgt...

                                          Das umgehst du, indem du die Benutzereingaben mittels vorgesehener Funktion entschärfst:

                                          $sql = "SELECT userdaten FROM user WHERE username='".mysql_real_escape_string($username)."'";

                                          Was dein immer noch nicht funktionierendes "Beiträge" angeht, weiß ich momentan auch nicht weiter. Daher kann ich nur allgemeinen Rat erteilen:

                                          Hast du mal error_reporting(E_ALL); an den Anfang deines Scripts gesetzt? Das zeigt noch ein paar Informationen zu möglichen Fehlern an.
                                          Geh doch mal schrittweise durch dein Script und lass dir den Inhalt der Variablen anzeigen z.B. mit var_dump($varname); und vergleiche die Ausgabe mit dem von dir erwarteten Wert.

                                          echo "$verabschiedung $name";

                                          1. Guten Morgen,

                                            so nun bin ich auch ein Stück weiter gekommen. Wenn ich mir alle Fehler ausgeben lassen, dann kommt folgendes:

                                            Notice: Array to string conversion in /www/htdocs/v148789/forum/topic.php on line 235

                                            hmm in der besagten Zeile steht aber nur:

                                            $ausgabe = str_replace("{anzahl}",$ppurow,$ausgabe);

                                            hmm ich weiß net was da wieder ist, denn das habe ich sonst so auch mit jeder Ausgabe geamcht und beim Nickname und so geht auch alles nur bei den Beiträgen eben net. Bei der Ausgabe steht außerdem noch folgendes:

                                            Beiträge: Array Beiträge

                                            Hier nochamls das komplette Skript:

                                            <?php
                                            include("config.php"); // config datei laden.
                                            error_reporting(E_ALL);
                                            //echo "<a href=index.php>Zur&uuml;ck zur &uuml;bersicht</a><br><br>";

                                            $ppu = array(); // posts per user

                                            $threadid = $_GET['threadid']; // threadid aus adressleiste auslesen

                                            $fp = fopen("template_post.html","r");  // teamplate zum lesen(r) &ouml;ffnen
                                            $template = fread($fp,filesize("template_post.html"));  // inhalt der template datei in die teamplate variable laden.

                                            $sql = mysql_query("SELECT * FROM simple_posts  WHERE threadid = '$threadid' ORDER BY postid ASC"); // mysql select befehl

                                            while($row = mysql_fetch_Assoc($sql)) { // l&auml;d bei jedem durchgang(immer die n&auml;chste) eine zeile aus der tabelle in einen array in die variable $row

                                            $von = $row['von'];

                                            if (!isset($ppu[$von])) {
                                                  $ppusql = "SELECT COUNT(*) AS anzahl FROM simple\_posts WHERE von='$von'"; //[1]
                                               $ppuresult = mysql_query($ppusql) OR die(mysql_error());
                                                  $ppurow = mysql_fetch_assoc($ppuresult);
                                                $ppu[$von] = $ppurow['anzahl']; ;
                                              }

                                            $titel = $row['titel'];  // titel besorgen
                                                $von = $row['von'];  // von besorgen
                                                $datum = $row['datum']; // datum besorgen
                                                $post = $row['post']; // post besorgen

                                            $ppu= $ppurow['anzahl'];

                                            $datum = strftime("%d.%m.%Y",$datum); //  datum formatieren

                                            $ausgabe = $template;

                                            $ausgabe = str_replace("{von}",'<a href http://../pr.php?user=' . $von . '">' . $von . '</a>',$ausgabe);  // von ins template einsetzen
                                                $ausgabe = str_replace("{titel}",$titel,$ausgabe);  // titel ins template einsetzen
                                                $ausgabe = str_replace("{datum}",$datum,$ausgabe); // datum ins template einsetzen

                                            $ausgabe = str_replace("{anzahl}",$ppurow,$ausgabe);

                                            $ausgabe = str_replace("{text}",echo_message($post,false,true),$ausgabe); // den post text ins template einsetzen

                                            $ausgabe = str_replace("{message}",'<a href http://../post.php?show=write&amp;empfaenger=' . $von . '">Message schreiben</a>',$ausgabe); // den post text ins template einsetzen

                                            echo $ausgabe;

                                            };
                                            ?>

                                            Gruß jaylibII

                                            PS: Das mit der Sicherheit das muss ich mir erst nochamls genau ansehen. Da komme ich gerade nicht so mit aber eines nach dem anderen wurde ich sagen :-)

                                            1. yo,

                                              PS: Das mit der Sicherheit das muss ich mir erst nochamls genau ansehen. Da komme ich gerade nicht so mit aber eines nach dem anderen wurde ich sagen :-)

                                              ich würde dir raten, die fehlerquellen erst einmal einzuschränken und die sql abfragen seperat von dem php code zu lösen. dazu gibt es hilfreiche tools wie phpmyadmin, wo man auch mal einen sql-statement ausführen kann und die ergebnisse bekommt, ohne gleich eigenen php code zu programmieren. falls dein dbms unterabfragen erlaubt, kannst du ja mal meine oben gennante abfrage versuchen und schauen, ob sie geht oder nicht. und wenn du dann funktionierende sql abfragen hast, dann erst würde ich es in deinen php code einbauen.

                                              Ilja

                                            2. echo $begrueszung;

                                              so nun bin ich auch ein Stück weiter gekommen. Wenn ich mir alle Fehler ausgeben lassen, dann kommt folgendes:

                                              Notice: Array to string conversion in /www/htdocs/v148789/forum/topic.php on line 235

                                              hmm in der besagten Zeile steht aber nur:

                                              $ausgabe = str_replace("{anzahl}",$ppurow,$ausgabe);

                                              hmm ich weiß net was da wieder ist,

                                              str_replace() erwartet einen String, du übergibst hier das mysql_fetch_assoc-Ergebnis, ein Array. Dabei erzeugt es die Notiz und PHP wandelt stillschweigend das Array in einen String um. Diese Umwandlung ist bei einem Array nicht so sonderlich sinnvoll, deswegen wird als Ersatz ein "Array" ausgegeben.

                                              denn das habe ich sonst so auch mit jeder Ausgabe geamcht und beim Nickname und so geht auch alles nur bei den Beiträgen eben net.

                                              Dann vergleiche noch mal genau und erkenne den Unterschied..

                                              Hier nochamls das komplette Skript:

                                              Dann werde ich diesmal das gesamte Script kommentieren, sonst werden wir wohl nie fertig... :-)

                                              <?php
                                              include("config.php"); // config datei laden.
                                              error_reporting(E_ALL);
                                              //echo "<a href=index.php>Zur&uuml;ck zur &uuml;bersicht</a><br><br>";

                                              $ppu = array(); // posts per user

                                              $ppu ist das Array, indem die Abfragen der Postingsanzahl pro am Thread beteiligtem User zwischengespeichert werden, damit das nicht bei jedem Schleifendurchlauf für bereits abgefragte User nochmal getan werden muss.

                                              $ppu wird bei jedem zum Thread neu hinzugekommenen Poster um ein Element erweitert. So dass sich irgendwann sowas in der Art ergibt:

                                              $ppu = array(
                                                'user1' => 42,
                                                'user2' => 815,
                                                ...);

                                              Dieses Variable darfst du hier nicht für andere Zwecke missbrauchen. Sonst klappt das ganze System der Zwischenspeicherung natürlich nicht mehr.

                                              $threadid = $_GET['threadid']; // threadid aus adressleiste auslesen

                                              $fp = fopen("template_post.html","r");  // teamplate zum lesen(r) &ouml;ffnen
                                              $template = fread($fp,filesize("template_post.html"));  // inhalt der template datei in die teamplate variable laden.

                                              $sql = mysql_query("SELECT * FROM simple_posts  WHERE threadid = '$threadid' ORDER BY postid ASC"); // mysql select befehl
                                              while($row = mysql_fetch_Assoc($sql)) { // l&auml;d bei jedem durchgang(immer die n&auml;chste) eine zeile aus der tabelle in einen array in die variable $row

                                              Diese zwei Zeilen schreiben sich besser so:

                                              $sql = "SELECT * FROM simple_posts  WHERE threadid = '".mysql_real_query($threadid)."' ORDER BY postid ASC";
                                                $result = mysql_query($sql) or die(mysql_error());
                                                while($row = mysql_fetch_Assoc($result)) {

                                              Das hat den Vorteil, dass du im Bedarfsfall ein echo $sql; machen kannst, um zu sehen, wie dein SQL-Statement wirklich aussieht, das du zum mysql_query schickst.

                                              In den Kommentaren musst du übrigens die Umlaute nicht umwandeln. Die können dort ruhig lesbar als äöü stehen.

                                              $von = $row['von'];

                                              if (!isset($ppu[$von])) {
                                                  $ppusql = "SELECT COUNT(*) AS anzahl FROM simple\_posts WHERE von='$von'";
                                                  $ppuresult = mysql_query($ppusql) OR die(mysql_error());
                                                  $ppurow = mysql_fetch_assoc($ppuresult);
                                                  $ppu[$von] = $ppurow['anzahl']; ;
                                                }

                                              Nach dieser if-Anweisung steht die Anzahl der Postings des aktuellen Users auf jeden Fall in $ppu[$von]. Entweder stand dies aufgrund einer früheren Abfrage schon drin oder es wurde jetzt eingefügt.

                                              $titel = $row['titel'];  // titel besorgen
                                                  $von = $row['von'];  // von besorgen
                                                  $datum = $row['datum']; // datum besorgen
                                                  $post = $row['post']; // post besorgen

                                              $ppu= $ppurow['anzahl'];

                                              Hier überschreibst du zum einen unseren Zwischenspeicher, das Array $ppu, und zum anderen verwendest du dafür $ppurow['anzahl']. Letzteres ist enthält aber nur dann einen sinnvollen Wert, wenn vorher die Query $ppusql ausgeführt wurde. Deshalb solltest du zur Ermittlung der Anzahl nur auf $ppu[$von] zugreifen, da steht (siehe oben) immer ein sinnvoller Wert drin:

                                              $anzahl = $ppu[$von];

                                              $datum = strftime("%d.%m.%Y",$datum); //  datum formatieren

                                              $ausgabe = $template;

                                              $ausgabe = str_replace("{von}",'<a href http://../pr.php?user=' . $von . '">' . $von . '</a>',$ausgabe);  // von ins template einsetzen
                                                  $ausgabe = str_replace("{titel}",$titel,$ausgabe);  // titel ins template einsetzen
                                                  $ausgabe = str_replace("{datum}",$datum,$ausgabe); // datum ins template einsetzen

                                              $ausgabe = str_replace("{anzahl}",$ppurow,$ausgabe);

                                              So
                                                    $ausgabe = str_replace("{anzahl}",$anzahl,$ausgabe);
                                              oder so
                                                    $ausgabe = str_replace("{anzahl}",$ppu[$von],$ausgabe);
                                              ist's richtig.

                                              $ausgabe = str_replace("{text}",echo_message($post,false,true),$ausgabe); // den post text ins template einsetzen

                                              $ausgabe = str_replace("{message}",'<a href http://../post.php?show=write&amp;empfaenger=' . $von . '">Message schreiben</a>',$ausgabe); // den post text ins template einsetzen

                                              echo $ausgabe;

                                              };
                                              ?>

                                              Gruß jaylibII

                                              PS: Das mit der Sicherheit das muss ich mir erst nochamls genau ansehen. Da komme ich gerade nicht so mit aber eines nach dem anderen wurde ich sagen :-)

                                              Vielleicht noch mal zur Verdeutlichung:

                                              Ein

                                              ... WHERE user='$user'

                                              wird, wenn in $user "jaylibII" steht, zu

                                              ... WHERE user='jaylibII'

                                              und alles ist in Ordnung. Ein "jaylib'II" erzeugt einen Syntax-Fehler:

                                              ... WHERE user='jaylib'II'
                                                               ^      ^  ^  deswegen

                                              Und wenn ein "' OR 1 OR '" drinsteht, wird das zu

                                              ... WHERE user='' OR 1 OR ''

                                              Das löst sich auf zu:

                                              ... WHERE false OR true OR false

                                              bzw.

                                              ... WHERE true

                                              und hat die gleiche Wirkung wie das Weglassen der WHERE-Klausel.

                                              echo "$verabschiedung $name";

                                              1. Hallo,

                                                danke für deine Hilfe aber wenn ich das nun so mache, dann geht gar nichts mehr. Jetzt kommt dann nur noch diese Meldung:

                                                Fatal error: Call to undefined function: mysql_real_query() in /www/htdocs/v1487235/forum/topic.php on line 207

                                                in der Zeile 207 steht:

                                                $sql = "SELECT * FROM simple_posts  WHERE threadid = '".mysql_real_query($threadid)."' ORDER BY postid ASC";

                                                Ich glaube so etwas hatte ich noch nie, dass ich zwei Tage an so einem Ding sitzte :-(

                                                Gruß jaylibII

                                                1. Hi,

                                                  so habe gerade mal bie php.net nachgesehen, es gibt keine Funktion für  mysql_real_query

                                                  Hmm hast du dich da vertippt oder so?

                                                  Gruß jaylibII

                                                  1. echo $begrueszung;

                                                    so habe gerade mal bie php.net nachgesehen, es gibt keine Funktion für  mysql_real_query

                                                    Hmm hast du dich da vertippt oder so?

                                                    Ja, hab ich. Es sollte mysql_real_escape_string heißen. 'tschudigung.
                                                    Wenn du noch PHP < 4.3.0 verwendest, musst du stattdessen mysql_escape_string verwenden.

                                                    echo "$verabschiedung $name";

                                                    1. Hallo,

                                                      hey ich danke dir 10000 mal * auf die Knie gehne tu * es geht ohne wenn und aber * danke danke danke danke danke *

                                                      Gruß jaylibII

  2. yo,

    SELECT b1.von, b1.datum, b1.post, b1.titel, b1.ip,
    (SELECT COUNT(*) FROM beitraege AS b2 WHERE b2.threadid='werte_für_den_thread' AND b2.von=b1.von) AS Anzahl
    FROM beitraege AS b1
    WHERE b1.threadid = 'werte_für_den_thread'

    Ilja

    1. yo,

      meine erste abfrage und deren unterabfrage bezieht sich auf die anzahl der beiträge, die ein user in diesem thread geschrieben hat. wenn aber die gesamtzahl der beiträge eines users gemeint ist (aller wahrscheinlichkeit nach), dann sollte man in der unterabfrage auch die threadid rausnehmen, also:

      SELECT b1.von, b1.datum, b1.post, b1.titel, b1.ip,
      (SELECT COUNT(*) FROM beitraege AS b2 WHERE b2.von=b1.von) AS Anzahl
      FROM beitraege AS b1
      WHERE b1.threadid = 'werte_für_den_thread'

      Ilja

  3. Hallo euch allen,

    OK das Problem ist gelöst. Danke euch allen :-)

    Gruß jaylibII