datenbanken problem

menzimuck

Aktives Mitglied
Thread Starter
Dabei seit
20.04.2005
Beiträge
294
Reaktionspunkte
0
ave

ich habe u.a. die zwei tabellen "fotos" und "berichte" in einer datenbank eingerichtet, erste mit den feldern "id", "berichte_id" und "text", die zweite mit den feldern "id", "zeit", "titel", "text" und "kategorie".

sinn der sache wäre, mit der tabelle "berichte" einen neuen blogähnlichen eintrag zu generieren mit den genannten attributen.

später möchte ich mit der tabelle "fotos" bilder uploaden können, die dann eine eigene id bekommen, die zudem auch gerade der dateiname wird. "berichte_id" wird den gleichen wert bekommen wie die "id" des blogeintrages, zu dem das bild gehört.

bis hier hin stimmen meine codes, und ich hoffe, ihr kommt soweit noch nach.

das eigentliche problem kommt jetzt:

PHP:
	if ( $nav == "" )
	{
        $erg = mysql_query("SELECT * FROM berichte ORDER BY zeit DESC;");
        if ( mysql_num_rows($erg) ) {
            while ( $sql = mysql_fetch_assoc($erg) ) {
				echo "		<td valign=\"top\"><b>".$sql[titel]."</b> [".date("j.n.Y", $sql[zeit])."]<br>".$sql[text]."<br><br>\n";
				echo "		<img src=\"images/linie.png\"><br><br></td>\n";
            }
        }		
		else {
			echo "		<tr>\n";
			echo "			<td colspan=\"2\"><br>Keine Berichte.<br><br></td>";
			echo "		</tr>\n";
		}
    }

mit diesem code werden alle einträge der tabelle "berichte" ihrer "zeit" nach aufgelistet, also chronologisch absteigend. aber jetzt habe ich total den faden verloren und weiss nicht, wie ich gerade anschliessend an den "text" des eintrags alle fotos bekomme, deren "berichte_id" gleich der "id" des eintrages ist. kann da jemand helfen?

vielen dank für eure hilfe, falls mehr angaben hilfreich wären, einfach posten.
 
Mmmh.

Du könntest das entweder mit einer Abfrage machen, was aber die Unschönheit hat, das Du dann in der Ergebnismenge die Felder der Tabelle berichte pro Eintrag in der Tabelle fotos drin hast.

SELECT b.titel, b.zeit, b.text AS bericht_text, f.text AS foto_text FROM berichte AS b LEFT JOIN fotos AS f ON(b.id = f.berichte_id) ORDER BY b.zeit DESC



Oder Du Du teilst Das auf zwei Abfragen auf.
Holst Dir also erst die Daten aus den Berichten und dabach die aus den Fotos.
 
danke für die antwort, aber mir scheint die variante, bei der ich zuerst die berichte und danach die dazugehörigen fotos hole besser. nur krieg ich eben da immer ein durcheinander mit den klammern und den variablen aus zwei tabellen, die ich ja miteinander verknüpfen will.

mir schwebt vom code so was in der richtung wie im ersten post vor, einfach dass nach dem ".$sql[text]." ein neues SELECT folgt, das diejenigen fotos holt, deren "berichte_id" (tabelle "fotos") gleich der "id" (tabelle "berichte") des berichtes ist. sowas sollte doch eigentlich nicht sehr schwierig sein, nur funktionieren meine codes nicht.
 
Ich würde es der einfachheit halber erstmal in einem PHP - Array ablegen und dann danach die Ausgabe machen.

Dann hast Du das holen der Daten und die Ausgabe in HTML getrennt, was ich übersichtlicher finde.

<?php
$dbc = mysql_connect("localhost", "root", "") or die("Keine Verbindung möglich: " . mysql_error());
mysql_select_db("test");

function getBerichte(){
$ret = array();

$sql = "SELECT * FROM berichte ORDER BY zeit DESC";
$result = mysql_query($sql);

while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
$ret[$row["id"]] = $row;
}
return $ret;
}

function getFotosByBerichte($ber){

if(!empty($ber)){
$berIDs = implode(",", array_keys($ber));

$sql = "SELECT * FROM fotos WHERE berichte_id IN(".$berIDs.")";
$result = mysql_query($sql);

while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
$ber[$row["berichte_id"]]["fotos"][] = $row;
}
}
return $ber;
}
$berichte = getBerichte();
$berichte_fotos = getFotosByBerichte($berichte);

print_r($berichte_fotos);



?>
 
hossa, das sieht ja super aus. vielen dank. aber wie gebe ich das ganze jetzt als normalen text aus? dein code alleine ergibt folgendes:

Array ( [29] => Array ( [id] => 29 [zeit] => 1230073200 [titel] => Ecuador [text] => ya en ecuador [kategorie] => Ecuador ) [27] => Array ( [id] => 27 [zeit] => 1229986800 [titel] => Fiesta de Despedida [text] => bim sturzi [kategorie] => Despedida [fotos] => Array ( [0] => Array ( [id] => 7 [berichte_id] => 27 [text] => ) [1] => Array ( [id] => 3 [berichte_id] => 27 [text] => Solokanadier ) [2] => Array ( [id] => 8 [berichte_id] => 27 [text] => ) ) ) [28] => Array ( [id] => 28 [zeit] => 1229986800 [titel] => Ausflug zum Machu Picchu [text] => reich der inkas [kategorie] => [fotos] => Array ( [0] => Array ( [id] => 6 [berichte_id] => 28 [text] => ) [1] => Array ( [id] => 9 [berichte_id] => 28 [text] => ) ) ) )
 
Genau.
Du machst jetzt eine foreach Schleife und gibst dann die Sachen aus, die Du jeweils brauchst.

<?php
$dbc = mysql_connect("localhost", "root", "") or die("Keine Verbindung möglich: " . mysql_error());
mysql_select_db("test");

function getBerichte(){
$ret = array();

$sql = "SELECT * FROM berichte ORDER BY zeit DESC";
$result = mysql_query($sql);

while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
$ret[$row["id"]] = $row;
}
return $ret;
}

function getFotosByBerichte($ber){

if(!empty($ber)){
$berIDs = implode(",", array_keys($ber));

$sql = "SELECT * FROM fotos WHERE berichte_id IN(".$berIDs.")";
$result = mysql_query($sql);

while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
$ber[$row["berichte_id"]]["fotos"][] = $row;
}
}
return $ber;
}
$berichte = getBerichte();
$berichte_fotos = getFotosByBerichte($berichte);

//print_r($berichte_fotos);
?>
<html>
<head></head>
<body>
<?php
if(!empty($berichte_fotos)){
echo "<table border=\"1\">\n";
foreach ($berichte_fotos as $key => $value) {
$bericht = $value;
echo "<tr>";

//id
echo "<td>".$bericht["id"]."</td>";

//zeit
echo "<td>".$bericht["zeit"]."</td>";

//titel
echo "<td>".$bericht["titel"]."</td>";

//text
echo "<td>".$bericht["text"]."</td>";

//Anzahl Fotos
echo "<td>";
if(array_key_exists("fotos", $bericht)){
echo count($bericht["fotos"]);
}
echo "</td>";
echo "</tr>\n";

//Fotos
if(array_key_exists("fotos", $bericht)){

for($i=0; $i < count($bericht["fotos"]);$i++){
$foto = $bericht["fotos"][$i];
echo "<tr>";
echo "<td colspan=\"5\">Foto Nr ".($i+1).": ".$foto["text"]."</td>";
echo "</tr>";
}
}
}
echo "</table>\n";
}
?>
</body>
</html>
 
mit folgendem code klappts fast ganz:

<?php
$dbc = mysql_connect(" ", " ", " ") or die("Keine Verbindung möglich: " . mysql_error());
mysql_select_db(" ");

function getBerichte(){
$ret = array();

$sql = "SELECT * FROM berichte ORDER BY id DESC";
$result = mysql_query($sql);

while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
$ret[$row["id"]] = $row;
}
return $ret;
}

function getFotosByBerichte($ber){

if(!empty($ber)){
$berIDs = implode(",", array_keys($ber));

$sql = "SELECT * FROM fotos WHERE berichte_id IN(".$berIDs.")";
$result = mysql_query($sql);

while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
$ber[$row["berichte_id"]]["fotos"][] = $row;
}
}
return $ber;
}
$berichte = getBerichte();
$berichte_fotos = getFotosByBerichte($berichte);

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<?php include("include/head.php"); ?>
</head>

<body background="images/bg.jpg">

<div id="Header"></div>

<div id="Menu"><img src="images/menu.png" alt="Menu" width="140" height="313" border="0"></div>

<div class="Content" id="Content">

<?php
if(!empty($berichte_fotos)){
foreach ($berichte_fotos as $key => $value) {
$bericht = $value;

//titel und datum
echo "<b>".$bericht["titel"]."</b> [".$bericht["titeldatum"]."]<br>";

//text
echo "".$bericht["text"]."<br><br>";


//Fotos
if(array_key_exists("fotos", $bericht)){

for($i=0; $i < count($bericht["fotos"]);$i++){
$foto = $bericht["fotos"][$i];
echo "<img src=\"fotos/".($i+1).".jpg\"><br><br>";
//echo "".$foto["text"]."<br><br>";
}
}
echo "<img src=\"images/linie.png\"><br><br>";
}
}
?>


</div>

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

dieser code zeigt jetzt alle einträge der tabelle "berichte" sauber an und merkt auch, wie viele fotos dazugehören.
aber mit der nummerierung happerts noch...der code sucht immer dieselben fotos: 1.jpg, 2.jpg, 3.jpg usw.
wie lassen sich die effektiven fotos darstellen, diejenigen deren "berichte_id" (fotos) gleich der "id" (berichte) ist und deren eigene "id" und damit der dateiname nicht von 1 an beginnt?
 
Zuletzt bearbeitet:
Da wäre das einfachste, das man die for()-Schleife durch eine weiter foreach()-Schleife ersetzt.

Irgendwo oben im Code definiertsz Du eine Variable $count = 0;
und die Schleife für die Fotos machst Du folgendermasßen:
foreach($bericht["fotos"] AS $key => $foto){
echo "<img src=\"fotos/".$count.".jpg\"><br><br>";
//echo "".$foto["text"]."<br><br>";
$count++;
}
 
wo und wie soll ich $count = 0 definieren?
 
Irgendwo am Anfang.

Wenn Dein erstes Bild allerdings nicht 0.jpg heißt, solltest Du $count auf 1 setzen.

Aber mal was anderes.
Ich vermittele Dir hier die ganze Zeit absolute Grundlagen (nicht böse gemeint).

Bist Du sicher, das Du nicht irgendeine fertige Lösung benutzen möchtest, oder Dich da mal was reinarbeitest ?

Frohes Fest ! :)
 
dankedanke, jetzt klappts schon ganz ordentlich, nur noch leichte einschränkungen.
und zum anderen, du hast schon recht, ich habs jetzt wieder gemerkt. werde mich da mal etwas vertieft damit beschäftigen müssen. danke aber für die schnelle und kompetente hilfe!
 
Zurück
Oben Unten