noch eine sql abfrage die nicht funktioniert?!
jenslm
- php
Hi Leute,
noch eine Frage!
Warum funktioniert das nicht?!
$sql = "SELECT * FROM menu_items";
$result = mysql_query($sql, $database) or die(mysql_error());
$row = mysql_fetch_assoc($result);
do
{
echo "<li><a href=\"".$row['link']."\" target=\"".$row['target']."\">stat</a></li>\n";
}
while(mysql_fetch_assoc($result));
Ausgabe:
<li><a href="/" target="">hello</a></li>
<li><a href="/" target="">hello</a></li>
<li><a href="/" target="">hello</a></li>
<li><a href="/" target="">hello</a></li>
<li><a href="/" target="">hello</a></li>
In der Datenbank:
id | link | target
-------------------
1 | / |
-------------------
2 | h | t
-------------------
usw.
komischerweise wird allerdings 5 mal der erste Eintrag der Tabelle gezeigt.
Es sind auch 5 Einträge in der Tabelle?
Was mache ich falsch?
Lg, Jens
Hallo,
$row = mysql_fetch_assoc($result);
do
{
echo "<li><a href="".$row['link']."" target="".$row['target']."">stat</a></li>\n";
}
while(mysql_fetch_assoc($result));
Was mache ich falsch?
Du legst hier in der ersten Zeile die Variable $row an.
Und gehst das Result über die letzte Zeile durch, gibts aber jedes mal das $row von der ersten Zeile wieder aus.
Es muss unten also while($row = mysql_...) heißen.
Gruß
Alex
Hello,
was hältst Du denn davon, Deinen Code gleich von Anfang an etwas aufzuteilen?
Den Fehler hat Dir Aley schom genannt https://forum.selfhtml.org/?t=198555&m=1333626.
Du musst auch nicht immer gleich alles ausgeben, somndern kannst die alternativen Ausgaben erst sammeln in Variablen und dann nachher erst an der passenden Stelle in dein HTML-Gerüst einsetztn.
Die() ist jedenfalls nicht elegant. Außerdem sollte der User diesen Fehler auch gar nicht unbedingt zu Gesicht bekommen, sondern nur eine Meldung, mit der er etwas anfangen kann. Die MySQL-Fehlermeldung würde ich stattdessen in ein Log umleiten, wo sie der Admin dann lesen kann.
define('CRLF',chr(13).chr(10));
$sql = "SELECT link, target FROM menu_items";
$result = mysql_query($sql, $database);
if $result
{
$out .= erzeuge_ausgabe($result);
}
else
{
$out .= erzeuge_fehlermeldung_mit_link_zurueck($mysql_error());
}
#------------------------------------------------------------------------
function erzeuge_ausgabe($result)
{
$ausgabe = '';
while($row = mysql_fetch_assoc($result))
{
$ausgabe .= '<li><a href="' . htmlspecialchars(rawurlencode($row['link'])) . '"' .
' target="' . $row['target']. '">' .
htmlspecialchars($row['linktext']) . '</a></li>' . CRLF;
}
return $ausgabe;
}
#------------------------------------------------------------------------
function erzeuge_fehlermeldung_mit_link_zurueck($errortxt)
{
# ...
# siehe oben
}
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
![](http://selfhtml.bitworks.de/Virencheck.gif)
--
☻\_
/▌
/ \ Nur selber lernen macht schlau
<http://bergpost.annerschbarrich.de>
Hi!
$ausgabe .= '<li><a href="' . htmlspecialchars(rawurlencode($row['link'])) . '"' .
' target="' . $row['target']. '">' .
Die ganze URL durch rawurlencode() zu schicken ist vermutlich kontraproduktiv, denn nur einzelne Werte müssen kontextgerecht angepasst werden, nicht jedoch die
Trennzeichen : . / ? = und & (beziehungsweise ;).
Den target-Wert nicht durch htmlspecialchars() zu schicken kann auch eine Lücke darstellen. Auch wenn er aus einer vermeintlich sauberen Quelle kommt, schadet es nicht, ihn HTML-gerecht aufbereiten zu lassen.
Lo!
Hello,
$ausgabe .= '<li><a href="' . htmlspecialchars(rawurlencode($row['link'])) . '"' .
' target="' . $row['target']. '">' .Die ganze URL durch rawurlencode() zu schicken ist vermutlich kontraproduktiv, denn nur einzelne Werte müssen kontextgerecht angepasst werden, nicht jedoch die
Trennzeichen : . / ? = und & (beziehungsweise ;).
Danke, das stimmt.
Hatten wir dafür nicht auch schon mal irgendwo eine Funktion im Archiv stehen? Ich kann aber nix finden.
Ist leider ganz schön komplex.
Erst zerlegen mit parse_url(), dann das element ['query'], falls vorhanden, weiter zerlegen in Parameter und dann die ganzen Einzelteile behandeln und anschließend wieder zusammenbauen.
Welchen String wüden man für diese URi denn wohl in der Datenbank vermuten? Was wären die Rohdaten?
$url = 'http://www.bitworks.de/srcipts/index.php/param1/param2/?a=zurück&b=ändern';
Müsste man den so, wie abgebildet in der DB vermuten?
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hi!
Erst zerlegen mit parse_url(), dann das element ['query'], falls vorhanden, weiter zerlegen in Parameter und dann die ganzen Einzelteile behandeln und anschließend wieder zusammenbauen.
Für den Querystring gibt es parse_str().
Welchen String wüden man für diese URi denn wohl in der Datenbank vermuten? Was wären die Rohdaten?
$url = 'http://www.bitworks.de/srcipts/index.php/param1/param2/?a=zurück&b=ändern';
Müsste man den so, wie abgebildet in der DB vermuten?
Nein. Es kommt darauf an, wer die URL auf diese Weise zusammenbaut. Wird sie von extern geliefert, würde ich auf die URL-Kodierung verzichten, denn das PHP-Script kann nicht sagen, ob die URL nicht vielleicht schon kodiert ist und nun doppelt kodiert und versaut wird. htmlspecialchars() muss reichen, der Rest ist im Prinzip außerhalb der Reichweite des Scripts.
Beim Selberbauen sollte man ordentlich url-kodieren - und da entfällt auch das Zerlegen.
Lo!
Hello,
Nein. Es kommt darauf an, wer die URL auf diese Weise zusammenbaut. Wird sie von extern geliefert, würde ich auf die URL-Kodierung verzichten, denn das PHP-Script kann nicht sagen, ob die URL nicht vielleicht schon kodiert ist
Das müsste man doch eigentlich feststellen können...
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hi!
Nein. Es kommt darauf an, wer die URL auf diese Weise zusammenbaut. Wird sie von extern geliefert, würde ich auf die URL-Kodierung verzichten, denn das PHP-Script kann nicht sagen, ob die URL nicht vielleicht schon kodiert ist
Das müsste man doch eigentlich feststellen können...
Nicht mit Sicherheit, denn ein Programm kann lediglich anhand von Indizien entscheiden, nicht aber die Intention dahinter erkennen. Du kannst natürlich feststellen, ob die entsprechenden Teile der URL gültige URL-Kodierung-Sequenzen und kein unkodiertes Zeichen enthält. Aber wozu der ganze Aufwand? Wenn ich die URL nicht selbst zusammengebaut habe, interessiert es mich eigentlich auch nicht, ob der andere dabei Fehler eingebaut hat oder nicht. Das ist zunächst sein Problem. "Meine" Sicherheit ist auf alle Fälle durch htmlspecialchars() gewährleistet.
Lo!