Antworten auf deine Fragen:
Neues Thema erstellen

slimbox per php und db ansprechen

strichcode

Nicht mehr ganz neu hier

Guten Abend allerseits,

Ihr habt mir schon einmal so nett geholfen und nun tappe ich wieder im dunkeln.

Es ist, glaube ich nur eine Kleinigkeit, aber es ist etwas schwierig zu erklären:

Ich habe eine Datenbank in deren Feldern u.a. die absoluten Pfade zu Bildern stehen.
"Bild_klein" und "Bild_groß".
In diesen Feldern stehen jeweils untereinander die Pfade zu den Bildern.

Beispiel:
http://www.Bild_groß1.jpg
http://www.Bild_groß2.jpg
usw...

Mit php versuche ich nun den richtigen Quelltext zu schreiben, den die Slimbox benötigt.
HTML:
<a href= 'http://www.Bild_groß.jpg' rel='lightbox-atomium'><img src=' http://www.Bild_klein.jpg'  /></a>
Mir gelingt das auch sogar halbwegs, nur leider mit einem Fehler.

Das große Bild wird ordnungsgemäß in der Slimbox gezeigt, das kleine Bild leider nicht.
Ich erhalte genau soviele Thumbnails, wie in der Datenbank sind, nur leider immer das gleiche.


Beispiel:
HTML:
<a href= 'http://www.Bild_groß1.jpg' rel='lightbox-atomium'><img src=' http://www.Bild_klein3.jpg'  /></a> 
<a href= 'http://www.Bild_groß2.jpg' rel='lightbox-atomium'><img src=' http://www.Bild_klein3.jpg'  /></a> 
<a href= 'http://www.Bild_groß3.jpg' rel='lightbox-atomium'><img src=' http://www.Bild_klein3.jpg'  /></a>
In diesem Falle waren in dem DB-Feld jeweils drei Pfade untereinander angegeben.

Und hier ist mein code:

PHP:
$abfrage = "SELECT `Bild_klein` FROM datenbankname WHERE HAUS_NR_INTERN = '123' ";
$ergebnis = mysql_query($abfrage);
while ($daten = mysql_fetch_assoc($ergebnis)) {
   $images = explode("<br />",nl2br($daten['Bild_klein']),-1);

     foreach($images as $key)
  {
    if(empty($key))
   {
      continue;
   }
  trim($key); 
  }
} 
$abfrage2 = "SELECT `Bild_groß` FROM datenbankname WHERE HAUS_NR_INTERN = '123' ";
$ergebnis2 = mysql_query($abfrage2);
while ($daten = mysql_fetch_assoc($ergebnis2)) {
   $images2 = explode("<br />",nl2br($daten['Bild_groß']),-1);

     foreach($images2 as $key2)
  {
    if(empty($key2))
   {
      continue;
   }
   trim($key2);
echo "
   <a href= '$key2' rel='lightbox-atomium'><img src='$key'  /></a>
   ";
  }
} 
?>
key2 wird ordnungsgemäß nacheinander in den href geschrieben, key allerdings
wiederholt immer nur den letzten Pfad, der in dem Datenbankfeld liegt.

Vielleicht könnt Ihr mir helfen. Sicherlich ist mein "untereinander" geschriebener Code nicht
besonders hübsch, aber besser kann ich es nicht.
Ich bin was php angeht Anfänger und schon froh, es bis dahin überhaupt geschaft zu haben.
(Immerhin funktioniert die Slimbox überhaupt, das ist doch schon mal was ;-) )

Lieben Dank schon mal und ich hoffe das ganze verständlich ausgedrückt zu haben.
Heike
 

Duddle

Posting-Frequenz: 14µHz

AW: slimbox per php und db ansprechen

Ein paar Verständnisfragen, bevor ich definitiv antworten kann:
  • gibt es zu jedem kleinen Bild auch ein großes Bild?
  • kann es mehrere relevante Zeilen für eine Datenbankabfrage geben? Also könnte es sein, dass mehr als exakt eine Zeile für eine bestimmte Hausnummer existiert?

Dein Fehler liegt in den beiden voneinander getrennten Schleifen: in der ersten while-Schleife hast du die foreach-Schleife, die $key nach und nach auf alle in $images verfügbaren Werte setzt. Ergo ist nach der foreach-Schleife $key der letzte Eintrag von $images, also bspw. Bild_klein3.jpg.
Unabhängig davon gibst du dann in der nächsten foreach-Schleife für jeden $key2 in $images2 den aktuellen Wert aus (Bild_groß1, Bild_groß2, etc.), aber $key verändert sich nie. Deshalb erhälst du das fehlerhafte Ergebnis.

Dafür gibt es mehrere Lösungen, aber um die korrekte zu finden sind die o.g. Fragen wichtig.

Noch eine etwas andere Frage: ist es schon zu spät, die Datenbank korrekt zu modellieren, d.h. sind schon Anwendungen dagegen programmiert worden? Du hast ja schon selbst gemerkt, dass die Lösung mit unterschiedlichen Bildern in der gleichen Zeile Probleme macht. Das kommt von einem Fehlentwurf und sollte korrigiert werden, falls das noch machbar ist.


Duddle
 

strichcode

Nicht mehr ganz neu hier

AW: slimbox per php und db ansprechen

Hallo Duddle,

vielen Dank für Deine schnelle Antwort.
Ich versuche mal so gut es geht die DB zu erklären:

Zuerst mal die Datenbank selbst: sie steht leider so da, wie sie ist. Da gibt es keine nachträglichen Verbesserungsmöglichkeiten, ich habe da keinen Einfluß.

Ein Datensatz besteht unter anderem aus: Hausnummer, Name, viele viele andere, dann kommen die Pfade zu den Bildern. Jedes Bild gibt es in mehreren immer gleichen Größen: klein, mittel, groß.

Also sieht es so aus (ich versuche es mal "aufzuzeichnen")

H.-Nr. | Name | v.a. Felder | Pfad zu Bild1_klein | Pfad zu Bild 1_mittel | Pfad zu Bild1_gr |
1 | anton | | www...Bild.1_klein.jpg | www....1_mittel.jpg | www...Bild1_gr.jpg www...Bild2_klein.jpg |www....2_mittel.jpg | ww...Bild2_gr.jpg www...Bild3_klein.jpg |www....3_mittel.jpg | ww...Bild3_gr.jpg
_______________________________________________________________________
2 | berta | | www...Bild.1_klein.jpg | www....1_mittel.jpg | www...Bild1_gr.jpg

Es gibt pro Haus unterschiedlich viele Bilder also Pfade dahin. Diese stehen immer in einem Feld untereinander. Was es noch schlimmer macht: Es gibt sehr viele Bild-Kategorien.
z.B. Außen-Bilder, Innen-Bilder, Umgebungsfotos, und und und

(Aber danach zu Fragen, wie man automatisch nicht nur den Inhalt der Felder nacheinander abarbeiten kann,
sondern dann auch noch nach und nach die Kategorien, das traue ich mich erst, wenn ich mal ein Stückchen weiter mit php bin.)

Hier:
ist mir damals geholfen worden, als ich ein anderes Problem mit der Abfrage hatte, dort
wird es vielleicht etwas klarer warum es den bisherigen Code gibt.

Ich hoffe, das beantwortet Deine Fragen gut genug und finde es nett, daß Du mir helfen willst.
Lieben Gruß
Heike
(für heute bin ich off - ich sitz schon den ganzen Tag am Rechner)
 

strichcode

Nicht mehr ganz neu hier

AW: slimbox per php und db ansprechen

Nachtrag: Mist, es ist versprungen!
Eigentlich wollte ich die DB-Felder ordentlich untereinander dargestellt haben, sorry!
 

Duddle

Posting-Frequenz: 14µHz

AW: slimbox per php und db ansprechen

Also der Code den du damals bekommen hast ist ... umständlich, sagen wir es mal so. Folgender Ausschnitt geht davon aus, dass es zu jedem kleinen Pfad auch einen großen gibt, sonst kommt Blödsinn raus. Zweitens gehe ich davon aus, dass immer nur exakt eine Zeile die gewünschten Bilder enthält, sonst brauchst du Schleifen. Ich habe auch keinerlei Fehlerabfragen eingefügt, um es nicht zu unübersichtlich zu machen. Falls du das auch sehen willst, kann ich das noch erläutern.
PHP:
<?php
//Daten holen. 
//Es ist nur 1 Zeile, also ist keine Schleife fuer _fetch_assoc notwendig.
$abfrage = "SELECT `Bild_klein`,`Bild_groß` FROM datenbankname WHERE HAUS_NR_INTERN = '123' ";
$ergebnis = mysql_query($abfrage);
$daten = mysql_fetch_assoc($ergebnis);

//Daten aufsplitten. 
//Falls das Ergebnis inkorrekt ist, statt \n eines von folgendem testen: \r oder \n\r oder \r\n
$klein = explode("\n", $daten['Bild_klein']);
$gross = explode("\n", $daten['Bild_groß']);

//jetzt steht in $klein an 0ter Stelle das erste kleine Bild und in $gross an 0ter Stelle das erste grosse Bild
//wenn wir also jedes kleine Bild betrachten und dessen Position kennen, kennen wir dessen Position in $gross
foreach($klein as $index => $pfadKlein) {
    $pfadGross = $gross[$index];
    echo "klein: $pfadKlein - gross: $pfadGross <br>";
}
?>
Mehr ist es nicht. Du solltest jeden Schritt hier nachvollziehen können. Falls nicht, frag nach oder schau dir das Handbuch zu den jeweiligen Funktionen an.


Duddle
 

strichcode

Nicht mehr ganz neu hier

AW: slimbox per php und db ansprechen

Hallo Duddle,

Du bist ein Held! Das hat auf den Punkt genau geklappt.

Um mehrere Felder mit Bild-Pfaden hintereinander abzufragen, habe ich jetzt folgenden Code:

PHP:
$abfrage = "SELECT * FROM datenbankname WHERE HAUS_NR_INTERN = '123' ";
$ergebnis = mysql_query($abfrage);
$daten = mysql_fetch_assoc($ergebnis);
echo mysql_error(); 

$klein = explode("\n", $daten['KAT05_50'],-1);
$gross = explode("\n", $daten['KAT05_800'],-1);

foreach($klein as $index => $pfadKlein) {
    $pfadGross = $gross[$index];
    echo "<a href= '$pfadGross'><img src='$pfadKlein'/> </a>";
    }
$klein1 = explode("\n", $daten['KAT04_50'],-1);
$gross1 = explode("\n", $daten['KAT04_800'],-1);
foreach($klein1 as $index => $pfadKlein1) {
    $pfadGross1 = $gross1[$index];
    echo "<a href= '$pfadGross1'><img src='$pfadKlein1'/> </a>";
//und so weiter  
}
?>
Das mag zwar noch zu umständlich sein, oder man kann es noch kürzer schreiben,
aber ich komme fürs erste damit wunderbar klar.

Ich danke Dir nochmal
LG
Heike
 

Duddle

Posting-Frequenz: 14µHz

AW: slimbox per php und db ansprechen

Ich weiß nicht warum du den Hang dazu hast, ständig neue Variablen definieren zu wollen. Du kannst die auch überschreiben, wenn du sie nicht mehr brauchst. Das macht das Script übersichtlicher und es schleichen sich weniger Tippfehler ein.

Abgesehen davon gilt: immer wenn sich Code doppelt, denkt sich ein Programmierer "hmmm, das muss doch besser gehen?" Das Prinzip ist hier zu abstrahieren, also die Logik zu verallgemeinern und die sich unterscheidenden Teile zu parametrisieren. Du musst bspw. nicht zwanzig Programme für "1+1", "1+2", usw. schreiben, sondern nur eines für "1+$variableZahl".

Im konkreten Fall unterscheiden sich die beiden Code-Abschnitte nur in den beiden angesprochenen Spalten. Also verallgemeinern wir das. Sinnvoll wäre hier eine Funktion, die dann mit den verfügbaren Daten gefüttert wird. Falls du die Konzepte "Funktion" und "Rückgabewert" noch nicht kennst, google sie. Ein Ansatz wäre wie folgt:
PHP:
function slimboxBilder($klein, $gross) {
    foreach($klein as $index => $pfadKlein) {
	  $pfadGross = $gross[$index];
	  echo "<a href= '$pfadGross'><img src='$pfadKlein'/> </a>";
    }
}
Ich könnte auch das explode() reinziehen, aber so ist es nicht auf mehrzeilige Daten angewiesen. Jetzt könnte dein Code schon so aussehen:
PHP:
 $abfrage = "SELECT * FROM datenbankname WHERE HAUS_NR_INTERN = '123' ";
//etc
//irgendwo auch die o.g. Funktionsdefinition
$klein = explode("\n", $daten['KAT05_50'],-1);
$gross = explode("\n", $daten['KAT05_800'],-1);
slimboxBilder($klein, $gross);

$klein = explode("\n", $daten['KAT04_50'],-1);
$gross = explode("\n", $daten['KAT04_800'],-1);
slimboxBilder($klein, $gross);
Das macht exakt das gleiche wie der Code ohne Funktion. Aber wieder wird Code wiederholt. Also abstrahieren wir weiter. Da kleine und grosse Bilder immer in Paaren auftreten, will ich das auch so abbilden.
PHP:
$paar1 = array('KAT05_50', 'KAT05_800');
$klein = explode("\n", $daten[$paar1[0]],-1);
$gross = explode("\n", $daten[$paar1[1]],-1);
slimboxBilder($klein, $gross);

$paar2 = array('KAT04_50', 'KAT04_800');
$klein = explode("\n", $daten[$paar2[0]],-1);
$gross = explode("\n", $daten[$paar2[1]],-1);
slimboxBilder($klein, $gross);
Jetzt ist da plötzlich mehr Code. Aber du siehst schon mal, dass wir Variablen für die Stelle in $daten benutzen. Offensichtlich ist die Unterscheidung mit $paar1 und $paar2 unnötig, beide sind sich ja sehr ähnlich. Also nutze ich noch ein Array / eine Liste von Paaren, um das Prinzip zu verallgemeinern:
PHP:
$bilderPaare = array( array('KAT05_50', 'KAT05_800'), array('KAT04_50', 'KAT04_800') );
foreach($bilderPaare as $paar) {
    $klein = explode("\n", $daten[$paar[0]],-1);
    $gross = explode("\n", $daten[$paar[1]],-1);
    slimboxBilder($klein, $gross);
}
Dieser Ausschnitt erzeugt exakt das gleiche wie deiner mit den Duplikaten. Es ist ausserdem sehr viel wartbarer; ich kann problemlos ein drittes Bilderpaar einfügen und muss nichts weiter ändern. Natürlich gibt es andere Lösungen, man könnte auch noch weiter gehen, aber das reicht erstmal. Ich will es aber noch etwas hübscher machen, also ändere ich die slimboxBilder()-Funktion dahingehend, dass sie den erzeugten Text nicht direkt ausgibt, sondern als Rückgabewert liefert. Dann kann die aufrufende Stelle entscheiden, was sie damit macht. Das Ergebnis ist der folgende Code:
PHP:
//mysql-zeugs

function slimboxBilder($klein, $gross) {
    $ausgabe = "";
    foreach($klein as $index => $pfadKlein) {
	  $pfadGross = $gross[$index];
	  $ausgabe .= "<a href= '$pfadGross'><img src='$pfadKlein'/> </a>";
    }
    return $ausgabe;
}

$bilderPaare = array( array('KAT05_50', 'KAT05_800'), array('KAT04_50', 'KAT04_800') );
foreach($bilderPaare as $paar) {
    $klein = explode("\n", $daten[$paar[0]],-1);
    $gross = explode("\n", $daten[$paar[1]],-1);
    echo slimboxBilder($klein, $gross);
}
Achja, das ist ungetestet. Falls sich ein Tippfehler eingeschlichen hat / Fehler kommen, sag Bescheid.


Duddle
 
Zuletzt bearbeitet:
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Neueste Themen & Antworten

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.616
Beiträge
1.538.358
Mitglieder
67.536
Neuestes Mitglied
QuestionMark
Oben