PHP Parser ";" String zerlegen und mit deren IDs Datensätze aus MySQL auslesen

AMD4Ever

Ensign
Dabei seit
Apr. 2008
Beiträge
184
Hallo Leute!
Ich habe ein großes Problem, und leider derzeit keinen Kopf dafür:

Und zwar steht in einer Datenbanktabelle in einer Zelle z.B. folgender Inhalt, den ich auslesen möchte:

12;5;7;

Das klappt soweit ganz gut.

In der Variable steht dann auch der Inhalt.

Ich brauche einen Parser, der mit einer Schleife den Inhalt ausließt und in eine Variable
schreibt, die ich dann mit jedem Durchlauf ergänze, wie man es aus jeden Informatikkurs kennt.

Leider fehlt mir derzeit das Werkzeug, um einen String aufzulösen.

Beispielsweise steht die

12 für Hans<br>
5 für Stefan<br>
7 für Dieter<br>

Am Ende soll dann
Hans<br>
Stefan<br>
Dieter<br>

stehen


Dann möchte ich über diese IDs, die durch ";" getrennt sind, in eine andere Tabelle folgende Werte auslesen.
 
Zuletzt bearbeitet: (Zu schnell geklickt, sorry)

ICH_BIN_LETZTER

Lt. Junior Grade
Dabei seit
Aug. 2007
Beiträge
490
du kannst den string mit nem regulären ausdruck zerlegen. siehe preg_match evtl sogar preg_match_all. oder wenn es nur die zahlenlsite ist einfach ein explode

gruß
 

AMD4Ever

Ensign
Ersteller dieses Themas
Dabei seit
Apr. 2008
Beiträge
184
Das Problem ist folgendes:
In einer Zelle sind mehrere IDs gespeichert.

Also z.B.
die IDs:
12;5;7;

im HTML-Dokument soll dann beispielsweise
Hans
Stefan
Dieter untereinander stehen.

Normalerweise, wenn ich nur eine ID gegeben hätte, könnte ich mit der gleichnamigen ID die Werte auslesen, so jedoch leider nicht.
 

ICH_BIN_LETZTER

Lt. Junior Grade
Dabei seit
Aug. 2007
Beiträge
490
naja dann lies doch anhand der ids die namen nochmal aus. irgendwo musst du ja die zuordnung haben.

also ids holen dann mit explode die ids einzeln betrachten und für jede id dann die zugehörigen namen holen. (vllt kann man das auch schon mit geschicktem sql machen ;) )

PHP:
....
$ids = '12;13;14';
$idarray = explode($ids, ';'); // kann auch anders rum sein habs grad nicht genau im kopf
foreach($idarray as $key => $value){
    echo hole_namen($value);
}
 
Zuletzt bearbeitet:

ICH_BIN_LETZTER

Lt. Junior Grade
Dabei seit
Aug. 2007
Beiträge
490
bissl oftopic aber müsste das nicht auch so irgendwie per sql gehen (hab leide rgrad keine db am laufen)

Code:
select name from nametabelle where id in (select ids from tabelle_mit_den_ids)
 

ICH_BIN_LETZTER

Lt. Junior Grade
Dabei seit
Aug. 2007
Beiträge
490
hmm wenn dir die ; wichtig sind ansonsten kann man das ja konvertieren ;) oder mit nem string replace in mysql machen.

muss ich mal ausprobieren wenn ich mal wieder zeit habe.

ansonsten noch viel glück mir explode ;)

mfg
 

AMD4Ever

Ensign
Ersteller dieses Themas
Dabei seit
Apr. 2008
Beiträge
184
Es geht relativ einfach:
PHP:
$cpus = $row1['Prozessoren'];

list($cpu1, $cpu2, $cpu3, $cpu4, $cpu5, $cpu6, $cpu7, $cpu8) = explode(';', $cpus);

// MBD CPU Table

for ($i=1; $i<=4; $i++)
{
  //echo "$i ";
  $cpui= "cpu" + $i;

$sql = " SELECT * FROM mbd_cpu_table WHERE ID = $cpui";	//Datensatz auswählen
$query = mysql_query($sql, $link);						//Datensatz ausgeben
$row5 = mysql_fetch_array($query);						//Datensatz in ARRAY speichern
$cpudaten .= $row5['Link'];
}
//echo $cpui;
$cpudaten .= $row5['Link'];
echo $cpudaten;
 

BerniG

Lieutenant
Dabei seit
Okt. 2004
Beiträge
622
Zunächst mal Folgendes: Dieses Schema entspricht keinesfalls einem guten Datenbankdesign (=> Normalisierung?). Überprüfe ob du das nicht ändern kannst.

Man kann in MySQL ein Feld auch Splitten:
Code:
select replace(replace(substring_index('www.computerbase.de', '.', 2),substring_index('www.computerbase.de', '.', 2 - 1),''),'.','')
Wenn du nun sicher weißt, dass in so einem Feld maximal x Werte stehen, könntest du das auch über ein entsprechendes SQL-Statement lösen. So in der Art:
Code:
select * from(
select 1 as fieldnum, replace(replace(substring_index(field, ';', 1),substring_index(field, ';', 1 - 1),''),';','') as id
from table
where xxx
union all
select 2 as fieldnum, replace(replace(substring_index(field, ';', 2),substring_index(field, ';', 2 - 1),''),';','') as id
from table
where xxx
union all
select 3 as fieldnum, replace(replace(substring_index(field, ';', 3),substring_index(field, ';', 3 - 1),''),';','') as id
from table
where xxx
) tmp
join users on tmp.id = users.userid
Wobei die PHP-Lösung in diesem Fall wohl schöner sein dürfte.
 
Zuletzt bearbeitet:

Ksu

Ensign
Dabei seit
Aug. 2006
Beiträge
135
PHP:
$sql = " SELECT * FROM mbd_cpu_table WHERE ID = $cpui";
Hier machst du für jede CPU eine neue Abfrage. Wenn die Tabelle größer ist und mehrere User gleichzeitig auf diese Seite zugreifen dann multiplizieren sich die Abfragen sehr schnell, was zu Lasten der Performance geht. (bei kleinen Webseiten mit wenig Traffic mag das vielleicht nicht viel ausmachen, aber man sollte immer beim Entwickeln solcher Webseiten die Skalierbarkeit im Auge behalten)

Besser wäre es alle IDs in einer Abfrage zu bündeln, so wie schon ICH_BIN_LETZER geschrieben hat:
PHP:
SELECT * FROM mbd_cpu_table WHERE ID in (1, 3, 9, 23)
Das bedeutet, die IDs müssten Kommagetrennt vorliegen. Man kann aber bestimmt in PHP die Semikolone einfach durch Kommas ersetzen.

Ausserdem machst du ein SELECT * was bedeutet, dass du alle Spalten auswählst. Benötigst du wirklich alle Spalten für diese eine Seite? Wenn ja dann ist das ok, ansonsten ist es empfehlenswert nur die Spalten auszuwählen, die du wirklich brauchst. Wie gesagt, wenn mal mehrere hundert User gleichzeitig darauf zugreifen dann macht das schon einen großen Unterschied.
 
Zuletzt bearbeitet:

Mike Lowrey

Commodore
Dabei seit
Juni 2005
Beiträge
4.977
Wie schon gesagt:
Normalisierung.

Alles andere ist Murks.
 
Top