Anzeige: wieviele Beiträge hat ein User geschrieben
jaylibII
- php
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
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
beitraegeWHERE
von = 'dedlfix';
echo "$verabschiedung $name";
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
beitraegeWHERE
von= '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
echo $begrueszung;
... wieviele Beiträge der User schon geschrieben hat.
SELECT COUNT(*) AS anzahl FROM
beitraegeWHERE
von= '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
beitraegeWHERE
vonIN ('dedlfix','jaylibII') GROUP BY
von;
Damit bekommst du einige User, wenn du alle haben willst, lass die WHERE-Klausel weg.
echo "$verabschiedung $name";
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
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
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
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
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";
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ück zur übersicht</a><br><br>";
$threadid = $_GET['threadid']; // threadid aus adressleiste auslesen
$fp = fopen("template_post.html","r"); // teamplate zum lesen(r) ö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äd bei jedem durchgang(immer die nä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&empfaenger=' . $von . '">Message schreiben</a>',$ausgabe); // den post text ins template einsetzen
echo $ausgabe;
};
?>
Gruß jaylibII
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";
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
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";
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
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
WHEREvon
= '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
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.
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
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
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
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.
also du siehst ich habe ganz kleine Angefangen.
Gruß jaylibII
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
WHEREvon
= '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.
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
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
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";
Hi,
hab das nun mal so gemacht:
<?php
include("config.php"); // config datei laden.
//echo "<a href=index.php>Zurück zur ü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) ö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äd bei jedem durchgang(immer die nä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&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
echo $begrueszung;
if (!isset($ppu[$von])) {
$ppusql = "SELECT COUNT(*) AS anzahl FROMsimple\_posts
WHEREvon
='$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";
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ück zur ü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) ö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äd bei jedem durchgang(immer die nä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&empfaenger=' . $von . '">Message schreiben</a>',$ausgabe); // den post text ins template einsetzen
echo $ausgabe;
};
?>
Gruß jaylibII
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. :-)
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";
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
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";
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ück zur ü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) ö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äd bei jedem durchgang(immer die nä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&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 :-)
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
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ück zur ü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) ö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äd bei jedem durchgang(immer die nä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 FROMsimple\_posts
WHEREvon
='$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&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";
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
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
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";
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
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
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
Hallo euch allen,
OK das Problem ist gelöst. Danke euch allen :-)
Gruß jaylibII