hallo.. mal abgesehen davon dass mein DB-design bestimmt schlecht ist, würde ich gerne verstehen warum dieses script funktioniert, trotz nur einem w1 als echo.
kann man das so produktiv verwenden oder ist es zufall und man muss angst haben es könnte jeden augenblick 'zusammenbrechen'(?)
http://img684.imageshack.us/img684/8982/phpzc.jpg
(es geht um bis zu 10 personen, die maximal einem bild zugeordnet sein können, welche dann als links aufgelistet werden sollen.)
(was unglaublicherweise zu funktionieren scheint)
nimmt dann nach der 'Union' alles den ersten spaltennamen an? also w1(?)
mfg, h.
Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge
Ob dieser Query so eingesetzt werden kann hängt davon ab, was Du überhaupt von ihm erwartest dass er tut. Abgesehen davon ist das Datenbanklayout aber wirklich mehr als suboptimal, wenn gleiche Daten in verschiedenen Tabellen verstreut sind. Aber zurück zum Query:
UNION vereinigt die Ergebnisse verschiedener Einzelabfragen und liefert das aggregierte Ergebnis zurück. Hier ergeben sich dann gleich zwei mögliche Probleme:
1. sollten alle Ergebnisse den gleichen Datentyp haben. Ist dies nicht der Fall, so findet intern ein Cast statt. Wie in diesem Fall das Ergebnis aussieht hängt von der eingesetzten Version von MySQL ab und ist also relativ undefiniert.
2. Ergebnisse eines UNION sind DISTINCT, wenn Du also ein Ergebnis bei mehr als einem einzelnen SELECTS zurück geliefert wird, so ist es im Endergebnis des UNION trotzdem nur einmal vorhanden. Um bei deinem Problem zu bleiben: Wenn zwei Personen das gleiche Bild hätten, so wäre es trotzdem nur ein einziges Mal in der Ergebnismenge.
Jetzt zu deinen speziellen Fragen:
kann man das so produktiv verwenden oder ist es zufall und man muss angst haben es könnte jeden augenblick 'zusammenbrechen'(?)
Wie gesagt, das hängt davon ab, was dieser Query leisten soll.
nimmt dann nach der 'Union' alles den ersten spaltennamen an? also w1(?)
Ja, da UNION ohnehin nur gedacht ist wirklich komplett gleichartige Tabellen abzufragen.
Prinzipiell sollte Dir der Namen des Ergebnisses auch egal sein können, Du kannst ja auch einfach ein numerisch indiziertes Ergebnis abfragen (mysql_fetch_row) anstatt mysql_fetch_assoc zu nehmen.
PS: Was meinst Du eigentlich mit folgender Aussage:
warum dieses script funktioniert, trotz nur einem w1 als echo.
Liefert es nur ein einzelnes Ergenis zurück, oder was hast Du als Ausgabe erwartet?
PSS: Fällt mir jetzt erst auf: Dein Script-Ausschnitt will ja in der Schleife noch eine $url holen die nicht existiert. War mir bei der oberflächlichen Betrachtung garnicht aufgefallen. Dein Script ist also allein deswegen fehlerhaft und sollte bei entsprechendem error_reporting mindestens eine E_NOTICE generieren.
Ich vermute, daß Script tut das was es soll: Alle Benutzer auflisten. Da ist der Umstand, daß gleiche Ergebniszeilen (hier: gleiche Benutzernamen) nicht mehrfach auftauchen als glücklicher (Zufall?) zu werten ;-)
Gruß
bor
Einsicht ist ja bekanntlich der erste Schritt zur Besserung :-)
und man muss angst haben
Bei großen Tabellen wird die Abfrage bzw. vor allem die Sortierung sehr Zeitintensiv!
nimmt dann nach der 'Union' alles den ersten spaltennamen an? also w1(?)
Das Referenzhandbuch sagt dazu
[...] Die in der ersten SELECT-Anweisung verwendeten Spaltennamen werden als Spaltennamen für die zurückgegebenen Ergebnisse benutzt. [...]
Quelle: http://dev.mysql.com/doc/refman/5.1/de/union.html
Was genau hast Du eigentlich vor?
Das riecht mir verdammt nach einer n:m-Beziehung die entgegen der Konzepte von relationalen Datenbanken implementiert wurde :-\
Du willst jedem Bild eine Menge (die nicht willkürlich auf 10 Elemente begrenzt sein muß) von Personen zuordnen?
Kann sicher nicht schaden sich mal mit dem Theme Normalisierung (siehe z.B. http://de.wikipedia.org/wiki/Normalisierung_(Datenbank) als Einstieg/Überblick) beschäftigen...
Abgesehen davon: Du hast die Werte zur Ausgabe auch nicht escaped. Die Links würden z.B. nicht mehr funktionieren wenn der Username ein &-Zeichen enthält, die Textausgabe nicht mehr wenn der Username ein <-Zeichen enthält. Für diesen Zweck gibt es zwei PHP-Funktionen...
Gruß
Borlander
oh oh.. da muss ich wohl noch üben..
warum dieses script funktioniert, trotz nur einem w1 als echo.
Liefert es nur ein einzelnes Ergenis zurück, oder was hast Du als Ausgabe erwartet?
ich dachte ich müsste alle, w1 bis w10 'abrufen.'
aber hier stehts ja:
Die in der ersten SELECT-Anweisung verwendeten Spaltennamen werden als Spaltennamen für die zurückgegebenen Ergebnisse benutzt
.....
Du willst jedem Bild eine Menge (die nicht willkürlich auf 10 Elemente begrenzt sein muß) von Personen zuordnen?
ja, sozusagen..
ich habe ca. 1000 bilder, und zu jedem jahr, ort, typ, +mehrere personen.
ich hatte erst eine spalte, in der dann alle pers. standen: [eins, zwei, drei], und dies wurde gleich als bildunterschrift benutzt. dann wollte ich aber jede person klickbar machen und habe dazu die spalte aufgeteilt. [eins][zwei][drei].
...........
das mit der normalisierung muss ich wohl mal durcharbeiten/durchlesen
...............
wegen dem escapen. ich hab mir irgendwie angewöhnt statt \" immer ' zu nehmen. habe bis jetzt nicht gewusst dass man damit schwierigkeiten bekommen kann.
danke sehr
mfg, h.
Das hatte ich gar nicht gemeint. Der HTML-Standard sieht ausschließlich das Zeichen " als Begrenzer für Attributwerte vor, daher sollte man auch nur das verwenden. Sofern in PHP-Strings keine Variablen ausgewertet werden sollen, rate ich allerdings auch dringend dazu ' zur Stringbegrenzung zu verwenden. In diesen Strings kann man dann auch Problemlos " Zeichen einfügen.
Zusammenfassend sollte Zeile 90-93 wie folgt aussehen:
echo '<a href="jumpwriter.php?ownpage='.urlencode($w1).'">';
echo htmlspecialchars($w1);
echo '</a>';
echo '<br />';
Ohne die Encodierung würdest Du mit einem Usernamen a&b auf der Seite von User a landen.
Zum Thema Bilder und Personen: Für eine saubere implementierung brauchst Du 3 Tabellen...
Gruß
Borlander