PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tabellenerstellung durch semikolongetrennte Teilwerte


LS64
05.06.2011, 18:47:14
Hallo,

meine Frage bezieht sich auf die Idee, dass ich in ein Feld meiner MYSQL-Tabelle verschiedene Werte schreibe und diese dann als Tabelle (!) ausgeben will.
Das lässt sich wohl am Besten als Beispiel erklären:
In meiner Tabelle gibt es zum Beispiel die Spalte "weiteres". Nun steht bei einem Eintrag dort der Wert:
MYSQL-Anleitung(www._.de/weiteres/mysql_anleitung.pdf);Ein weiteres Dokument(www._.de/weiter.pdf);Schnee schneit Schön(www._.de/schnee.pdf)
Nun soll ausgegeben werden:
NAME DES DOKUMENTS - VERLINKUNG
MYSQL-Anleitung - Link
Ein weiteres Dokument - Link
Schnee schneit Schön - Link
...und die "Link"-Werte dann mittels eines html-Links mit den in Klammern angegebenen Pfaden zu füttern?

So gut, so schön. Meine Idee: Ich zerlege erst in die einzelnen ";"-Abschnitte und dann nochmal in die Überschrift und dann in den Pfad. Das mit den ; sollte ich wohl ohne Probleme hinbekommen, aber wie soll ich dann weitermachen, vom Code her mein ich?

$ex1 = explode(";",$weiteres);
foreach ($ex1 as $ex2)
{
$ex2 = explode ("(", $val); ???!?????
...

echo "<th><td>$name</td><td><a href='$url'>Link</a></th>";


Habe hier etwas gefunden: http://www.selfphp.info/forum/showthread.php?t=9590. Aber das ginge nur, würde ich die Klammern ersetzen. Das wurde ganz ähnlich gemacht wie ich das nun versucht habe, aber ich verstehe den Code um die Komponente "§val[1]" dort nicht. Kann mir das jemand erklären?


Grüße,
LS64

Ckaos
05.06.2011, 20:34:56
Hi

Kann mir das jemand erklären?
Jo das ist tappen im dunkeln ;)
2xmal explode + 2mal foreach = grausam

aber wie soll ich dann weitermachen, vom Code her mein ich?
mit preg_match (http://de.php.net/preg_match) und Reguläre Ausdrücke (http://tut.php-q.net/de/regex.html)

Denke du kannst das ganze auch mit ein wenig Übung dann mit preg_match_all umsetzen ohne dieses explode ;)

mfg

CKaos

LS64
05.06.2011, 23:26:54
Hi CKaos,

vielen Dank für die Antwort. Das Problem: Ich habe von preg_match_all noch nie etwas gehört... kannst du mir hier am Anfang etwas helfen?

Also für...
MYSQL-Anleitung(www._.de/weiteres/mysql_anleitung.pdf);Ein weiteres Dokument(www._.de/weiter.pdf);Schnee schneit Schön(www._.de/schnee.pdf)
...bräuchte ich dann etwas in der Art:
preg_match_all ("/(?P<titel>.?)( (?P<url>.?)/);", $weiteres, $zerklaubt, PREG_SET_ORDER)

print_r($zerklaubt);


Eigentlich passiert mir das selten, aber bei dem Ding habe ich nun ein absolutes Brett vor dem Kopf... also ich muss es doch schaffen die Teile rauszunehmen die in Klammern sind und die, die das eben nicht sind - das per explode zu zerklauben verstehe ich noch sinngemäß, aber bei dem hier kriege ich gerade nen Drehwurm?!

Grüße,
LS64

Ckaos
06.06.2011, 00:52:04
Hi

Also für...
Worum es dir geht habe ich versstanden ;)
...bräuchte ich dann etwas in der Art:
jab
aber bei dem hier kriege ich gerade nen Drehwurm?!
Deswegen meine Links Bitte Lesen.
Hier nochmal der link zu preg_match_all (http://de2.php.net/manual/de/function.preg-match-all.php)
Bitte schaue auch hier den Text inkl. Kommentare an und versuche es zu verstehen
und umzusetzen. Gerade dieser Kommentar (http://de2.php.net/manual/de/function.preg-match-all.php#101259)sollte dich inspirieren. Solltest du feinjustierung benötigen helfen wir dir gerne weiter.

Aber ich für meinen teil schreibe keinen fertigen code hier hin.

mfg

CKaos

LS64
06.06.2011, 02:04:27
Bitte schaue auch hier den Text inkl. Kommentare an und versuche es zu verstehen
und umzusetzen. Gerade dieser Kommentar (http://de2.php.net/manual/de/function.preg-match-all.php#101259)sollte dich inspirieren. Solltest du feinjustierung benötigen helfen wir dir gerne weiter.

Aber ich für meinen teil schreibe keinen fertigen code hier hin.

mfg

CKaos

Danke, das wird nun etwas dauern (max. bis Mi oder Do), da ich gaaaanz nebenbei noch ein Studium zu bewerkstelligen habe. Melde mich, wenn ich da rumprobieren konnte!

Habe mich eingelesen, deine Links angesehen (danke!) und nun funktionieren schon erste Versuche mit dem Code preg_match. Nur mein Brett ist immer noch da: Für preg_match_all war ein "P" in einem Beispiel nach dem Fragezeichen, was ich hier auch gepostet habe. Ich habe das in den regul. Ausdrücken nicht gefunden und rätsele jetzt seit Stunden; bitte beschreibe mir doch kurz was das ist bzw. wo ich das finden kann?!

Nein, Codes reinzustellen wäre mir eh nicht Recht, weil mich das im Leben nicht weiterbringt. Wills ja selber verstanden haben.

Grüße,
LS64

DokuLeseHemmung
06.06.2011, 05:58:44
meine Frage bezieht sich auf die Idee, dass ich in ein Feld meiner MYSQL-Tabelle verschiedene Werte schreibe und diese dann als Tabelle (!) ausgeben will.
Kommaseparierte Werte in SQL Tabellenzellen sind meist eine sehr dumme Idee!

Normalisiere deine Daten und das Problem löst sich von selber.

A Visual Explanation of SQL Joins (http://www.codinghorror.com/blog/archives/000976.html)
SQL und relationale Algebra (http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/chap7.htm)
Die 5 Normal Formen (http://reeg.junetz.de/DSP/node7.html)

Ckaos
06.06.2011, 14:54:02
Hi

Nur mein Brett ist immer noch da: Für preg_match_all war ein "P" in einem Beispiel nach dem Fragezeichen, was ich hier auch gepostet habe. Ich habe das in den regul. Ausdrücken nicht gefunden und rätsele jetzt seit Stunden; bitte beschreibe mir doch kurz was das ist bzw. wo ich das finden kann?!
Das sind wie dort schon steht named subpatterns um eine
weitere geplante differenzierung zu erreichen. Siehe Bsp. preg_match_all (http://de2.php.net/manual/de/function.preg-match-all.php) -> Beispiel #3 Benannte Teilsuchmuster (named subpatterns) und Bsp dazu -> Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
In deinem Fall vielleicht: (Nur zur Ansicht! kein paste code ;))
preg_match_all('/(?P<NAME_DES_DOKUMENTS>\w+): (?P<VERLINKUNG>\d+)/', $str, $treffer);
und nun funktionieren schon erste Versuche mit dem Code preg_match
zeigen ;)

Kommaseparierte Werte in SQL Tabellenzellen sind meist eine sehr dumme Idee!
Unterschreibe ich, aber in manchen Situationen (z.B. Dyn. Attribute) ein einfacherer Weg und gerade für Anfänger in PHP ein beliebter um sich nicht auch noch zu sehr mit Datenbanken zu befassen.

mfg

CKaos

DokuLeseHemmung
06.06.2011, 15:00:57
und gerade für Anfänger in PHP ein beliebter um sich nicht auch noch zu sehr mit Datenbanken zu befassen.
Von mir aus auch ein beliebter Irrweg...

Welch ein Aufwand, damit solche Anfragen wie z.B. "Gib mich alle Links auf PDF Dateien." zu bauen...
Kompliziert, Fehler anfällig und dazu noch ein performancetechnischer Albtraum.

Ckaos
06.06.2011, 20:33:40
Hi

Kompliziert, Fehler anfällig und dazu noch ein performancetechnischer Albtraum.
Jo und wenn er soweit ist das er die performancetechnischen Albträume hat, sehen wir ihn im mysql forum ;)

mfg

CKaos

LS64
10.06.2011, 15:19:20
Jo und wenn er soweit ist das er die performancetechnischen Albträume hat, sehen wir ihn im mysql forum ;)

:)

Ok, da ich gerade nicht zu Hause bin und meinen Code mangels Lebenszeit nicht auswendig gelernt habe, kann ich gerde nicht schreiben, wie der aussieht - kommt noch, wenn ich daheim bin; es beginnt so zu sein, dass ich verstehe, was ich da tun muss.



Zur einfachen Erklärung und vlt. habt ihr da ja eine weitaus bessere Idee das zu verwirklichen:

Ich habe für meine Webseite eine Tabelle namens "projekte". Da dies eine Website ist von Filmschaffenden finden sich dort Sachen wie "Drehbuchautor", "Regisseur", "Aufnahmeformat" etc.. Nun will ich aber auf meiner internen Webseite zusätzlich aus der gleichen Tabelle Informationen bekommen wie "Drehbuch", "Disposition" und so weiter, also Dokumente, die ich nur den "Internen" bereitstellen will und von denen ich selber nicht weiß, wie viele Files es werden bzw. wie diese heißen. Das Einfachste, was mir meine verqueren Gehirnwindungen suggerierten, war, dass ich eine Spalte für "Links" erstelle und diese wie oben beschrieben fülle bzw. ausgeben lasse. So unglaublich viel wird das nicht werden, mehr als 30 Dokumente kann ich mir momentan nicht vorstellen und so viele Projekte werden das auch nicht sein.

Habt ihr da bessere Ideen? (Ich gebe natürlich sofort zu, dass ich nicht sehr viel Ahnung von der Materie hier habe... nur ein ganz kleines Bisschen mehr denn keine.)



Grüße,
LS64

LS64
15.06.2011, 16:05:17
So, nun endlich:


nach viel Rumexperimentieren kamen für mich viele Codes in den Sinn (habe mir einen Testcode gebaut) und kann jetzt begrenzt mitreden bei dem Ganzen. Nur meinem Ziel bin ich leider absolut begrenzt näher gekommen. (Aus Interesse: Wäre es wirklich egal was für ein Zeichen ich als Delimiter verwende, abgesehen von "ungünstigen" Solchen?)



$einsatz = 'ich bin nicht gut (in PHP1), ich bin nicht wirklich gut (in PHP2), ich bin nicht sonderlich gut (in PHP3),';
preg_match_all("~\([^)]*\),~", $einsatz, $zerklaubt2, PREG_SET_ORDER);
print_r($zerklaubt2);

Das bringt mir dann meine Ausgabe "(in PHPx)", aber wenn ich dann versuche als regex sowas wie...
.*\([^)]*\)
...herzunehmen wirds kritisch. Das mit den benannten Teilausgaben ist zwar schön, mir würde aber momentan reichen, wenn ich dem irgendwie erklären kann, dass ich bis zum Anfang oder bis zum letzten Semikolon die Abfrage haben will. Wenn ich
.{5}
verwende kommt ja schließlich (logischerweise) die Zeichenkette der letzten 5 vor der Klammer. Somit müsste ich das einfach vorne begrenzen können und einen Stern nach dem Punkt einsetzen, was mir aber faktisch dann auch nichts hilft, da vor der ersten Eintragung schließlich kein ";" steht... aber abgesehen davon, dass
\;[.*]\([^)]*\)~
als Regex einfach mal garnicht funktioniert, das oben genannte aber schon, bin ich am Ende meiner Irrfahrt noch nicht angelangt, da die Ausgabe dann wohl sowas wie
[1]
[1] ich bin nicht gut (in PHP1)
[2] (inPHP1)
[2]
...
wäre, wenn ich das System nun nicht vollkommen missverstanden habe. Und ich wollte eigentlich nicht mit php danach noch die Klammern wieder rausschneiden; oder ist genau DAS der Grund, weshalb benannte Teilausgaben erwähnt wurden?


Ich habe mich ehrlich bemüht das hinzubekommen und dennoch: HILFE! (das gibts doch nicht, dass das so schwer ist... vlt. hab ich auch schon Burnoutsyndrom und kapier einfach nichts mehr?!)

Ckaos
24.06.2011, 15:47:06
Hi

HILFE!
gegen meine Aussage poste ich dir Code ;)

schau mal wie einfach die Scriptwelt sein kann.
<?php
$einsatz = 'ich bin nicht gut (in PHP1), ich bin nicht wirklich gut (in PHP2), ich bin nicht sonderlich gut (in PHP3),';
preg_match_all("/(.*)\((.*)\)/U", $einsatz, $zerklaubt2, PREG_SET_ORDER);
print_r($zerklaubt2);
?>

mfg

CKaos

LS64
29.06.2011, 13:41:54
Hi,


ok, das war so nicht gemeint, aber verbindlichsten Dank dafür. So funktioniert es nun natürlich.
Wobei ich mir das nochmal zu Gemüte führen musste; aber im Nachhinein, jetzt wo ich mir den nochmal im Zusammenhang mit deinen Links überarbeitet habe, ist der Code tatsächlich einigermaßen banal (bis auf das U am Ende, das ich mir nochmal klar machen muss). Vielen Dank für die Hilfe, das war sehr hilfreich und ich werde mich mal in diese "Scriptwelt" mehr einlesen um das ganze mal selbst besser zu können, da besteht eine Menge Nachholbedarf.


Danke vielmals,

Grüße,
LS64

TeX
30.06.2011, 13:56:55
Dadurch Du so schön mit explode angefangen hast, haste hioer noch den Rest ;-) .

<?php
$var='MYSQL-Anleitung(www._.de/weiteres/mysql_anleitung.pdf);Ein weiteres Dokument(www._.de/weiter.pdf);Schnee schneit Schön(www._.de/schnee.pdf)';

$out=array();
$ds_array=explode(';',$var);

foreach($ds_array as $w){
list($bez,$muell)=explode('(',$w);
list($url,$muell)=explode(')',$muell);

echo $bez.' - <a href="http://'.$url.'">klick</a><br />';
}
?>

LS64
02.07.2011, 20:21:57
So, ich habs jetzt alles. Danke an alle Helfenden, speziell an TeX und ganz besonders nochmal an Ckoas.

Alles bestens :)


Mit besten Grüßen,
LS64