SQL-Query ausgabe in 3 spaltiges responsive Grid packen - steh auf dem Schlauch!

godlike

Warp drölf
Veteran
Registriert
13 Juli 2013
Beiträge
14.290
Ort
Topkekistan
Moin ihr PHP und SQL Götter :D

Habe ein eigentlich simples Problem. Möchte Daten aus einer Datenbank auslesen (z.B. 9 Zufällige Datensätze aus einer DB) und diese dann in einem responsive Grid darstellen:

Die SQL Abfrage ist jetzt ja kein großes Problem. Sowas halt:

[src=php]$query = "SELECT db.foo, db.bar, db.anzahl FROM db order by RAND() LIMIT 9";[/src]

Nun sollte das ja in 3 Zeilen gepackt werden. Wenn ich da aber eine Schleife mache kommen ja 9 Zeilen raus, mit immer den selben 3 Datensätzen. Ihr versteht was ich meine?

Das ganze sollte ja so aussehen am Ende:

[src=html4strict]<div class="section group"> <div class="col span_1_of_3">
<h3 class="ico1">Name 1</h3>
Datensatz 1.1 Datensatz 1.2</div>

<div class="col span_1_of_3">
<h3 class="ico1">Name 2</h3>
Datensatz 2.1 Datensatz 2.2</div>

<div class="col span_1_of_3">
<h3 class="ico1">Name 3</h3>
Datensatz 3.1 Datensatz 3.2</div>
</div>


<div class="section group">
<div class="col span_1_of_3">
<h3 class="ico1">Name 4</h3>
Datensatz 4.1 Datensatz 4.2</div>

<div class="col span_1_of_3">
<h3 class="ico1">Name 5</h3>
Datensatz 5.1 Datensatz 5.2</div>

<div class="col span_1_of_3">
<h3 class="ico1">Name 6</h3>
Datensatz 6.1 Datensatz 6.2</div>
</div>


<div class="section group">
<div class="col span_1_of_3">
<h3 class="ico1">Name 7</h3>
Datensatz 7.1 Datensatz 7.2</div>

<div class="col span_1_of_3">
<h3 class="ico1">Name 8</h3>
Datensatz 8.1 Datensatz 8.2</div>

<div class="col span_1_of_3">
<h3 class="ico1">Name 9</h3>
Datensatz 9.1 Datensatz 9.2</div>
</div>[/src]

Die Frage ist jetzt wie muss die Schleife aussehen um dieses Ergebnis zu erzielen?

Also so:



Hat mir da jemand einen schnellen Rat? Irgend eine for-Schleife mit $i++ ?

Gruß godlike
 
Ich weiß nicht genau, wie Deine php-Kenntnisse sind und wie Deine Versuche bisher aussehen, deswegen beschreibe ich es mal kurz, vielleicht hilft Dir das schon weiter. Wenn nicht, sag Bescheid.

Als erstes gibst Du Dein einleitendes div aus, dann in einer Schleife die Datensätze einzeln und bei jedem dritten Datensatz die "zwischen"-divs. Also:

[src=php]
echo '<div class="section group"> ';
for (schleife mit hochzählendem $i) {
echo '<div class="col span_1_of_3"><h3 class="ico1">'.$db_name.'</h3>
'.$db_11_12.'</div>';
if ($i % 3 == 0) {
echo '</div>
<div class="section group">';
}
}
echo '</div>';
[/src]

Kann auch sein, dass Du ($i+1)%3==0 nehmen musst, je nachdem wo Dein $i anfängt.
 
  • Thread Starter Thread Starter
  • #3
Kann auch sein, dass Du ($i+1)%3==0 nehmen musst, je nachdem wo Dein $i anfängt.
Ich hatte bis dato noch kein $i irgendwo ;)

Hab das Ganze mal so angepasst:

[src=php]
$query = "blabla";
echo '<div class="section group"> ';
for($i=0; $i < 9; $i++) {
echo '<div class="col span_1_of_3"><h3 class="ico1">'.$row["name"].'</h3>
'.$row["test"].'</div>';
if ($i % 3 == 0) {
echo '</div>
<div class="section group">';
}
}
echo '</div>';[/src]
Allerdings bekomme ich jetzt nur gleiche Datensätze ausgegeben. Muss das Ganze Konstrukt noch in eine Schleife?
 
Das beantwortet die Frage nach den php-Kenntnissen...
(sorry, der musste sein ;) )

Wie kommst Du an Dein $row dran?
Das wird irgendeine db-Funktion sein, die Du auf Dein db-Objekt drauf lässt.
Das müsstest Du in der Schleife dann wiederholen.
Also:

[src=php]$query = "blabla";
$row = funktion_zu_db();
echo '<div class="section group"> ';
for($i=0; $i < 9; $i++) {
echo '<div class="col span_1_of_3"><h3 class="ico1">'.$row["name"].'</h3>
'.$row["test"].'</div>';
if ($i % 3 == 0) {
echo '</div>
<div class="section group">';
}
$row = funktion_zu_db();
}
echo '</div>';[/src]

Wenn das nicht hilft, dann poste mal ein bisschen mehr von Deinem Code. Also den Bereicht ab Definition der Abfragen bis zur Ausgabe.
 
  • Thread Starter Thread Starter
  • #5
Je nachdem, wie viel du mit den Technologien arbeitest könntest du dir mal passende Frameworks angucken.
Clientseitig z.B. Bootstrap, welches unter anderem mit einem responsive Grid-System kommt. Kommt man mMn relativ schnell rein.

Serverseitig irgendein PHP-MVC Framework. Im Idealfall ist der einzige eingebettete php-code für deinen Anwendungsfall:
[src=php]
someClass.getResultTable();
[/src]

Zumindest der Query und eine aufbereitete Rückgabe sollte mMn aber in ein Service-Objekt.
 
Erweiternd zu ´s Antwort. Schau dir mal an, da kommst du sehr schnell rein. Für den Einstieg in MVC und die Denkweise die du dafür brauchst ist das gut geeignet. Ich bin, weil ich mit CI irgendwann an meine Grenzen gestoßen bin, bei gelandet. Das ist offener und du hast mehr Freiheiten, die können einen am Anfang aber auch erschlagen.

Allein ein ORM wie nimmt dir schon wahnsinnig viel Arbeit ab, Doctrine wird unter anderem in eingesetzt.

wird auch oft eingesetzt, damit habe ich aber noch nicht gearbeitet.

Der Aufwand sich in ein solches System einzuarbeiten ist erstmal recht hoch, das System nimmt dir aber viel Arbeit ab und du kannst dich auf das wirklich wichtige konzentrieren, deine Logik, die du brauchst.
 
Das ist so der Schritt, wo die reine Programmierung[*] nicht mehr so stark im Fokus ist und es sich mehr zur Software-Entwicklung verlagert.
Meiner Meinung nach, sobald man etwas fitter mit reiner Programmierung geworden ist, ist es eigentlich immer obligatorisch, zu frameworks bzw. libs (z.B. für ORM) zu wechseln.

So beim zweiten drüberlesen wäre die Empfehlung aber eher, noch ein wenig reine Programmierung zu üben.
Da Grundlagen aber vorhanden sind wäre evtl ein Buch zu OOP oder "OOP mit PHP" eine gute nächste Anlaufstelle.
Im Idealfall lieber ein gutes Buch zu OOP (z.B. aus der "Heads First" / "Von Kopf bis Fuß" Reihe), statt ein "naja" Buch zu OOP mit PHP.



[*] = ganz grob: Probleme lösen orientiert an den von der Sprache explizit zur Verfügung gestellten Mechanismen
 
Zuletzt bearbeitet:
Also für solch kleine Dinge ein ausgewachsenes Framework zu nutzen und alles in irgendwelche Objekte zu packen, halte ich für wenig zielführend.
Bis man sich in CI / Symfony / Cake / oder was auch immer eingearbeitet hat, hat man so kleine Dinge schneller und ressourcenschonender prozedural programmiert.

Aber es ist irgendwie die Unart schlechthin geworden, alles OOP zu gestalten, ob es nun Sinn macht oder nicht.
Und wenn ich erst eine Klasse untersuchen muss (oder die passende Dokumentation wälzen) um eine einfache Aufgabe zu erledigen läuft was falsch.
Daher mal ein etwas älteres Pamphlet:
 
Im Update relativiert der Autor sein Pamphlet allerdings und schreibt sinngemäß "Nachdem ich jetzt etwas Erfahrung damit habe, finde ich Code Igniter doch nicht mehr ganz so schlecht" ;-).

Bis man sich in CI / Symfony / Cake / oder was auch immer eingearbeitet hat, hat man so kleine Dinge schneller und ressourcenschonender prozedural programmiert.
Das hat einen eigenen Namen bekommen: .

Der Umfang des eigentliches Projektes geht hier ja nicht draus hervor. Aber alleine für den Lerneffekt lohnt es sich erstmal, in jedem Falle möglichst good practice umzusetzen, auch wenn man das Gefühl hat, dass es ein wenig overkill sein könnte.

Und wenn ich erst eine Klasse untersuchen muss (oder die passende Dokumentation wälzen) um eine einfache Aufgabe zu erledigen läuft was falsch.
Das finde ich nicht so entscheidend. Wichtiger ist, Regression zuverlässig zu erkennen, den Code gut erweitern zu können. Oder auch mal Dinge zu ändern, ohne dass man sich durch das ganze Projekt wühlen muss. Oder das man auch ein Jahr später noch versteht, wie einzelne Aspekte des Code zusammen spielen. Oder konkreter eben auch, dass SQL-Abfragen an definierten Stellen auftauchen und nicht potenziell überall.

Es stimmt allerdings, dass:
1. Frameworks gerne grausam in der Einarbeitung sind.
2. Frameworks gerne mal 50% der Zeit im Weg stehen anstatt zu helfen
-> Meist ist dann entweder das Frameworks schlicht nicht so toll oder es passt nicht so gut zum Anwendungsfall.
-> Vermutlich noch häufiger: Man hätte das Problem auch ohne Framework, nur anders.
 
  • Thread Starter Thread Starter
  • #11
Äh, oh, hmmm....

Also ich brauch das, so mit DB Abfragen usw., evtl 4 Tage im Jahr. Wenn ich was wo anpassen muss oder schnell aus einer DB ein paar Daten wo einbinden soll. Das bekomme ich dann schon hin. Halt im herkömmlichen Sinn -> DB Abfrage, Schleife, Rows einbinden, fertig. Ich hab jetzt glaub nicht die nötige Ahnung mich in irgendwelche Frameworks einzuarbeiten, auch nicht die Zeit und danken tut es mir am Ende auch keiner. Kurse oder Fortbildungen hab ich auch noch nie bekommen. Die sollen froh sein wenn ich als Grafiker und Designer überhaupt irgendwelche Webseiten anpasse :coffee:

Oder in wie weit ist das kompliziert wenn man keinen Schimmer von Programmieren hat. Ich kann halt HTML Seiten erstellen, formatieren mit CSS, ne Datenbank irgendwie füllen und per PHP da wieder Zeug anzeigen lassen auf ner Webseite. Wenn ich da jetzt anfange bzw versuche mich wo einzuarbeiten wird es mir jetzt ja schon ganz anders :D
 
Einfaches beispiel aus CodeIgniter (version 2.x, pseudocode, entspricht aber dem von CI)

[src=php]
// Controllers / PageController.php

class PageController extends Controller
{
public function all() {
$all = $this->get_model('page')->all();
$this->view('page/list', $all)
}
}

// Models / PageModel.php

class PageModel extends Page
{
public function all() {
return $this->db->query('SELECT * FROM pages');
}
}

// Views / Page / list.php

<?php foreach($pages as $page) {

echo $page;
}?>


// öffne: deineUrl/Page und du siehst die liste
[/src]


Ein Framework nimmt dir einfach einiges an Arbeit und Strukturierung ab.
 
ch hab jetzt glaub nicht die nötige Ahnung mich in irgendwelche Frameworks einzuarbeiten,
Ich sag es mal so: Wenn Du die Grundzüge von php kennst, kannst Du auch mit einem FW starten.

Gezwungener massen verwende ich bei einem Projekt CakePHP.
Das Ding ist, ähnlich wie CI recht einfach auszubauen. Hat man sich mit dem MVC Konzept angefreundet und auch mit dem Gedanken alles in Objekte zu pressen, spricht nicht viel dagegen.
Ich persönlich sträube mich dagegen. Für die Meisten meiner Projektchen brauche ich kein Modelling und kein Database Abstraction Layer und für eine anzuzeigende Page gleich 3 Dateien zu schreiben widerstrebt mir.


Gerne verwende ich jedoch Hilfsmittel (die z.g.T. OO sind) wie Smarty als Template Engine oder MeekroDB als MySQLi-Wrapper.
Aber wirklich alles zu objektisieren, neeeee.
Mal böse übertrieben:
Code:
Expand Collapse Copy
$BookName = fGetBookNameByISBN("1231231234");
vs.
Code:
Expand Collapse Copy
$Book = new ClsBook();
$Book->SelectByISBN("1231231234");
$BookName = $Book->GetName();

Wobei auch ich nicht so weit gehen würde ein komplettes CRUD prozedural zu schreiben.
Es kommt IMO immer auf die Anwendung an, deshalb auch das komische Beispiel:
Möchte ich eine eigene Bibliothek verwalten, würde ich klar OO gehen. Ich möchte Titel ändern können und und und.
Will ich aber wirklich nur den Namen des Buches aufgrund der gegebenen ISBN auslesen (z.B. weil die Daten aus einem ERP-System kommen) würde ich nicht den Aufwand betreiben das in eine Klasse zu verpacken (das ist ja auch eine gern genutzte Möglichkeit der Klassen, die simple Zusammenfassung von Funktionen, meist um Kollisionen zu vermeiden)
 
Zuletzt bearbeitet:
  • Thread Starter Thread Starter
  • #14
also um ehrlich zu sein verstehe ich nur Bahnhof von dem was ihr hier schreibt. ich weiß halt was eine Variable ist, kann was mit echo ausgeben und dazu behersche ich google. Also Sachen wie mysql_real_escape_string usw. ne funktion kann ich auch schreiben und verstehen, alles darüber verstehe ich aber auch nicht. wie gesagt ich brauch das pro Jahr halt an 3 Tagen ungefähr...
 
Ging aus dem ersten Beitrag bei dir jetzt nicht hervor, sah halt aus als wenn das ein Teilproblem eines größeren Projektes ist, an dem du kontinuierlich arbeitest oder so. Für dich ergibt ein Framework und Co. eventuell wirklich keinen Sinn.



Will ich aber wirklich nur den Namen des Buches aufgrund der gegebenen ISBN auslesen (z.B. weil die Daten aus einem ERP-System kommen) würde ich nicht den Aufwand betreiben das in eine Klasse zu verpacken (das ist ja auch eine gern genutzte Möglichkeit der Klassen, die simple Zusammenfassung von Funktionen, meist um Kollisionen zu vermeiden)
Meine persönliche Faustregel ist so:
Einmal ist in Ordnung. Aber auf das zweite mal folgt irgendwann immer ein drittes und viertes mal. Deswegen refactor ich, sobald eine Doppelung auftritt.

Dein Beispiel-Code verstehe ich nicht. Wo ist das Problem? 2 Zeilen Code? Weniger Zeilen stehen allgemein weit unten in der Priorität.

[src=php]
$Book->SelectByISBN("1231231234");[/src]
Das gehört ja in den Controller.

[src=php]
$BookName = $Book->GetName();
[/src]
Und das in die View, ggf. aber gekapselt in einem Decorator oder Presenter.

Ohne ORM kann ich eventuell noch nachvollziehen. Aber ohne Kapselung wild auf die Datenbank zugreifen fände ich schon sehr grausam.
Komme auch nicht aus der PHP-Ecke, glaube in PHP werden solche Dinge eher mal nahe gelegt.
 

Für einen einmaligen Zugriff kann ich das nachvollziehen, will ich aber nicht nur den Namen sondern auch den Author, erzeugt dein Beispiel aber schon einen Rattenschwanz, den ich mit einer Class vermeiden könnte.

zb. Laravels ORM nutzt static methods zum erzeigen des Objects.
[src=php]
$book = ClsBook::where(['isbn' => '1232'])->get();

$name = $book->name;
$author = $book->author;
[/src]
 
Habe ein eigentlich simples Problem. Möchte Daten aus einer Datenbank auslesen (z.B. 9 Zufällige Datensätze aus einer DB) und diese dann in einem responsive Grid darstellen:
ein responsive grid funktioniert bei der Aufgabenstellung recht gut, wenn man drauf scheisst und es weglässt.


  • hole 9 elemente aus der DB
  • floate diese
  • Kaffee
 
Zurück
Oben