| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |

25-11-2009, 05:42
|
|
Heiner
Registrierter Benutzer
|
|
Registriert seit: Jan 2002
Beiträge: 139
|
|
mehrere Werte in einem mysql Feld
Hallo,
in einem CMS sind die Gruppen denen der User angehört kommasepariert
in einem Feld (groups_id) als Zahlen abgelegt.
In einer 2. Tabelle ist abgelegt, wie die Gruppen heißen, 2=Gruppe2 etc.
(group_id, name)
Bei dieser Abfrage:
Code:
$query = ("SELECT * FROM `" . TABLE_PREFIX . "user_extend` e JOIN `" . TABLE_PREFIX . "users` u
ON e.user_id=u.user_id JOIN `" . TABLE_PREFIX ."groups` g ON g.group_id=u.groups_id order by u.display_name");
$results = $database->query($query);
while ($row = $results->fetchRow()) {
$ausgabe .= '<td> ' . $row['username'] . '</td>';
$ausgabe .= '<td>' . $row['groups_id']. '</td>';
}
return $ausgabe;
erhalte ich als Ausgabe:
Name: User1, Gruppe: 2,5,6
Ändere ich die Abfrage :
Code:
$ausgabe .= '<td>' . $row['groups_id']. '</td>';
in
Code:
$ausgabe .= '<td>' . $row['name']. '</td>';
erhalte ich als Ausgabe:
Name: User1, Gruppe: Gruppe2
Der Name der Gruppe 5 und 6 ist abgeschnitten, da nur
der 1. Wert der Feldes ausgegeben wird.
Hat jemand einen Lösungsansatz?
Vielen Dank.
|

25-11-2009, 05:55
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Hallo Heiner,
da kommst du leider nicht drumherum, mit PHP das Feld groups_id zu exploden und dann aus der Gruppentabelle die Namen einzeln abzufragen.
Mit einer DB, die nicht einmal in der 1. Normalform ist, kann man halt keine vernünftigen Abfragen machen. Ich frage mich, was das für ein CMS sein soll.
Edit: Es gibt zwar noch einen anderen Weg, aber der ist so dreckig, dass ich mir nach dem Tippen gleich erstmal die Hände abschmirgeln muss:
Code:
on concat(',', u.groups_id, ',') like concat('%,', g.group_id, ',%')
Gruß,
Amica
Geändert von AmicaNoctis (25-11-2009 um 06:42 Uhr)
|

25-11-2009, 06:40
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Bist du sicher, dass $row['name'] nicht der Username ist?
Das Abschneiden findet so nicht statt. Die JOIN-Klausel g.group_id = u.groups_id wird entweder erfüllt oder nicht. Wenn ich u.groups_id "2,5,6" steht und in g.group_id nur 2, dann wird nicht gejoint.
Stell dir mal vor, MySQL würde sich wirklich die Werte so zurecht schnippel, dass jede JOIN-Bedingung erfüllt wird!
|

25-11-2009, 06:44
|
|
Heiner
Registrierter Benutzer
|
|
Registriert seit: Jan 2002
Beiträge: 139
|
|
Hallo,
danke für die Anregungen.
Ist das CMS Websitebaker.
Kurzen Tipp zum exploden?
Habe das schon versucht mit split und dann for each,
habe aber keine Ausgabe bekommen.
|

25-11-2009, 06:46
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Zitat:
Zitat von onemorenerd
Das Abschneiden findet so nicht statt.
|
Oh doch. Ist wirklich so. In MySQL ist 2 = '2Tomaten' wahr. Bei Vergleichen mit nur einem numerischen Argument wird das andere auf numerisch gecastet und ab dem ersten ungültigen Zeichen abgeschnitten.
Geändert von AmicaNoctis (25-11-2009 um 06:56 Uhr)
|

25-11-2009, 06:51
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Zitat:
Zitat von Heiner
Kurzen Tipp zum exploden?
|
PHP-Code:
$groups = ... // komplette Gruppentabelle aus DB // mit group_id als Key $groupIds = explode(",", $row["groups_id"]); foreach ($groupIds as $gid) { // mach was mit $groups[$gid] }
|

25-11-2009, 07:51
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Stimmt. Guten Morgen allerseits.
Das hat sich irgendwann mal falsch in mein Hirn gebrannt. Seit dem behaupte ich das und werde immer wieder eines besseren belehrt. Ich habe sogar irgendwo den Auszug aus ANSI-SQL.92 gespeichert ...
... hab ihn gefunden. *abschreib*
Geändert von onemorenerd (25-11-2009 um 07:58 Uhr)
|

25-11-2009, 07:56
|
|
Heiner
Registrierter Benutzer
|
|
Registriert seit: Jan 2002
Beiträge: 139
|
|
Danke für die Tipps, da reichen meine Kenntnisse nicht mehr aus.
Bekomme keine Ausgabe oder bei verschiedenen Versuchen
nur Buchstaben.
habe das noch eingefügt:
Code:
$query3 = ("SELECT * FROM `" . TABLE_PREFIX . "groups` ");
und dann in die Schleife:
$groups = mysql_fetch_array($query3);
$groupIds = explode(',', $row['groups_id']);
foreach ($groupIds as $gid) {
$row['groups_id'] = $groups['gid'];
}
und die Ausgabe:
$ausgabe .= '<td>' . $row['groups_id']. '</td>';
}
|

28-11-2009, 13:19
|
|
rossixx
Registrierter Benutzer
|
|
Registriert seit: Jul 2003
Ort: Berlin
Beiträge: 461
|
|
wie wäre es mit einer neuen tabellen struktur
mit einer neuen - besseren tabellenstruktur könntest du auch bessere und einfachere abfragen stellen.
|

28-11-2009, 16:41
|
TobiaZ
 Moderator
|
|
Registriert seit: Jan 2001
Ort: MUC und MGL, Germany
Beiträge: 34.188
|
|
PHP-Code:
$query3 = ("SELECT * FROM `" . TABLE_PREFIX . "groups` ");
#und dann in die Schleife:
$groups = mysql_fetch_array($query3);
Das ist ja schon ziemlicher unfug und sollte dir einen entsprechenden Fehler bringen!
Benutz doch bitte die  -Tags. Dann kann man deinen Code besser lesen.
Geändert von TobiaZ (28-11-2009 um 16:45 Uhr)
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|