PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [PHP/MySQL] Ausgabe formatieren


dead.line
2009-02-21, 21:30:52
Moin,

Ich hab eine MySQL Tabelle mit 6 Feldern:

id | initial | category | name | info | visible

- id: ist der primary key und auto_increment
- initial: Hält einfach nur einen Buchstaben (für Sortierung und weil ich es bei einer anderen ausgabe auch noch brauch)
- category: Hält einen String wie z.b. "chemicals" oder "food" (Hab insgesamt 6 Kategorien)
-name: Ist letztendlich der Name des Produktes, danach möchte ich auch mit "LIKE '%$string%'" suchen.
- info: hält einen Link oder ist leer.
- visible: Boolean, ob der Eintrag angezeigt werden soll oder nicht.

Jetzt möchte ich das wenn man nach etwas sucht und man Treffer in mehreren Kategorien hat, das die schön formatiert ausgegeben werden.

zum beispiel so:

Chemicals:
- Produkt 1
- Produkt 2
- Produkt 3
- Produkt 4
- Produkt 5

Food:
- Produkt 1
- Produkt 2
- Produkt 3

Das schwierige ist jetzt:
Für eine Kategorie (z.b. Chemicals) soll einmal über die Treffer eine Überschrift rübergeschrieben werden. Sobald die Treffer eine andere Kategorie aufweisen, soll eine neue Überschrift mit der neuen Kategorie kommen und dann die entsprechenden Ergebnisse.
Dabei muss vor jedem Treffer geprüft werden ob "visible=false" oder "true" ist. Entsprechend darf der Treffer dann nicht mitgezählt und ausgeben werden.

Sollte es in einer Kategorie nur 1 oder 2 Treffer geben die BEIDE auf "visible=false" gesetzt sind, darf natürlich nicht die Überschrift mitausgegeben werden.

Kann ich das irgendwie in einer Schleife abarbeiten lassen?
Ich hab bis jetzt das hier. Und das dann für jede kleine Kategorie, was natürlich sehr nervig ist


function products_search($searstring) {

$overallquery = mysql_query("SELECT * FROM products WHERE name LIKE '%{$searstring}%' ORDER BY category, initial, name ASC");
$totaltreffer = mysql_num_rows($overallquery);

// Wurde überhaupt was gefunden?
if ($totaltreffer > 1){
echo '<p>Search Results for &quot;'.$searstring.'&quot; returned '.$totaltreffer.' hits.</p>';

// Chemicals Suche
$query = mysql_query("SELECT * FROM products WHERE name LIKE '%{$searstring}%' AND category='chemicals' ORDER BY initial, name ASC");
$treffer = mysql_num_rows($query);

// Alles mit mehr als einem Treffer
if ($treffer > 1) {
// echo '<p>Search Results for &quot;'.$searstring.'&quot; returned '.$treffer.' hits.</p>';
echo '<h2>Chemicals</h2>';
echo '<ul>';
while ($row = mysql_fetch_array($query)) {

// Visible Flag Check
if ($row['visible']){
echo '<li>';
echo $row['name'];
// Checkt ob für den Eintrag eine Info hinterlegt wurde.Wenn ja, dann wirds gleich in einen Link gegeben. Der Link sollte
// immer nach folgendem Muster angelegt werden: "index.php?id=X"
// Wobei X natürlich durch die entsprechende id ersetzt werden muss.
if(!empty($row['info'])) {
echo '&nbsp;<a href='.$row['info'].' title="Click here for more Information">Information</a>';
}
echo '</li>';
}
}
echo '</ul>';

}
// Nur bei einem Treffer
if ($treffer == 1) {

while ($row = mysql_fetch_array($query)) {
// Visible Flag Check
if ($row['visible']){
// echo '<p>Search Results for &quot;'.$searstring.'&quot; returned '.$treffer.' hits.</p>';
echo '<h2>Chemicals</h2>';
echo '<ul>';
echo '<li>';
echo $row['name'];
// Checkt ob für den Eintrag eine Info hinterlegt wurde.Wenn ja, dann wirds gleich in einen Link gegeben. Der Link sollte
// immer nach folgendem Muster angelegt werden: "index.php?id=X"
// Wobei X natürlich durch die entsprechende id ersetzt werden muss.
if(!empty($row['info'])) {
echo '&nbsp;<a href='.$row['info'].' title="Click here for more Information">Information</a>';
}
echo '</li></ul>';
}else{
echo '<p>Sorry, no matches found. Please respecify your inquiry.</p>';
}
}

}


Das Problem hierbei ist: Sobald ich in einer Kategorie 2 Treffer hab die beide auf "visible=false" stehen, wird die Überschrift ausgegeben aber die Treffer nicht...


Hat jemand ne Idee wie ich das besser umsetzten kann? Hoffe es ist klar geworden was ich überhaupt versuche umzusetzen....

Bin noch ein Anfänger in Sachen PHP und MySQL.

Tommes
2009-02-21, 21:57:19
Erst alle Kategorien auslesen und dann für jede Kategorie suchen.

dead.line
2009-02-21, 22:11:09
Also erst alle 6 Kategorien einmal abfragen und wenn Ergebnisse zurückkommen diese auf visible true oder false testen?

Wie halte ich denn die Daten aus den einzelnen Abfragen lange genug? In mehrdimensionalen Arrays?

Berni
2009-02-21, 23:47:49
Wieso machst du nicht einfach ein
SELECT * FROM products WHERE visible = 'true' AND name LIKE '%{$searstring}%' ORDER BY category, initial, name ASC
Damit sind schonmal alle nicht-sichtbaren weg. Wenn du nun die Ergebnisse durchgehst überprüfst du einfach, ob die category mit der vorigen übereinstimmst und gibst sie dann aus. In etwa so:
$query = mysql_query("SELECT * FROM products WHERE visible = 'true' AND name LIKE '%{$searstring}%' ORDER BY category, initial, name ASC");
$totalresults = $mysql_num_rows($query);
if($totalresults > 0){
echo '<p>Search Results for &quot;'.$searstring.'&quot; returned '.$totalresults.' hits.</p>';
oldcat = "";
$isFirstEntry= true;
while ($row = mysql_fetch_array($query)) {
if ($isFirstEntry){
$isFirstEntry = false;
$oldcat = $row['category'];
echo '<h2>'.$oldcat.'</h2><ul>';
} else if ($row['category'] != $oldcat){
$oldcat = $row['category'];
echo '</ul><h2>'.$oldcat.'</h2><ul>';
}
echo '<li>'.$row['name'];
if(!empty($row['info'])) {
echo '&nbsp;<a href='.$row['info'].' title="Click here for more Information">Information</a>';
}
echo '</li>';
}
echo '</ul>';
} else echo '<p>Sorry, no matches found. Please respecify your inquiry.</p>';

dead.line
2009-02-22, 01:28:28
Super! :D

verdammt warum bin ich nicht da drauf gekommen, das gleich beim SELECT zu filtern xD

Danke für den Code, werd' das gleich mal ausprobieren.


EDIT:: YEAH!! Nach ein paar Änderungen läufts jetzt genauso wie es soll. Hammer, vielen Dank nochmal! :D