[php] title-attr bei generierten links hinzufügen

KeinKommentar

Stolzer Webbi :-)
ID: 8090
L
13 Juni 2006
2.077
190
PHP:
echo"<tr><td valign='top' width='$abstand'>";
$x=0;
$w0="b";
$w1="B";
$query ="SELECT * from $w0 ORDER BY wort ASC";
$result=mysql_query($query);
while($row=mysql_fetch_array($result)){
$w2=substr($row[wort],1);
if($x < 1){ echo"<a href='". urlencode($row[wort]) .".html'><font size='-1' color=#DC143C style=text-decoration:none><b>$w1</b></font><font size='-1'><b>$w2</b></font></a><br>"; }
elseif($x >= 1){ echo"<a href='". urlencode($row[wort]) .".html'><font size='-1'><b>$w1$w2</b></font></a><br>"; }
$x=$x+1;
}
if($x == 0){ echo"<font size='-1' color=#DC143C style=text-decoration:none><b>$w1</b></font>"; }
echo"</td></tr>";

Dieser Codeabschnitt für jeden einzelnen Buchstaben generiert auf meiner Übersichtsseite alle Links.

Jetzt hätte ich gern (wozu mir die Kenntnisse fehlen), daß diese generierten Links automatisch mit einem title-Attribut versehen werden. Dazu müßte man aus der DB die Zeile "titel" auslesen und in der wiederum WORT durch den Eintrag im Feld "wort" ersetzen.

Beispiel: Link lautet "Salz", der automatisch generierte meta-tag title "Das Salz in der Suppe sein". Feld titel in der DB: "Das WORT in der Suppe sein", Feld wort: "Salz"

Was sicher auch geht, daß man den Code nicht für jeden Buchstaben erstellt, sondern das das einmal grundsätzlich am an Anfang der Datei löst, oder?

+++

Wollte es eigentlich in Lose4Scripts einstellen, aber da geht es anscheinend um Kauf oder Verkauf kompletter Scripte.
 
Du hättest es auch in Lose4Scripts reinstellen können. Dort hättest du aber für die Lösung vielleicht etwas bezahlen müssen.

Guck mal ob das hier funktioniert:
PHP:
echo"<tr><td valign='top' width='$abstand'>";
$x=0;
$w0="b";
$w1="B";
$query ="SELECT wort, titel from $w0 ORDER BY wort ASC";
$result=mysql_query($query);
while($row=mysql_fetch_array($result)){
    $w2=substr($row[wort],1);
    if($x < 1)
    { 
        echo"<a title=\"".$row['titel']."\" href='". urlencode($row[wort]) .".html'><font size='-1' color=#DC143C style=text-decoration:none><b>$w1</b></font><font size='-1'><b>$w2</b></font></a><br>"; 
    }
    elseif($x >= 1)
    { 
        echo"<a title=\"".$row['titel']."\" href='". urlencode($row[wort]) .".html'><font size='-1'><b>$w1$w2</b></font></a><br>"; 
    }
    $x=$x+1;
}
if($x == 0){ 
    echo"<font size='-1' color=#DC143C style=text-decoration:none><b>$w1</b></font>"; 
}
echo"</td></tr>";

Ist ganz schön frickeliger Code. Wer hat das denn für dich gemacht?
 
Bis auf die Tatsache, daß er WORT nicht durch den entsprechenden DB-Eintrag ersetzt, funzt es.

Muß man das also doch für jeden Buchstaben einzeln machen?

Nun ja, ich will es mal so sagen: Das ganze Script hat 40 der 50€ gekostet. Dabei war ich allerdings NICHT auf billig aus, sondern auf ordentlich. Welche Bedeutung hate "frickelig" für Dich? HAbe ich ja noch nie gelesen/gehört...
 
Hmm wie würde ich frickelig übersetzen. Ich glaube mit unschön oder unprofessionell.
Es so runtergeschrieben, nicht eingerückt, undeutige Variablennamen wie $w0 oder $w1 und keine Kommentare. Da brauch man min. 3mal solange um den Code zu verstehen.
Naja ich schreib dich mal eben bei ICQ an.
 
Probier mal einfach, das Query in Zeile 5(?) durch Folgendes zu ersetzen:
PHP:
$query ="SELECT wort, REPLACE(titel, 'WORT', wort) AS titel FROM $w0 ORDER BY wort ASC";
 
So geht es. :D

Ich hoffe, es hält mich niemand für faul oder undankbar, wenn ich noch einmal frage, ob man dies nicht verallgemeinernd für alle Buchstaben zusammen coden kann. (Deshalb hatte ich es eigentlich ins Lose4 stellen wollen - da müßte ich meiner Aufdringlichkeit wegen nicht so ein schlechtes Gewissen haben. :LOL:)
 
Probier mal, ob das hier etwa das ist, was Du Dir vorstellst:
PHP:
$characters = 'abcdefghijklmnopqrstuvwxyz';
for ($i=0; $i<strlen($characters); $i++)
{
	echo "<tr><td style='vertical-align: top; width: {$abstand}px;'><font size='-1'>";
	$result = mysql_query("SELECT wort, REPLACE(titel, 'WORT', wort) AS titel FROM {$characters[$i]} ORDER BY wort ASC");
	if (!$result or mysql_num_rows($result)==0)
	{
		echo '<b style="color: #DC143C; text-decoration: none;">'.strtoupper($characters[$i]).'</b>';
	}
	else
	{
		$template = '<a title="%s" href="%s"><b style="color: #DC143C; text-decoration: none;">%s</b></a><br/>';
		while ($row=mysql_fetch_array($result))
		{
			printf($template, $row['titel'], urlencode($row['wort']), ucfirst($row['wort']));
			$template = '<a title="%s" href="%s"><b>%s</b></a><br/>';
		}
	}
	mysql_free_result($result);
	echo "</font></td></tr>";
}
 
Ist ja Wahnsinn... Du hast ja nicht nur die Ausgabe des title-Attr verallgemeinert, sondern ganz nebenbei "gepflegte" 300 Zeilen Code ersetzt... 8O

Was hat der erste Coder da fabriziert?! :ugly:

Da scheine ich Deinem Kommentar zustimmen zu müssen, ob ich will oder nicht.

Also, da MUSS ich jetzt dranbleiben. Das optische Erscheinungsbild paßt so zwar nicht mehr (z.B. nur noch eine Tabelle statt wie vorher 5 - daher alle Links untereinander, bei den noch leeren Buchstaben zeigt es ein zusätzliches /b> an), aber das läßt sich bestimmt beheben.

Darf ich so unverschämt sein, Dir die ganze Datei schicken zu wollen? Vielleicht bekäme ich ich die vorherige Raumaufteilung mit Deinem Code irgendwann hin - aber ebend nur vielleicht. :oops:

Sollte ich wider Erwarten noch einmal zur Welt kommen, muß ich dringend was gegen mein programmiertechnisches Unvermögen tun...

ps: Habe erst mal wieder die alte Version am Start, weil ich das Erscheinungsbild Deiner Lösung auf die Schnelle nicht die alte Aufteilung anpassen kann.
 
Zuletzt bearbeitet:
Den alten Coder würde ich primär dafür schlagen, dass er für jeden Buchstaben eine eigene Tabelle gebaut hat. Absolut überflüssig und ineffizient, da man die komplette Ansicht eigentlich mit einem einzigen Query bauen könnte.

Probier mal, das gesamte Tabellenkonstrukt durch den folgenden Code zu ersetzen. Dadurch verlierst Du auch die Verschachtelung zweier Tabellen:
PHP:
$rows = $split_after = 5;
$characters = 'abcdefghijklmnopqrstuvwxyz';

// Tabellenstruktur definieren
echo '<table style="width: 100%;"><colgroup>';
for ($i=0; $i<$rows; $i++)
{
	echo '<col width="'.round(100/$rows).'%"/>';
}
echo '</colgroup><tr style="vertical-align: top;"><td><font size="-1">';

for ($i=0; $i<strlen($characters); $i++)
{
    echo '<p class="buchstabe">';
    $result = mysql_query("SELECT wort, REPLACE(titel, 'WORT', wort) AS titel FROM {$characters{$i}} ORDER BY wort ASC");
    if (!$result or mysql_num_rows($result)==0)
    {
        echo '<b style="color: #DC143C; text-decoration: none;">'.strtoupper($characters{$i}).'</b>';
    }
    else
    {
        $template = '<a title="%s" href="%s.html"><b style="color: #DC143C; text-decoration: none;">%s</b><b>%s</b></a><br/>';
        while ($row=mysql_fetch_array($result))
        {
            printf($template, $row['titel'], urlencode($row['wort']), substr(strtoupper($characters{$i}), 0, 1), substr($row['wort'], 1));
	        $template = '<a title="%s" href="%s.html"><b>%s%s</b></a><br/>';
    	}
    }
    mysql_free_result($result);
    echo '</p>';

    if (($i+1)%$split_after==0 and $rows-->1)
    {
    	echo '</font></td><td><font size="-1">';
    }
}

echo '</font></td></tr></table>';
Wenn's nicht hinhaut, schick mir doch mal die Datei und 'nen Dump der Tabellen a-z an <mein_nickname> at mindfuck.de.
 
Funzt!

Was ich aus dem Code leider nicht mehr ersehen kann: Wo der Abstand zum oberen Rand und der zwischen den Zellen geregelt wird, der jeweils zu groß ist (und von FF und IE nun auch unterschiedlich interpretiert wird). Das cellspacing vorher hatte sogar ich verstanden.^^

Daß der Abstand nach oben so groß ist, wundert mich als Laien ziemlich, da ja zu lesen ist: vertical-align: top;

Hättest mal bloß nie geantwortet... :oops:
 
Zuletzt bearbeitet:
An der Stelle würde ich jetzt (endlich *g*) mit CSS anfangen. Insgesamt hast Du ja nur noch 5 Zellen für diese Tabelle und jeder Buchstabe hat dann einen eigenen p-Tag mit der Klasse "buchstabe". <p> hat von Natur aus einen üppigen Rahmen um sich rum. Um die Abstände zu verändern, müsstest Du dann im CSS für p.buchstabe den margin- oder padding-Wert je nach Deinen Ansprüchen anpassen.

Bedenk dabei, dass Du global für alle <p>s noch einen Wert für line-height gesetzt hast, den Du für p.buchstabe eventuell auch anpassen musst.
 
Nur mal als kleiner Test, weil ich nach einer verheerenden Niederlage unseres Dart-Teams zu destruktiv war/bin:

PHP:
p.buchstabe { line-height:12px; font-size:10px; margin-top:3px; margin-bottom:0px; font-family:Times,serif; }

Setzt er nur bei den Buchstaben um, die noch keinen Eintrag haben (Q, R...). Bei allen, wo ein Link folgt, greift er verständlicherweise auf die allgemeine Linkformatierung der .css zurück. Die kann ich aber nicht verkleinern, weil sonst ja alle Links "aus dem Rahmen fallen". Bräuchte gewissermaßen noch ein a.buchstabe im Code, um auch die individuell für die Übersichtsseite formatieren zu können.

Aber ich schaue es mir noch einmal an, wenn ich den Frust ausgeschlafen habe. :D
 
Vielleicht liest Du ja zufällig noch einmal rein... Versuche, wenigstens ein paar Sachen zu begreifen (wobei php da ziemlich außer Acht bleibt). Dabei ist mir aufgefallen, daß ich in Zeile 10

PHP:
echo '</colgroup><tr style="vertical-align: top;"><td><font size="-1">';

dem "font size="-1" nur bedingt einen Sinn zuordnen kann, da ich doch alles in meiner css definiere. :?:

Und die zweite Kleinigkeit: Der W3C Validator meckert

Error Line 77, Column 250: document type does not allow element "P" here; missing one of "APPLET", "OBJECT", "MAP", "IFRAME", "BUTTON" start-tag.

…><font size="-1"><p class="buchstabe"><a title="1) Sich winden wie ein Aal<br

Beanstandet der bei jedem Buchstaben. Kann ich das ignorieren? Genauer gesagt: Ist es schädlich, das nicht auszubessern?
 
Den font Tag kannste ja mal rausnehmen und gucken was passiert. Auf jeden Fall geht dann schonmal dein zweiter Fehler weg.
W3C schrieb:
One possible cause for this message is that you have attempted to put a block-level element (such as "<p>" or "<table>") inside an inline element (such as "<a>", "<span>", or "<font>").

Wenn das Probleme macht, musst du etwas an deinem CSS arbeiten.