[PHP] Die ersten Schritte sind garnicht so einfach

sverebom

Vice Admiral
Registriert
Aug. 2004
Beiträge
6.341
Ich bin gerade dabei, mir PHP richtig bei zu bringen und mir nicht nur von Dreamweaver vorkauen zu lassen. Ich bin zue Binng natürlich gleich gestolpert.

Mit Hilfe dieses Tutorials habe ich diesen Quelltext geschrieben

PHP:
<?php
$verbindung = @mysql_connect("localhost","lieber nicht","neee, wirklich nicht");

$abfrage = "SELECT * from rpo_news"

$ergebniss = mysql_db_query("localhost",$abfrage,$verbindung);

list($titel,$datum,$text) = mysql_fetch_row($erg);

while (list($titel,$datum,$text) = mysql_fetch_row($ergebniss)) {
	echo "$titel | $datum <br> $text";
}
?>

und erhalte nun diese Fehlermeldung

Parse error: parse error, unexpected T_VARIABLE in /www/htdocs/rpo/test/index.php on line 6

Tja, und was da falsch läuft weiß ich nicht.

Ich hätte da auch direkt eine Frage.
Mit dem obrigen Quelltext baue ich ja eine Verbindung zur DB auf und rufe die News, die auf der Index.php aufgeführt werden sollen, ab, richtig? Das ist jedenfalls das, was ich erreichen will.

Die abgerufen Informationen kann bzw. muss ich dann ja noch in ein ansprechendes Gewand packen. Kann ich die Gestaltung an der Stelle einfach per

PHP:
<? include("header.php"); ?>
<? include("globalnavi.php"); ?>
<? include("content.php"); ?> ...

einbinden?
 
Muss schnell weg. Deshalb ganz schnell, was ich sehe:

$abfrage = "SELECT * from rpo_news"

Da fehlt am Ende ein Semikolon ( ; )

tschau...
 
deine version ist recht umstaendlich

PHP:
// variablen festlegen
$host = 'localhost';
$username = 'username';
$password = 'password';
$dbname = 'dbname';

//db connecten und auswaehlen, lass das @ weg, fehlermeldungen sind zum anzeigen da
mysql_connect($host, $username, $password) or die(mysql_error());
mysql_select_db($dbname) or die(mysql_error());

// query setzen und ausfuehren
$query = 'SELECT * FROM rpo_news';
$result = mysql_query($query) or die(mysql_error());

// ergebnis durchgeben und ausgeben
while($row = mysql_fetch_array($result)):
 echo $row['titel'].' | '.$row['datum'].' <br> '.$row['text'];
endwhile;

und ja, du kannst das einfach so einbinden. du brauchst das aber nicht immer wieder zu oeffnen und zu schliessen. du solltest ausserdem keine shorttags (<??>) verwenden, sondern <?php ?>, sonst bekommst du spaeter eventuell probleme.
 
@Hornominator
Besten Dank.
Immerhin bin ich schon soweit, das ich halbwegs verstehe, was da steht.

Und anstelle von

PHP:
// ergebnis durchgeben und ausgeben
while($row = mysql_fetch_array($result)):
echo $row['titel'].' | '.$row['datum'].' <br> '.$row['text'];
endwhile;

kann ich nun schlicht die HTML-Fragmente "includen".
 
dann werden sie fuer jede reihe neu includet - das muss nicht unbedingt sein, unnoetige last. was willst du denn machen? was steht in den dateien drin? wenn da nur text/HTML drin steht, kannst du

PHP:
$string = file_get_contents($filename);

benutzen - das zieht dir den inhalt der datei in den string $string. wenn dort ausfuehrbarer code drin steht, kannst du es includieren - oder willst du das mehrmals ausfuehren? dann pack es in eine funktion, include sie und rufe sie mehrfach auf. aber die selbe datei mehrmals einzubinden bringts nicht - der inhalt bleibt ja normalerweise gleich.

edit:
ah ok, HTML, das kannst du eben mit file_get_contents() in einen string ziehen. wenn du etwas ersetzen willst:

PHP:
$new_string = str_replace($ersetze, $ersatz, $in_string);

auch nochmal nachzulesen:

http://php.net/file_get_contents
http://php.net/str_replace
 
Danke ersteinmal.

Puuuh, wie war das gleich? (mal die Links, mit denen ich gestern gearbeitet habe, wieder raus suchen). Kannst du mir vielleicht erklären, was nun genau mit dem Code anstellen soll!?
 
was genau willst du denn machen?

wenn du eine datei hast, in der schlichtweg HTML steht, dass du einfach nur ausgeben willst, kannst du es in einen string einlesen ($string = file_get_contents($filename)) und das dann beliebig ob in der while-scheife ausgeben (echo $string)
 
Mit meinem beschränkten Wissen hab ich mir folgendes überlegt.

Dank deiner Hilfe kann ich ja jetzt schnell und einfach eine Verbindung zu meiner DB aufbauen und Informationen aus einer gewünschten Tabelle abrufen. Ich hab nun also meine Datenbank verbindung und wollte nun dazu übergehen, das Layout zu bauen. Dabei möchte ich natürlich die Vorteile von PHP nutzen und bspw. meine Huaptnavi nur einmal bauen, in einer html-Datei hinterlegen und bei Bedarf abrufen. So wollte ich auch mit dem Content verfahren, der widerum Verweise auf Datenbankinhalte enthält (php-Anweisungen eben, die an gewünschter Stelle im Layout Inhalte aus der Datenbank anzeigt).

Als Beispiel ein Auszug aus der vorherigen Version der Webseite (die noch auf Tabellen basierte, dessen php-Code von Dreamweaver generiert wurde und die ich mittlerweile verworfen habe). Zu sehen ist das Fragment, welches Newseinträge nebst Newstitel und Eintragsdatum enthält und, in dem Fall, fünf mal wiederholt wird..

PHP:
<?php do { ?>
  <table border="0" cellspacing="0" cellpadding="0">
    <tr> 
      <td><span class="headline"><?php echo $row_news['titel']; ?></span><span class="date"> | <?php echo $row_news['datum']; ?></span></td>
    </tr>
    <tr> 
      <td class="text"><?php echo $row_news['text']; ?></td>
    </tr>
    <tr> 
      <td>&nbsp;</td>
    </tr>
    </table>
<?php } while ($row_news = mysql_fetch_assoc($news)); ?>

Dieses Fragment würde ich (natürlich DIV-basiert) bspw. gerne in einer eigenen Datei auslagern und bei Bedarf eben abrufen.
 
Zuletzt bearbeitet von einem Moderator: ([code] -> [php])
kein problem. erstelle eine news_content.html mit platzhaltern

Code:
<h2>{{titel}}</h2>
<h3>{{datum}}</h3>
<p>{{text}}</p>

lese die datei ein

PHP:
$news_content_html = file_get_contents('news_content.html');

nimm deine daten aus der DB und ersetze sie im string

PHP:
mysql... // connecten, auslesen und so

// variable initialisieren
$news_content = '';

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

 // array fuer jede zeile neu generieren; fuer strtr() - ersetzt schluessel durch wert
 $array = array(
 '{{titel}}' => $row['titel'],
 '{{datum}}' => $row['datum'],
 '{{text}}' => $row['text']
 );

 // variable mit dem gesamten inhalt. .= haengt an den bestehenden string an
 // haengt ersetzungen der DB-daten im template an
 $news_content .= strtr($news_content_html, $array);
endwhile;

und danach duerftest du alles in $news_content haben.
 
Zuletzt bearbeitet:
Ok, ich habs versucht, aber es funktioniert nicht.
Kein Wunder, so ganz verstanden hab ich es nämlich noch nicht. Hier ist mein Code:

So, ich erhalte immerhin keinen Parse-Error, aber die Seite, die ich erhalte, enthält nur

<html><body></body></html>

Hier der Code, denn ich treudoof geschrieben habe, da ich nämlich noch nicht Alles gänzlich verstanden habe.

PHP:
<?php
// variablen festlegen
$host = 'localhost';
$username = 'blablabla';
$password = 'dumdidum';
$dbname = 'rpo';

//verbinden und auswaehlen
mysql_connect($host, $username, $password) or die(mysql_error());
mysql_select_db($dbname) or die(mysql_error());

// query setzen und ausfuehren
$query = 'SELECT * FROM rpo_news';
$result = mysql_query($query) or die(mysql_error());

// variable initialisieren
$news_content = '';

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

// array fuer jede zeile neu generieren; fuer strtr() - ersetzt schluessel durch wert
$array = array(
'{{titel}}' => $row['titel'],
'{{datum}}' => $row['date'],
'{{text}}' => $row['text']
);

// variable mit dem gesamten inhalt. .= haengt an den bestehenden string an
// haengt ersetzungen der DB-daten im template an
$news_content .= strtr($news_content_html, $array);
endwhile; 

$news_content_html = file_get_contents('templates/content_news.htm'); 
?>

Edit: Komisch, eben wurde immerhin die Seite generiert. Nur leider wurden die Informationen aus der DB nicht ausgegeben.
 
Zuletzt bearbeitet:
du musst das template erst einlesen, bevor du darin was ersetzen kannst.
file_get_contents muss nach oben - da ist ja das HTML drin. geht nicht wenn du das HTML ausliest nachdem du die daten in nichts ersetzt hast. das ergebnis ($news_content) musst du danach auch noch ausgeben.
 
Aaaaaaaaah, endlich hab ich's. Eigentlich alles recht einfach und logisch, aber ich bin halt noch ein Anfänger.

Nun will ich aber nicht alle Einträge auf einmal sondern immer nur fünf bis zehn je Seite abrufen. Wie krieg ich das denn hin?

Den restlichen Layout-Code setze ich dann einfach bei

PHP:
$content_news_htm = file_get_contents('templates/content_news.htm');

nach dem Muster ein oder?
Nun habe ich da ein Problem. Ich hab eine Navi, in der der Button zur aktuellen Seite einen per CSS definierten Aktiv-Status besitzt. Nun will die Navi nur ein Mal abuen und dann einfach bei Bedarf abrufen. Da gibt es doch bestimmt auch eine einfache Möglichkeit, wie ich dem jeweiligen Button, der zur Seite gehört, den Aktiv-Status zuweisen kann, Anderfalls müsste ich ja für jede Seite (news, Gästebuch, Forum usw. ) eine eigene Navi bauen.
 
du kannst in das template einsetzen was du willst - dafuer ist es ja da ;)
du hast ja alles in $news_content gespeichert - wie und wo du das echo dafuer setzt, ist ja egal - an der stelle wird dann der inhalt ausgegeben.

du musst nur darauf achten, dass es pro eintrag wiederholt wird. wenn du noch zusaetzliche variablen hast, sieh dir den teil mit dem array an - sollte auch selbsterklaerend sein, was durch was ersetzt wird und wie man das beliebig erweitern kann.

ich weiss nicht, wie du dein menu generierst. du kannst zB am anfang der datei sowas wie

PHP:
$current_page = 'News';

schreiben - das musst du dann nur mit deinem menu vereinbaren.
 
Das wäre meine nächste Frage.
Ich kann, nach der Methode, beliebige Informationen aus der gewählten Tabelle beliebig oft abrufen und nach belieben verarbeiten bzw, anzeigen lassen? An der Stelle hat sich Dreamweaver nämlich quer gestellt, als ich für eine Newsübersicht die Eintragsdaten der News in einem seoaraten Bereich der Seite auflisten lassen wollte.

Wir kann denn nun angeben, das nur fünf oder zehn Einträge wiederholt angezeigt werden? (es soll dann auf weitere Seiten weiter gehen.
 
ja, das kannst du. du musst eben nur die varaiblen im template mit den daten aus der DB synchronisieren (zB in einem array, wie ich das vorgeschlagen habe).

du kannst mit

Code:
SELECT ... LIMIT $startrow, $number_rows

bestimmen, welche zeilen ausgelesen werden sollen. $startrow ist eben die reihe, bei der er starten soll (beginnend bei 0, nicht 1), $number_rows ist die anzahl der zeilen (hier: anzahl newseintraege) die er auslesen soll.

SELECT ... LIMIT 0, 3

liest dann zB die ersten drei eintraege aus.
 
Wunderbar, nun fehlt nur noch die Subanivgation, mit der ich dann durch die Seiten blättern kann.

Edit: Mööööp, Semikolon vergessen :rolleyes:

Bei der Navigation müsste ich dann quasi nur noch bei den Buttons angeben "falls du die current_page bist, dann greifst du bitte auf die css-Klasse .active zurück". So stelle ich mir das jedenfalls vor.

Dies ist meine Navi

HTML:
	<div class="id" id="globalnavi">
		<ul>
			<li><a href="index.php" class="active">Neuichkeitn</a></li>
			<li><a href="about.php">Übba unz</a></li>
			<li><a href="pott">Dä Pott</a></li>
			<li><a href="sonstiges.php">Sonstiget</a></li> 
			<li><a href="links.php">Linkz!</a></li>
			<li><a href="guest.php">Schmier ma rein!</a></li>
			<li><a href="main.php">Mässätsch Boahd</a></li>
		</ul>
	</div>

Nun gut, das muß alles nicht mehr heute sein. Was bin ich dir eigentlich für die Hilfe schuldig?
 
Zuletzt bearbeitet von einem Moderator: ([code] -> [html])
das mit der navi ist auch nicht so schwer, kann man verschiedene wege gehen. das mit der schuldigkeit ist immer sone sache...
 
Sooo, ich will mal wieder an der Seite weiter schrauben.
Zunächst will ich erst einmal nur eine Kleinigkeit hinkriegen und zwar soll hinter "Ruhrpott Online | " ein Seitentitel (bspw. "Herzlich Willkommen") angezeigt werden. Ich wollte dafür in das Template die Variable {{title}} einsetzen, die später beim Generieren der Seite durch den Seitentitel ersetzt wird. Ich nehme an, das dies auch si möglich ist, allerdings hab ich es bisher nicht hin gekriegt und hoffe also auf eure Hilfe.
 
du kennst doch strtr. wo ist das problem? template einlesen, variablen ersetzen, ausgeben.
 
Es wäre kein Problem, wenn ich mir den entsprechenden Code so einfach aus den Ärmeln schütteln könnte wie du es kannst :(

Ich schraub hier ja schon die ganze Zeit nach dem Vorbil herum, aber es will mir nicht gelingen
 
Zurück
Oben