Frage zu einem Forum Tuturial
Nizzan
- php
Guten Tag euch allen,
ich habe gerade ein Tuturial zu einem Forum gemacht. Das ging auch alles Ohne wenn und aber aber nun komme ich an eine Stelle, wo ich einfach nimmer weiter komme und nun hoffe ich, dass Ihr mir dabei helfen könnt.
Meine Frage:
In dem Forum möchte ich gerne immer einen Pfad angeben also z.B. so:
PFAD: Forum / Support / Warum geht das nicht
So nun habe ich schon folgendes gemacht:
PFAD: ( wird einfach so rein geschrieben )
Warum geht das nicht ( das habe ich schon schon drin das mache ich so:
PHP:
<?php echo $row2['titel'];?>
Der Code dafür sieht dann so aus:
PHP:
<?php $sql2 = mysql_query("SELECT * FROM simple_posts WHERE threadid = '$threadid' ORDER BY postid ASC"); // post selecten im gewisse daten zu holen
$row2 = mysql_fetch_Assoc($sql2); // eine zeile(den ersten post des threads) auslesen
$titel = $row2['titel']; // titel besorgen
?>
So nun fehlt mir aber noch die Anzeige aus welcher Rubrik das kommt also in diesem Beispiel eben die Rubrik Support. Kann mir da einer / eine sagen wie ich das machen muss? Denn ich komme da wirklich nicht mehr weiter. Ach ja so sehen die drei Tabellen in der DB aus:
CREATE TABLE simple\_foren
(
boardid
int(11) NOT NULL auto_increment,
name
text NOT NULL,
beschreibung
text NOT NULL,
rechte
int(2) NOT NULL default '0',
PRIMARY KEY (boardid
)
) TYPE=MyISAM AUTO_INCREMENT=2147483647 ;
CREATE TABLE simple\_posts
(
postid
int(11) NOT NULL auto_increment,
threadid
int(11) NOT NULL default '0',
von
text NOT NULL,
datum
text NOT NULL,
edit\_datum
datetime NOT NULL default '0000-00-00 00:00:00',
post
text NOT NULL,
titel
text NOT NULL,
ip
text NOT NULL,
del
varchar(10) NOT NULL default '',
PRIMARY KEY (postid
)
) TYPE=MyISAM AUTO_INCREMENT=28 ;
CREATE TABLE simple\_threads
(
threadid
int(11) NOT NULL auto_increment,
boardid
int(11) NOT NULL default '0',
status
char(2) NOT NULL default '',
del
varchar(10) NOT NULL default '',
closed
int(1) default NULL,
PRIMARY KEY (threadid
)
) TYPE=MyISAM AUTO_INCREMENT=22 ;
echo $begrüßung;
So nun fehlt mir aber noch die Anzeige aus welcher Rubrik das kommt also in diesem Beispiel eben die Rubrik Support. Kann mir da einer / eine sagen wie ich das machen muss?
Als erstes solltest du uns sagen, wo genau diese Rubrik-Information herkommt. Aus der geposteten Tabellenstruktur kann ich nicht erkennen, wo diese Rubrik drinsteht.
echo "$verabschiedung $name";
hi,
Als erstes solltest du uns sagen, wo genau diese Rubrik-Information herkommt. Aus der geposteten Tabellenstruktur kann ich nicht erkennen, wo diese Rubrik drinsteht.
ich nehme doch an, es handelt sich um die spalte beschreibung in der tabelle simple_foren, wobei die verknüpfung über die auch in simple_threads vorhandene boardid erfolgt.
gruß,
wahsaga
Hallo,
ich nehme doch an, es handelt sich um die spalte beschreibung in der tabelle simple_foren
Jepp ganz genau da kommen die Infos her * grml * wie kann ich das eine nun mit dem anderen verbinden?
Gruß Nizzan
hi,
ich nehme doch an, es handelt sich um die spalte beschreibung in der tabelle simple_foren
Jepp ganz genau da kommen die Infos her * grml * wie kann ich das eine nun mit dem anderen verbinden?
entweder du liest, nachdem du die boardid aus simple_threads ausgelesen hast, bei der ausgabe die beschreibung aus simple_foren in einer separaten query nach;
oder du informierst dich über JOINs, um das ganze gleich in einer query ermitteln zu können.
gruß,
wahsaga
Hallo,
entweder du liest, nachdem du die boardid aus simple_threads ausgelesen hast, bei der ausgabe die beschreibung aus simple_foren in einer separaten query nach;
Wenn ich dich da richtig verstanden habe, dann muss ich nochmals ein SQL=select machen oder?
Gruß Nizzan
echo $begrüßung;
Wenn ich dich da richtig verstanden habe, dann muss ich nochmals ein SQL=select machen oder?
Ja, das ist zwar die uneffektive Methode, bei der du aber nichts neues lernen musst.
Das mit den JOINs bedeutet etwas Lernaufwand, ist aber vorzuziehen.
echo "$verabschiedung $name";
Hallo,
Ja, das ist zwar die uneffektive Methode, bei der du aber nichts neues lernen musst.
Das mit den JOINs bedeutet etwas Lernaufwand, ist aber vorzuziehen.
Was ist denn die sichere Methode, wenn ich nun schon was mache, dann möchte ich das richtig machen und kein Müll. Ich hoffe du kannst mir das mal noch sagen.
Gruß Nizzan
echo $begrüßung;
Was ist denn die sichere Methode, wenn ich nun schon was mache, dann möchte ich das richtig machen und kein Müll.
Zu sicherheitstechnischen Unterschieden der beiden Methoden, fällt mir im Moment nichts ein. Solange du generell weißt, worauf man bei Datenbank- und anderen Abfragen achten muss [1] sollten sich die beiden Methoden nichts nehmen.
Bei der JOIN-Methode wird die DB nur einmal befragt, und das spart Ressourcen. O.K. der JOIN braucht auch Rechenzeit, die kann man aber mittels entsprechender Indexe optimieren.
echo "$verabschiedung $name";
[1] Usereingaben überprüfen, entsprechende Maskierung einsetzen, ...
Hallo,
Bei der JOIN-Methode wird die DB nur einmal befragt, und das spart Ressourcen. O.K. der JOIN braucht auch Rechenzeit, die kann man aber mittels entsprechender Indexe optimieren.
Ok dann weiß ich bescheid. Dann schau ich mir mal an wie das geht wenn ich noch fragen habe dazu dann melde ich mich einfach hier wieder. Danke für die schnell hilfe.
Ach ja was meinst du denn damit?
»»Maskierung einsetzen
Gruß Nizzan
echo $begrüßung;
Ach ja was meinst du denn damit?
»»Maskierung einsetzen
$sql = "SELECT * FROM table WHERE name='$name'";
Erzeugt einen Parser-Fehler auf dem SQL-Server, wenn in $name beispielsweise O'Conner steht.
Deswegen (und wegen absichtlichem Missbrauch dieses Programmierfehlers)
Um solchen Fälle entgegenzuwirken waren die Magic Quotes vorgesehen, die ihre Aufgabe jedoch nicht gut erfüllen und stattdessen mehr Probleme an anderen Stellen verursachen.
Unter Database Security gibt es im Kapitel SQL Injection einiges zu dem Thema zu lesen.
Kurz: für MySQL empfiehlt sich das obige Beispiel so zu schreiben:
$sql = "SELECT * FROM table WHERE name='" . mysql_real_escape_string($name) . "'";
echo "$verabschiedung $name";
Deswegen (und wegen absichtlichem Missbrauch dieses Programmierfehlers)
... sollen Variableninhalte dem Ausgabemedium entsprechend maskiert werden. Dieses Prinzip gilt auch für jegliche Ausgabe.
in Richtung HTML: htmlspecialchars()
für eine URL: urlencode()
usw. usf.
So hätte es sein sollen. :-)
Hallo und guten Abend,
hab mir das gerade mal durchgelsen also folgendes: http://dev.mysql.com/doc/mysql/en/join.html aber um ganz ehrlich zu sein ich blick da gar nichts. Kann mir da jemand ein wenig helfen dass ich das hin bekomme was ich oben schon beschrieben habe?
Gruß Nizzan
echo $begrüßung;
hab mir das gerade mal durchgelsen also folgendes: http://dev.mysql.com/doc/mysql/en/join.html aber um ganz ehrlich zu sein ich blick da gar nichts. Kann mir da jemand ein wenig helfen dass ich das hin bekomme was ich oben schon beschrieben habe?
So ein JOIN funktioniert so:
Felder in t1: id, id_t2, a, b
Felder in t2: id, x, y
Beispieldaten:
t1:
id id_t2 a b
1 3 a1 b1
2 0 a2 b2
t2:
id x y
3 x3 y3
4 x4 y4
Für alle Datensätze von t1 wollen wir die über das Feld ID_t2 referenzierten Datensätze aus t2 haben:
SELECT t1.id, a, b, x, y FROM t1, t2 WHERE t1.id_t2 = t2.id AND weitere Bedingungen
Das ergibt alle Datensätze, für die die WHERE-Bedingung gilt. Alternativ kann man das auch so schreiben:
SELECT t1.id, a, b, x, y FROM t1 INNER JOIN t2 ON t1.id_t2 = t2.id WHERE ...
(Das INNER kann man auch weglassen.) Mit dieser Schreibweise sieht man eher, welches die Verknüpfungsbedingung und welches die die Ergebnismenge einschränkenden Bedingungen sind.
Ergebnisdaten:
id a b x y
1 a1 b1 x3 y3
Beides sind so genannte INNER JOINs. Es werden nur die Datensätze berücksichtigt, für die es in beiden Tabellen entsprechende Daten gibt. Wenn es einen Datensatz von t1 mit ID_t2 = 0 gibt und kein Datensatz in t2 ein ID = 0 hat, dann gehört der t1-Datensatz nicht zur Ergebnismenge.
Für solche Fälle gibt es die OUTER JOINs. Der meist verwendete ist der LEFT OUTER JOIN:
SELECT t1.id, a, b, x, y FROM t1 LEFT OUTER JOIN t2 ON t1.id_t2 = t2.id WHERE ...
(Das OUTER kann man auch weglassen.) Hier werden alle Datensätze der linken Tabelle (t1) berücksichtigt. Wenn es keinen entsprechenden Datensatz in t2 gibt werden für die t2-Felder NULL ausgegeben.
Ergebnisdaten:
id a b x y
1 a1 b1 x3 y3
2 a2 b2 NULL NULL
Mit diesem Wissen, so hoffe ich, kannst du jetzt deine Tabellen entsprechend verknüpfen.
echo "$verabschiedung $name";