[PHP|MySQL] Foreach - Doppelt Ausgelesene Einträge

Rain

Lieutenant
Registriert
Mai 2003
Beiträge
704
Hi, folgendes Problem:

Eine (Kontakte-)Datenbank besitzt bei mir als erstes eine Spalte "ID" und als weitere Spalten "Spalte1", "Spalte2", ... , "SpalteN" welche den Wert 0 oder 1 besitzen. Es ist quasi eine Zuordnung der ID's, ob die ID zu "Spalte" gehört (1) oder nicht (0) ... ich hoffe das klingt verständlich.

Auf eine PHP-Seite lese ich die jeweilige ID aus und hole alle Spalten mit ihren jeweiligen 0 bzw 1

PHP:
$do = mysql_query("SELECT * FROM `kontakte_zugeh` WHERE ID='$id';");
$row = mysql_fetch_array($do);
foreach ($row AS $key => $value) {



if ($key!="ID") {

// AB HIER UNINTERESSANT FÜR PROBLEM

echo "<tr><th>".str_replace("_", " ", $key)."</th><td>"; 
if ($value == 1) echo "X";
else echo "&nbsp;&nbsp;";
echo "</td></tr>";
}
}

Was ab dem 1. IF passiert ist eigentlich relativ uninteressant. Die Ausgabe ist allerdings echt unschön!

Code:
1 X 
Spalte1 X 
2 X 
Spalte2 X 
3    
Spalte3  
4    
Spalte4
5 X
Spalte5 X

Er liest es doppelt aus! Erst den Key als numerische Bezeichnung und dann nochmal den Key als eigentliche Bezeichnung, wie es auch in der Datenbank steht.

Wie bekomme ich es hin, dass er nur die eigentliche Key-Bezeichnung aus der DB ausliest und nicht noch so nen numerischen Wert? Gelöst habe ich es bis jetzt immer, indem an der Stelle:

PHP:
if ($key!="ID") {

noch ne Überprüfung für einen zusätzlichen Zähler eingebaut habe (so n mod-operation, also nur jedes 2. Array - Element verarbeiten $i % 2 == 0), aber das is nicht sehr elegant denke ich ;)

-----------------------------------------------------------

Nebenbei stehe ich noch vor einem 2. Problem:

Die Spalten neben ID heißen natürlich nicht Spalte1-SpalteN, sondern haben richtige Bezeichnungen. Ist es möglich eine alphabetische Ordnung zu erhalten? So werden die Spalten nur ausgelesen, wie sie zeitlich erstellt wurden. Oder ist es möglich das row-Array zu sortieren nach keys?



..

Ich bin für jede Hilfe dankbar!


EDIT: Ok, ksort ist schonmal ne lösung fürs 2. Problem
 
Zuletzt bearbeitet:
1. problem:
schau dir mal php.net/mysql_fetch_array php.net/mysql_fetch_row und php.net/mysql_fetch_assoc an ...

kurzer überblick:
mysql_fetch_row liefert dein Ergebnis als indiziertes Array zurück. Aus id, spalte1, spalte2, etc wird also array[0]=inhalt id, array[1]=inhalt spalte1, etc

mysql_fetch_assoc bastelt dir folgendes array: array['id']=inhalt id, array['spalte1']=inhalt spalte1, etc

mysql_fetch_array gibt dir als rückgabearray beides zurück! Also wie fetch_row und fetch_assoc zusammen! daher deine doppelten daten ...


2. klar du kannst das ausgabearray sortieren. dazu musst du aber mysql_fetch_assoc verwenden. bei fetch_row kann das nicht gehen, weil aus den spaltennamen ja ein fortlaufender index wird.

über sql wüsste ich keine möglichkeit die sortierung in den query zu packen...wäre ein interessanter ansatz, weil sehr viel performanter als php, aber dazu fällt mir spontan keine lösung ein.
 
Vielen Dank für deine Antwort. Ein großer Lerneffekt trat gerade ein ;) Ich benutze sogut wie immer das fetch_array, spreche aber die auszulesenen Dinge meist direkt an (bei Datenbanken mit festen Spaltennamen), nur in den foreach (wo dynamisch Spalten hinzugefügt oder entfernt werden können) wird halt jedes Element angesprochen und deswegen die doppelten einträge. Perfekt, danke! :)

Das mit der Sortierung hat sich auch erledigt, da kann ein Haken dran.

------

Wenn wir schonmal dabei sind hab ich nochwas:

In eine Drop-Down-Liste brauche ich an einigen Stellen die Aufliste von den Spalten. Funktioniert auch gut, aber leider liesst es die Spalten so, wie sie zeitlich erstellt wurden sind und ich hätte sie aber gerne alphabetisch. Somit muss ich erst die Werte in ein array packen und das dann nochmal sortieren. Leider bisschen umständlich und deswegen die Frage, ob es besser geht?

PHP:
$zugeh = array();
$do = mysql_query("SHOW COLUMNS FROM `kontakte_zugeh`;");
while ($row = mysql_fetch_array($do) ) {
IF ($row['Field']!="ID")
array_push($zugeh, $row['Field']);
}

asort($zugeh);

foreach ($zugeh AS $value) {
echo "<option>".str_replace("_", " ", $value)."</option>";
}
 
Das könntest du über das information_schema machen:

Code:
SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'DEIN SCHEMA' AND TABLE_NAME = 'kontakte_zugeh' ORDER BY 1
Da "DEIN SCHEMA" natürlich durch dein Schema-Name ersetzen.
 
Zurück
Oben