PHP-Forum Probleme

Sneasel

Lt. Junior Grade
Registriert
Juni 2007
Beiträge
455
Hallo,

seit einigen Wochen versuche ich ein PHP-Forum umzugestalten.
Leider hänge ich seit einigen Tagen an folgenden Problemen:

1. Ich will ein Favoritenmenü bauen. D.h. durch einen Buttonklick sollen URL und Name des Forums userabhängig in meiner MYSQL-Datenbank gespeichert werden. Mit diesen Daten fülle ich dann per abfrage das Menü.
Problem: Der Forumname wird nicht eingespeichert. (Die fav_id wird immer richtig herrausgefiltert. es muss also an der abfrage des forum_namens liegen.
Code:
if (isset($_POST['button1']))
{
    $fav_url = $_SERVER['REQUEST_URI'];
    $fav_id = substr($fav_url, strripos($fav_url, 'f=') + 2);
    $sql = "SELECT forum_name FROM " . FORUMS_TABLE . " WHERE forum_id = '" . $fav_id . "';";
    $result = $db->sql_query($sql);
    $fav_name = $db->sql_fetchrow($result['forum_name']);
    $db->sql_freeresult($result);
    //ALTER TABLE 'kas_phpbb_users' ADD 'fav_url' varchar(255), 'fav_id' varchar(255);
    $sql = "UPDATE " . USERS_TABLE . " SET fav_url1 = '" . $fav_url . "', fav_id1 = '" . $fav_name . "' WHERE user_id = '" . $user->data['user_id'] . "';";
    $db->sql_query($sql);
}

2.Für den UDATE-befehl brauche ich die nötigen Tabellen. Diese hab ich bis jetzt in der MYSQL Datenbank manuell hinzugefügt. Wie könnte ich das automatisch machen?
Vll durch die //ALTER TABLE Zeile im obigen CODE?

3. Ich will als Startseite eine Newsseite einrichten. die Funktioniert soweit ganz gut, jedoch erscheinen im overall_header (Der Bereich in dem das ausklappbare Menü ist) nicht die Buttons zum anmelden registrieren.
Wie kann ich das beheben?

Hier die Newsseite: http://www.deinekarrierevonmorgen.de/news.php
Hier sind die Buttons vorhanden: http://www.deinekarrierevonmorgen.de/viewforum.php?f=6

Meine vermutung: Ich würde vermuten (ich bin absoluter Anfänger), dass das Forum nicht weiß welcher User sich auf der Newsseite befindet. (Vll fehlt so ein Code)
Code:
<!-- IF S_NO_READ_ACCESS -->

   <div class="panel">
      <div class="inner"><span class="corners-top"><span></span></span>
      <strong>{L_NO_READ_ACCESS}</strong>
      <span class="corners-bottom"><span></span></span></div>
   </div>

   <!-- IF not S_USER_LOGGED_IN and not S_IS_BOT -->

      <form action="{S_LOGIN_ACTION}" method="post">

      <div class="panel">
         <div class="inner"><span class="corners-top"><span></span></span>

         <div class="content">
            <h3><a href="{U_LOGIN_LOGOUT}">{L_LOGIN_LOGOUT}</a><!-- IF S_REGISTER_ENABLED -->&nbsp; &bull; &nbsp;<a href="{U_REGISTER}">{L_REGISTER}</a><!-- ENDIF --></h3>

            <fieldset class="fields1">
            <dl>
               <dt><label for="username">{L_USERNAME}:</label></dt>
               <dd><input type="text" tabindex="1" name="username" id="username" size="25" value="{USERNAME}" class="inputbox autowidth" /></dd>
            </dl>
            <dl>
               <dt><label for="password">{L_PASSWORD}:</label></dt>
               <dd><input type="password" tabindex="2" id="password" name="password" size="25" class="inputbox autowidth" /></dd>
               <!-- IF S_AUTOLOGIN_ENABLED --><dd><label for="autologin"><input type="checkbox" name="autologin" id="autologin" tabindex="3" /> {L_LOG_ME_IN}</label></dd><!-- ENDIF -->
               <dd><label for="viewonline"><input type="checkbox" name="viewonline" id="viewonline" tabindex="4" /> {L_HIDE_ME}</label></dd>
            </dl>
            <dl>
               <dt>&nbsp;</dt>
               <dd><input type="submit" name="login" tabindex="5" value="{L_LOGIN}" class="button1" /></dd>
            </dl>
            {S_LOGIN_REDIRECT}
            </fieldset>
         </div>

         <span class="corners-bottom"><span></span></span></div>
      </div>

      </form>

   <!-- ENDIF -->

<!-- ENDIF -->

Wäre super wenn ihr mir helfen könnt. Ich komme da alleine einfach nicht mehr weiter :freak:

MfG Matthias
 
also, wenn du vermutest das es an der abfrage des forum namens liegt, wieso schaust du denn nicht mal durch ein einfachen echo oder print_r befehl nach, was der query dir liefert.
oder lässt dir den gesaten query mal anzeigen, den du da erzeugst, und schickst den mal über Kommandozeile oder phpMyAdmin an die DB?

dann fragte ich mich wieso du
Code:
$sql = "UPDATE " . USERS_TABLE . " SET fav_url1 = '" . $fav_url . "', fav_id1 = '" . $fav_name . "' WHERE user_id = '" . $user->data['user_id'] . "';";
machst aber deine spalten fav_url und fav_id und nicht fav_url1 und fav_id1 heißen.
das semikolon am ende musst meiner meinung nach auch nicht sein, allerdings weiiß ich ja nun nicht was die Klasse $db mit dem query macht.

der zweite code abschnitt mahct ja eigentlich gar nichts, denn das ist nut HTML code, ich nehme mal an das Forum jagt den Teil erstmal durch einen parser.....?!
Um welchen Foren Software handelt es sich überhaupt? Und gibt es nicht vlt. schon ein plugin das genau das für dich macht?

deine zweite frage verstehe ich absolut nicht
 
Die nötigen Felder sind vorhanden (fav_url1,fav_id1)
Wie kann ich mir das denn im Template ausgeben lassen mit echo (funktioniert der befehl in html)
 
äh......
also ein Template muss durch einen Parser geschickt werden um die ganzen anweisungen zu übersetzen. Wie das Forum das macht weiß ich nicht.
und dann teste wie gesagt mal on der erzeugte query richtig ist!
also echo $sql
und anschließend lass dir das ergeniss ausgeben!
print_r($result)

ausgegeben wird das ganze zu 99% über echo, aber da wird nichts geparst!

ich kann dir nur raten mal zu gucken ob du für deine zwecke nicht schon etablierte module und erweiterungen findest, foren sind äußerst komplexe konstrukte und selbst für profis nicht einfach zu durchschauen.
 
Ich hab folgendes ins html template geschrieben. Im Forum erscheint aber nichts:

<?php
echo "{$sql}";
print_r($result);
?>
 
sorry aber das tut schon weh!
natürlich passiert da nichts...............
so sollte das aussehen:
PHP:
if (isset($_POST['button1']))
{
    $fav_url = $_SERVER['REQUEST_URI'];
    $fav_id = substr($fav_url, strripos($fav_url, 'f=') + 2);
    $sql = "SELECT forum_name FROM " . FORUMS_TABLE . " WHERE forum_id = '" . $fav_id . "';";
    echo "<hr>Query:".$sql."<hr>";
    $result = $db->sql_query($ 
    $fav_name = $db->sql_fetchrow($result['forum_name']);
    echo "Result:";
    print_r($result); // oder aber $fav_name, da ich nicht weiß was $db->sql_query nun liefert
    $db->sql_freeresult($result);
    //ALTER TABLE 'kas_phpbb_users' ADD 'fav_url' varchar(255), 'fav_id' varchar(255);
    $sql = "UPDATE " . USERS_TABLE . " SET fav_url1 = '" . $fav_url . "', fav_id1 = '" . $fav_name . "' WHERE user_id = '" . $user->data['user_id'] . "';";
    $db->sql_query($sql);
}

$sql liegt ja nur im scope des einen blocks, im template ist diese variable vermutlich nicht mal initialisiert.....

dann noch etwas, über deine anwendung von fetrow bin ich mir auch nicht ganz sicher, ich würde erwarten das die methode ein int als parameter erwartet, du übergibst aber einen String, was durchaus sein kann, mir aber unsinnig erscheint.

also bevor du anfängst an dem Forum rumzubasteln solltest du evtl. ein wenig mehr programmieren lernen, vorallem OOP.

und könntest du nochmal deinen zweiten standpunkt verdeutlichen?

Hast schonmal geschaut ob es nicht fertige skripte gibt die genau das machen was du brauchst?

und noch etwas, deine methode an die id des forums zu kommen st nicht ganz ausgereift, ich würde den string lieber mit einem regulären ausdruck parsen. (stichwort: preg_match)
 
Zuletzt bearbeitet:
So also das stand auf der Seite:

Query:SELECT forum_name FROM kas_phpbb_forums WHERE forum_id = '17';
Result:Resource id #43
id 17 ist schonmal richtig

Zu Punkt 2:
Mit dem Update Befehl will ich ja die Fedler fav_url1 und fav_url2 für den jeweiligen User füllen.
Diese Felder müssen aber vorhanden sein, was sie normalerweise nicht sind (hab das Forum per Installsoftware installiert). Ich hab die Felder jetzt mit diesem befehl in PHPMyAdmin erstellt:
Code:
ALTER TABLE kas_phpbb_users ADD (fav_url varchar(255), fav_id varchar(255))
Da sich bei den Forum aber regelmäßig neue User anmelden, sollen diese felder möglichst automatisch erstellt werden, sonst müsste ich für jeden neuen User diese Felder in PHPMyAdmin erstellen.


Ein passendes Script konnte ich nicht finden, deshalb hab ich selber losgelegt :D


$sql liegt ja nur im scope des einen blocks, im template ist diese variable vermutlich nicht mal initialisiert.....
Meinst du damit sowas?:
$template->assign_block_vars('brett', array(
'UEBERSCHRIFT' => $row['post_subject'],
));


Schonma danke für deine Hilfe

MfG Matthias
 
ja so etwas in der art könnnte es sein, meine phpBB zeit liegt leider schon fast 10 jahre zurück (war damals 14^^), müsste man sich mal genauer einarbeiten, obwogl es sicherlich auch irgendwo eine dokumentation gibt.

jetzt verstehe ich auch was du vorhast mit dem alter table und ich kann dir nur sagen: lass es!
das ist nicht relational.
erstell dir eine neue Table mit folgenden felder:
userid, favUrl und favId.
da specherst dann die user id und die foren id's, sonst hast unmengen an leeren feldern in der db und du üsstest jedesmal nachschaun ob schon die felder existieren und belegt sind.
dann beim auslesen fragst du in der neuen table ab wo die userid = dem eingeloggten user ist.
so kann man auch leicht die sachen löschen und bearbeiten.

und zum query kann ich nur sagen da ist wohl der fehler im etchrow statement, ich denke du musst da einfach mal eine 0 übergeben, ohne anführunsgszeichen ohe alle, einfach 0 ;)
 
Das Menü soll man jederzeit wieder ändern können. Wenn ich das richtig verstehe kommt man um eine Prüfung ob die Felder schon existieren nicht rum.
(Ich hab mir gedacht das es am einfachsten wär bei Buttonklick die Felder erst zu Löschen und dann jedesmal neu zu erstellen. Somit müsste man doch die Abfrage umgehen können)

Ich hab mir schon gedacht das es an der Zeile mit dem fetchrow liegt. Was du mir mit der 0 sagen willst versteh ich aber net :D
Meinst du ich sll die Zeile so schreiben:
$fav_name = $db->sql_fetchrow(0);

Hoffe ich nerve nicht zu sehr mit meinen Anfängerfragen :p

MfG Matthias
 
ja genau so meine ich das ;)

aber für jeden favoriten eine neue spalte zu erstellen ist kein guter stiel.
MySQL ist eine relationale Datenbannk und sollte auch so genutzt werden.

D.H. du erstellst eine relation "favoriten" mit den feldern
userid
fav_id
fav_url

dann kann jeder user beleibig viele favorieten anlegen denn wenn ich ein neues anlege wird in der neuen relation meine id und die url gespeichert-
wenn ich noch einen anlege kommt eben eine neue zeile dazu, sodass man am ende soetwas bekommt:
Code:
userid | favid | favurl 
--------+-------+--------
1         |   2    | bla.de
--------+-------+--------
918    |  7      | blubb.de
--------+-------+--------
1        | 89     | husel.de
|

optional kannst nich ein ID feld mit AI machen, oder aber einfach alle 3 Felder als primary key nehmen.
optional reicht auch userid als primary key in verbdinung mit der favid, die dann auch gleich als foreign key fungiert.
 
Hab ich dann nicht genau das gleiche Problem, dass ich in dem Programm das die Felder füllt überprüfen muss ob diese schon da sind?

Bin bei meiner Google-Suche auf etwas gestoßen. Das könnte doch genau mein Prob sein. leider versteh ich die Lösung nicht ganz.

Code:
Falsch ist Deine Annahme, dass mysql_query Dir direkt das gewünschte Ergebnis liefern würde.

Vielmehr erhältst Du "nur" einen Zeiger auf die Ergebnismenge oder eben "Resource ID".
Die Daten musst Du erst noch abholen.


Z.b mit mysql_fetch_assoc();

Für Deine Abfrage würde das so aussehen


$query = <<< EOT

SELECT
    Autor,
    BuchID
FROM
    tblHauptBuecher
WHERE
    BuchID = 'VB5WT'
EOT;

(Es ist i.d.R. nützlich das SQLStatement in eine Variable zu stecken, denn dann kann man es leicht zur Fehlersuche ausgeben lassen.)

Den Namen der Tabelle musst Du nur angeben wenn Du mehrere Tabellen abfragst, und auch nur dann wenn Spaltennamen mehrdeutig sein können.

$result = mysql_query($query) OR die (mysql_error());


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

 // tue was mit den Daten
    printf ('Der Autor ist %s <br>', $row['Autor']);
}
 
Zuletzt bearbeitet:
nein musst du nicht

du machst dann einen query in der art
Code:
select * from favoriten where userid = XX

dann bekommst du ja eine MySql resource mit beliebig vielen feldern (oder eben 0)

da kannst du dann mit mysql_fecth_array iterieren und musst somit gar nicht wissen wie viele Favoriten der User angelegt hat

ich kann dir nur nocheinmal nahe legen dich ein wenig mehr mit programmieren zu beschäftigen, wäre ich nicht selber gerade voll in einem Projekt könnte ich dir auch besser helfen, aber man sieht ja das die die kompletten basics fehlen.
Du solltest dich zumindest mit arrays auseinander setzen, schleifen und viel viel mehr mit MySql (bzw. SQL allgemein und relationalen Datenbanken Systemen)

bei dir könnte es aber z.b. so aussehen (ich benutze jetzt mal nicht das $db objekt da ich die API nicht kenne)

PHP:
$result = mysql_query("select * from favoriten where userid = ".$userid);
while($row = mysql_fetch_array($result)) {
echo "User: ".$row['userid']." | FavID: ".$row['favid']." | FavURL: ".$row['favurl']."<br>";
}

das würde eine ausgabe wie diese erzeugen

Code:
// $userid = 1
User: 1 | FavID: 6 | FavURL: bla.de
User: 1 | FavID: 9 | FavURL: blubb.de
User: 1 | FavID: 87 | FavURL: huselwusel.de
-----------------------------
// $userid = 100
User: 100 | FavID: 6 | FavURL: bla.de
// $userid = 4096
// nichts, denn der user hat keine gespeichert

so ist es für dich vollkommen uninteressant wie viele favorieten er gespeichert hat, du musst dem programm nur sagen wie es mit den erebnissen umgehen soll.

die iteraton über mysql_fetch_array klappt weil es intern den array zeiger immer ein feld weiter setzt
 
Hab das Problem gelöst :D
(Ist vermutlich eine schrckliche Lösung ^^)

Im HTML-Template_Menü:
HTML:
			<li><a href="<!-- BEGIN fav1url -->
{fav1url.FAV_URL1}
<!-- END fav1url -->"><!-- BEGIN forumname1 -->
{forumname1.FORUMNAME1}
<!-- END forumname1 --></a></li>

In der PHP-Datei:

PHP:
if (isset($_POST['button1']))
{
$fav_url = $_SERVER['REQUEST_URI'];
$fav_id = substr($fav_url, strripos($fav_url, 'f=') + 2);
$sql = "SELECT forum_name FROM " . FORUMS_TABLE . " WHERE forum_id = '" . $fav_id . "';";
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
$sql = "UPDATE " . USERS_TABLE . " SET fav_url1 = '" . $fav_url . "', fav_id1 = '" . $row['forum_name'] . "' WHERE user_id = '" . $user->data['user_id'] . "';";
$db->sql_query($sql);
}
$db->sql_freeresult($result);
}

PHP:
//FAV1URL
$sql = 'SELECT fav_url1 FROM ' . USERS_TABLE . " WHERE user_id = '" . $user->data['user_id'] . "';";
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
    $template->assign_block_vars('fav1url', array(
        'FAV_URL1'    => $row['fav_url1'],
    ));
}
$db->sql_freeresult($result);

PHP:
//FAV1ID
$sql = 'SELECT fav_id1 FROM ' . USERS_TABLE . " WHERE user_id = '" . $user->data['user_id'] . "';";
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
    $template->assign_block_vars('forumname1', array(
        'FORUMNAME1'    => $row['fav_id1'],
    ));
}
$db->sql_freeresult($result);

Und das ganze 6 mal für 6 favoritenplätze :D

Kannst du mir vll noch en Tip für meine anderen Probleme geben? (Problem 2 und 3 im ersten Post von mir)

MfG Matthias
 
Zuletzt bearbeitet:
Also deine beiden letzten Fragen hab ich jetzt nicht verstanden^^

Aber zu deiner ersten schon gelösten Frage:
Das mit 6 Favoritenplätzen für jeden User ist eine denkbar schlechte Lösung.

Wie Mercsen schon geschrieben hatte solltest du eine eigene Tabelle hierfür machen.
(schon lang keine sql-statements zum anlegen einer Tabelle mehr selbstgeschrieben, aber so in etwa sollte es sein
favorit_id: int primary key auto_increment,
user_id: int references useres(id),
favorit_url: varchar(50) not null

So in der Richtung. Und einen fast gleichen Code zu kopieren solltest du dir gleich abgewöhnen.

Wenn du den Code den du gepostet hast 6 mal haben möchte, dann mach das bitte bitte so:
(auch hier bin ich etwas eingerostet dürfte aber in etwa so hinhauen)
PHP:
for ($i=1;$i<=6;$i++) {
//FAV1URL mal umgebastelt
$sql = 'SELECT fav_url'.$i.' FROM ' . USERS_TABLE . " WHERE user_id = '" . $user->data['user_id'] . "';";
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
    $template->assign_block_vars('fav'.$i.'url', array(
        'FAV_URL'.$i.''    => $row['fav_url'.$i.''],
    ));
}
$db->sql_freeresult($result);  
}
Und schon führt das den Code 6mal hintereinander aus immer mit der jeweiligen Zahl ;)

Aber wie gesagt sollte das ganze in ne eigene Tabelle, dann ists sogar möglich unendlich viele Favoriten (gut irgendwann kann die Datenbank keinen int mehr als primary key generieren :p ) zu haben.
 
Hallo,

was für Auswirkungen gibt es denn wenn man so viele leere Felder hat?

Die wichtigste Frage für mich ist noch warum mein Favoriten-Menü auf der Newsseite und in der Forenübersicht nicht funktioniert und warum die Buttons im header auf diesen Seiten nicht erscheinen.
Ich vermute, dass Code fehlt welcher erkennt welcher User in welchem Zustand auf der Seite ist. (dadurch kann keine Userid abgefragt werden und mein Code geht net)

Hier die Links:

http://www.deinekarrierevonmorgen.de/news.php (Meine selbsterstellte Newsseite)
http://www.deinekarrierevonmorgen.de/ (Die Forenübersicht)

Anmeldedaten (falls benötigt)
Name: computerbase
Pass: computerbase1
Unten auf der Seite sind 6 Buttons mit denen man die aktuelle Seite einspeichern kann.
Hab mal Semester 1-6 vorgespeichert)

MfG Matthias

Edit: Jetzt hab ich die Buttons auf der Newsseite, leider hab ich jetzt keine Berechtigung mehr diese zu sehen :D
 
also zu 2)

du machst dir das leben ja selber schwer indem du 6 felder für die favoriten erstellst.
dir bleibt keine wahl als dann alle Felder auszulesen und zu prüfen ob schon etwas drinne ist und dann das nächste freie zu beschreiben.

und auch wenn ein favorit geändert werden soll ist es reichlich kompliziert, da du dir entweder vorher merken musst in welchem feld (1-6) er steht oder aber du musst ihn erst wieder suchen in allen 6 Feldern.

zu 3) kann ich dir leider nichts sagen, wie gesagt meine phpBB zeot liegt zu weit zurück und ich atm nicht die zeot mich dort einzuarbeiten, aber da würde ich mich eh an das offizielle forum wenden (am besten an das englische, da findet man in der regel schneller hilfe)
 
So wie es jetzt ist Funktioniert es ja. Zugegeben ist es keine schöne Lösung aber immerhin :D

hab das problem mal im php-Forum gepostet. Mal sehen ob die mir weiterhelfen können ^^

Aufjedenfall ein riesen Dank für die Hilfe

MfG Matthias
 
Das ganze mit den 6 Favoritenfeldern entspricht einfach nicht der Logik für die Nutzung einer Datenbank.

Das läuft normal wie folgt:
Du möchtest eine 1:n-Beziehung herstellen. D.h.:

1 Benutzer kann mehrere (n) Favoriten haben
Favoriten können aber nur 1 Benutzer haben dem sie "gehören" (sollte es den "gleichen" Favoriten bei mehreren Usern geben, wird er einfach für jeden User in die DB geschrieben, eine m:n-Beziehung würde für sowas wirklich keinen Sinn machen)

Also auf jeden Fall haste ne 1:n
Und für eine 1:n bezieung nimmt man eine Tabelle in der man einmal die 1 drinnen stehen hat. Diese muss für jeden Datensatz aber wiederholt werden!!!
n muss man ja eh immer neu schreiben, da sich der Favorit ja eh ändert.

Somit würde deine Tabelle folgende "Spalten" haben (mal als Beispiel):
-User_id
-Username
-Kennwort
-email
-Favorit
-...

Und das müsstest du jetzt für jeden Favoriten wiederholen. Das gibt ein Chaos und du speicherst die Daten viel zu oft (kann möglicherweiße dann zu einer inkonsistenz führen). So hast du zB das Kennwort 5mal in der DB stehen, wenn er 5 Favoriten hat.

Deshalb macht mans so:
Usertabelle:
-User_id
-Username
-Kennwort
-email
-...

Favoritentabelle:
-User_id
-Favorit

So musst du für jeden Favoriten den ein Benutzer speichert nur die URL an sich und eine einzige Zahl (nämlich die User_id vom entsprechenden Nutzer) speichern.

Hoffe der Vorteil und warum man das so macht ist klar geworden...

Wenn du für jeden Favoriten eine Spalte machst müsstest du ja theoretisch wenn nur ein einziger Nutzer 1000 Favoriten hat für jeden User 1000 Favoriten "verwalten" (auch wenn se leer sind).
Das bremst braucht speicher und erklär mir mal wie du da jemals als admin noch durchblicken sollst.
Der schlampige Admin ist sein mächtigster Feind. Denn wenn man nichtmehr durchblickt ist Ende.
 
naja er hat es aber anders gelöst nämlcih so:

-userid
-mail
-passwort
-fav1
-fav2
-fav3
-fav4
-fav5
-fav6
-bild
-blabla

ist zwar immer noch nicht gaaaanz sauber, denn wie ich oben schon sagte musst du dich jetzt jedesmal durch alle felder durch wühlen um das leere zu finden, aber hauptsache es läuft erstmal. Congratz ^^
 
Jop hatte schon gesehen, dass er das so gemacht hat.

Wollte ihm damit nur zeigen wie es richtig (wobei richtig natürlich ansichtssache ist) geht.
Wenn die 6 Favoriten reichen und er das nixmehr ändern willst, geht das natürlich auch.

Viel Glück bei deinem weiteren Vorhaben. Mit den Buttons kann ich nämlich nicht helfen.
 
Zurück
Oben