PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Whileschleifen Problem


Sarah19
05.03.2005, 23:17:46
Hi Forum ->Cody und Xabbuh ;)

Habe mal wieder eine Frage bezueglich der Whileschleife, und zwar lasse ich ueber folgende Schleife den Inhalt der Db ausgeben
<?php
$result = mysql_query("SELECT * FROM `produkt` WHERE motorrad='Aprilia'
ORDER BY artikel, motorrad, typ");
while ($row = mysql_fetch_array($result))
{
echo htmlspecialchars($row['artikel']); echo '&nbsp;';
echo '<a href="../zeige_artikel.php?fid='.$row['pid'].'">';
echo htmlspecialchars($row['motorrad']); echo '&nbsp;';
echo htmlspecialchars($row['typ']); echo '&nbsp;';
echo '</a><br>';
}

?>

Jetzt wuerde ich gerne, dass nach sobald ein neuer Name fuer Artikel erscheint ein <br> eingebaut wird. Weiss aber nicht, wie ich dies verwirklichen kann.

Danke
Sarah

wolles
05.03.2005, 23:30:28
hi,

Vielleicht versteh ich's ja nicht ganz richtig, aber tut's das echo"</a><br>" am Ende nicht schon?
Oder wo soll der Zeilenumbruch genau sein?

xabbuh
05.03.2005, 23:46:20
Ich muss mich da wolles anschließen. Leider habe ich nicht wirklich verstanden, was du jetzt genau möchtest. Vielleicht könntest du dein Problem ja mal an einem Beispiel näher erläutern.
Außerdem wäre htmlentities() statt htmlspecialchars() in deinem Fall wohl geeigneter.

Sarah19
06.03.2005, 00:17:55
Sorry wenn ich mich undeutlich ausgedrueckt habe.
Also in der DB sind sagen wir mal 10 Artikel. Drei haben in der Spalte "artikel" A, 2 haben B und 5 C. Dabei werden die dann aber noch spezielisiert, in anderen Spalten, quasie als 1,2,3,4,5.
Heisst also dass ich in der DB folgende Artikel habe A1, A2, A3 und dann B1, B2, und mit C das selbe halt nur bis C5.

Nun moechte ich gerne, dass wenn der "artikel" sich aendert ein zusaetliches <br> eingefuehrt wird, so dass es uebersichtlicher ist.

Hoffe ihr versteht es. Falls nicht, dann geht mal hier (http://www.bikefarmmv.de/sitemap/aprilia.php) rauf und dann solltet ihr es sehen.

Danke

wolles
06.03.2005, 00:28:24
Ok, verstanden.


$var="";
while ($row = mysql_fetch_array($result))
{
if ($row[ 'artikel']!=$var) echo "<br>";
echo htmlspecialchars($row['artikel']); echo '&nbsp;';
echo '<a href="../zeige_artikel.php?fid='.$row['pid'].'">';
echo htmlspecialchars($row['motorrad']); echo '&nbsp;';
echo htmlspecialchars($row['typ']); echo '&nbsp;';
echo '</a><br>';
$var= $row['artikel'];
}
Vielleicht musst Du noch die htmlspecialchars mit reinnehmen.
Wenn jetzt das erste <br> weg soll, müsste man den ersten Artikelnamen wissen.

xabbuh
06.03.2005, 00:29:14
Speicher einfach bei jedem Durchlauf, den aktuellen Wert in einer Variablen und überprüfe, ob sich dieser Wert ändert:

<?php
$i = 0;
while ($row = mysql_fetch_array($result)) {
echo htmlspecialchars($row['artikel']); echo '&nbsp;';
echo '<a href="../zeige_artikel.php?fid='.$row['pid'].'">';
echo htmlspecialchars($row['motorrad']); echo '&nbsp;';
echo htmlspecialchars($row['typ']); echo '&nbsp;';
echo '</a><br>';

if($row['artikel'] != $artikelold && $i > 0)
echo '<br>';

$artikelold = $row['artikel'];
$i++;
}
?>

wolles
06.03.2005, 00:42:46
Ich glaub, du musst noch die Bedingung umsetzen um keine Fehlermeldung beim ersten Durchlauf zu erhalten:

if($i > 0 && $row['artikel'] != $artikelold)

Wenn ich mich recht entsinne wird nach nicht Eintreten der 1.Bedingung abgebrochen.

Sarah19
06.03.2005, 00:44:43
Danke,
es ist aber noch ein kleiner Fehler drin.
sie Link vom Posting vorher. Es wird erst nach dem 1.neuen Wort ein Zeilenumbruch gemacht, anstatt noch dem letzten Artikel mit dem gleichen eintrag in "artikel"

Danke
*kuss* Sarah

|Coding
06.03.2005, 00:47:59
Hi Forum ->Cody und Xabbuh ;)
who the fuck is Cody? o_O
ich dachte eigentlich immer in kenne die nicks meiner schützlinge... *g*

ach noch was. ich habe in den letzten tagen intensiv benchmarks mit verschiedenen funktionen durchgeführt (zum vergleich halt :)), dabei auch unteranderem die schleifen.

jetzt möchte ich doch jedem nahe legen, wann immer möglich die foreach-schleife zu nehmen, weil diese rund 50% schneller als for-/while-schleifen sind. bei wenigen durchläufen ist das schnurz piep egal welche, aber wenn es dann mehr als 100-150 werden (oder werden können) dann wäre ein umstieg durchaus sinnvoll. ist aber rein aus performance gründen gemeint...

wolles
06.03.2005, 00:56:37
@Coding:
Gut zu wissen.(braucht man so was auch für Algorithmen ;)
Ich hoffe, daß die Leute auch irgendwann mal 100-150 Artikel bei mir in den Warenkorb legen und die bestellen:)

|Coding
06.03.2005, 01:02:02
@Coding:
Gut zu wissen.(braucht man so was auch für Algorithmen ;)
Ich hoffe, daß die Leute auch irgendwann mal 100-150 Artikel bei mir in den Warenkorb legen und die bestellen:)
jo, je besser die performance des codes je tiefer kannst du mit deinem algorithmus gehen, es soll ja auch nicht all zulange dauern, das verschlüsseln.
war ja jetzt nicht auf die bestellung bezogen, eher allgemein :-)

Sarah19
08.03.2005, 18:58:15
Hallo nochmal
ich habe jetzt folgenden php code:
<?php
$result = mysql_query("SELECT * FROM `produkt` WHERE motorrad='Aprilia'
ORDER BY artikel, motorrad, typ");

$i = 0;
while ($row = mysql_fetch_array($result)) {
echo htmlspecialchars($row['artikel']); echo '&nbsp;';
echo '<a href="../zeige_artikel.php?fid='.$row['pid'].'">';
echo htmlspecialchars($row['motorrad']); echo '&nbsp;';
echo htmlspecialchars($row['typ']); echo '&nbsp;';
echo '</a><br>';

if($row['artikel'] != $artikelold && $i > 0)
echo '<br>';

$artikelold = $row['artikel'];
$i++;
}
?>

Da gibt es jetzt aber folgendes Problem:
wenn ich sagen wir mal folgende Artikel von Aprilia habe:
artikel A, artikel B, artikel C.
Zu jedem dieser Artikel gibt es dann eben typenspeziefisch Datensaetze in der DB.
Dann bekomme ich folgende ausgabe:
artikel A Rs125
artikel A RS250
artikel B Rs125

artikel B Rs125 sport
artikel B RS250
artikel C Rs125

artikel C RS 250

Also dass der Zeilenumbruch um einen zu spaet erscheint. Ich habe jetzt die letzten Tage schon ein wenig mit dem Code rumgespielt, aber die das erhoffte ergebnis gehabt. Koennt ihr mir dabei bitte nochmal helfen?
Erwuenschtes Ergebnis:
artikel A Rs125
artikel A RS250

artikel B Rs125
artikel B Rs125 sport
artikel B RS250

artikel C Rs125
artikel C RS 250

Danke Sarah

|Coding
08.03.2005, 19:44:57
hallo,

so geht's:

<?php
$result = mysql_query("SELECT * FROM `produkt` WHERE motorrad='Aprilia'
ORDER BY artikel, motorrad, typ");

$i = 0;
while ($row = mysql_fetch_array($result)) {
echo htmlspecialchars($row['artikel']) . '&nbsp;';
echo '<a href="../zeige_artikel.php?fid='.$row['pid'].'">';
echo htmlspecialchars($row['motorrad']) . '&nbsp;';
echo htmlspecialchars($row['typ']) . '&nbsp;';
echo '</a><br>';

if($row['artikel'] != $artikelold){
if($i > 0) echo '<br>';
$artikelold = $row['artikel'];
}

$i++;
}
?>

ach: und die drei echos am ende des ausgabe blocks waren auch nicht nötig, habe sie rausgenommen und zum string verknüpft.

Sarah19
08.03.2005, 21:33:53
:-(
funzt (http://www.bikefarmmv.de/sitemap/aprilia.php) leider immer noch nicht. Der gleiche Fehler ist weiterhin vorhanden.
Der Link ist gesetzt, damit ihr sehen koennt was da los ist. Hoffe das stoert nicht/ verletzt die Forenregeln nicht.

Kuss Sarah

|Coding
08.03.2005, 21:57:17
please show uns mal den code, den du verwendest...

|Coding
08.03.2005, 22:17:55
ahh, sorry. ich habe die änderung falsch eingebaut.

.oO(wie peinlich)

so ist es aber recht:

<?php
$result = mysql_query("SELECT * FROM `produkt` WHERE motorrad='Aprilia'
ORDER BY artikel, motorrad, typ");

$i = 0;
while($row = mysql_fetch_array($result)){
if($row['artikel'] != $artikelold){
if($i > 0) echo '<br>';
$artikelold = $row['artikel'];
}
echo htmlspecialchars($row['artikel']) . '&nbsp;';
echo '<a href="../zeige_artikel.php?fid='.$row['pid'].'">';
echo htmlspecialchars($row['motorrad']) . '&nbsp;';
echo htmlspecialchars($row['typ']) . '&nbsp;';
echo '</a><br>';

$i++;
}
?>

wolles
08.03.2005, 23:29:47
$i = 0;
while($row = mysql_fetch_array($result)){
if($row['artikel'] != $artikelold){
if($i > 0) echo '<br>';
$artikelold = $row['artikel'];
......
}

Ähm, vielleicht täusch ich mich, aber gibt's keine Fehlermeldung beim ersten Schleifendurchlauf, wenn $artikelold noch nicht definiert ist?
Müsste es nicht eher so aussehen:

<?php
$result = mysql_query("SELECT * FROM `produkt` WHERE motorrad='Aprilia'
ORDER BY artikel, motorrad, typ");

$i = 0;
while($row = mysql_fetch_array($result)){
if($i > 0){
if($row['artikel'] != $artikelold) echo '<br>';
$artikelold = $row['artikel'];
}
echo htmlspecialchars($row['artikel']) . '&nbsp;';
echo '<a href="../zeige_artikel.php?fid='.$row['pid'].'">';
echo htmlspecialchars($row['motorrad']) . '&nbsp;';
echo htmlspecialchars($row['typ']) . '&nbsp;';
echo '</a><br>';

$i++;
}
?>

|Coding
08.03.2005, 23:46:03
wenn, dann höstens 'ne notice und auch nur mit error_reporting.
mit deinem code das selbe, abgesehen davon das er nicht das gewünschte ergebnis erziehlt.

einfach:

$artikelold = '';

vor die schleife und error_reporting hält den rand.

wolles
08.03.2005, 23:57:45
Hm, versteh nicht, warum er nicht das gleiche Ergebnis liefert.

Edit: ach so, Kommando zurück, bei mir wird im ersten Durchlauf nicht $artikelold zugewiesen.
Bitte untertänigst Gnade walten zu lassen:-)

|Coding
09.03.2005, 00:12:04
weil bei deiner variante dieser teil:

//...
if($row['artikel'] != $artikelold) echo '<br>';
$artikelold = $row['artikel'];
//...

beim ersten durchlauf komplett übergangen wird.

insgesamt passiert das:

1. durchlauf: $row['artikel'], $row['pid'], $row['motorrad'] und $row['typ'] werden ausgegeben
2. durchlauf: $artikelold ist nicht deklariert, somit wird "<br>" ausgegeben.
3. durchlauf: $artikelold ist in durchlauf 2 deklariert und definiert worden. ab hier läuft alles wie es soll.

ergebis mit dem beispiel-array von Sarah19:

artikel A Rs125 // durchlauf 1

artikel A RS250 // durchlauf 2

artikel B Rs125 // durchlauf 3
artikel B Rs125 sport // durchlauf 4
artikel B RS250 // durchlauf 5

artikel C Rs125 // durchlauf 6
artikel C RS 250 // durchlauf 7

|Coding
09.03.2005, 00:14:46
Bitte untertänigst Gnade walten zu lassen:-)
ok, dir sei vergeben. aber wehe sowas kommt noch mal vor, dann verschlüssel ich dich und schmeiß das passwort wech :-)

Sarah19
09.03.2005, 00:31:46
auch ich verzeihe dir wolles.
Aber mit Coding muss ich noch ein ernstes Wort reden....
Also soetwas von einem alten(oder vielleicht auch nicht sooo alt?) Hasen... nee nee nee *kopfschuettel*
grrrr

Danke vielmals

kuss Sarah

|Coding
09.03.2005, 00:32:50
was'n? what have ich gedone?

wolles
09.03.2005, 00:36:16
Puh, bin ich ja beruhicht.
Aber verschlüsseln und PW wegschmeissen, das is ja fast Höchststrafe...schluck

|Coding
09.03.2005, 00:37:19
hart aber gerecht, sag ich nur... :)