PHP String Splitten und Editieren

quicksilver

Lt. Junior Grade
Registriert
Jan. 2004
Beiträge
363
Hallo ich hoffe ich kann das Ordentlich rüber bringen so dass ihr das alle versteht :)

Ich habe eine Datenbank in der ein Feld existiert in der ein Paar Daten stehen die ich gerne auf einer Webseite möglichst komfortabel Editieren und hinzufügen möchte. Es handelt sich um ein FTP Server der nun per ODBC Die Daten in eine Tabelle schreibt. Ich kann da leider nichts ändern also bitte nicht sagen Normalisieren oder so :)

Code:
/Daten/Tools,c:\Daten\Tools,R---,FD--I---
/Daten/Test,c:\Daten\Test,R---,FD--I---
/Daten/Tools,c:\Daten\Tools,R---,FD--I---
/Daten/A-Z,c:\Daten\A-Z,R---,FD--I---

Zur Erklärung:

Die Daten sind Pro Zeile wiefolgt aufgebaut:

Alias,Pfad,Dateirechte,Verzeichnisrechte

Die Dateirechte können Maximal sein:
R= Download
W= Upload
D= Löschen
A= Fortsetzen von Downloads usw

Die Verzeichnisrechte können Maximal sein:
F= Dateiliste
D= Ordnerliste
M= Erstellen
R= Löschen
I=Unterverzeichnisse
S=SSL
H=Verstecken
X=Verweigern

Alles was nicht gesetzt ist .. ist ein -

Folgendes habe ich nun :

PHP:
$folders = explode("\n",$outer_row["ConfigValue"]);
$daten ="<select>";
foreach($folders as $folder){	$daten .= '<option value="test">'.$folder.'</option>';	}
$daten .="</select>";

Ich habe nun also ein Select wo ich ein Eintrag pro Zeile habe. Nun würde ich gerne den Eintrag den ich editieren möchte in dem Select auswählen und dann daneben auf einen Button oder link klicken um diesen zu editieren.

Und da gehen meine Bedenken und Probleme los. Den Wert per Klick in das Popup bekommen könnte vielleicht noch klappen ... aber wenn die Daten im Popup sind könnte ich den String ja per Php zerlegen und dort per Checkboxen anwählen. Nun kommt nun mein weiteres Problem. Wenn ich z.b. in dem Popup die Rechte ändere.. wie bekomme ich die dann in das Dropdown geupdatet ???

So ich hoffe ich habe mich verständlich ausgedrückt und es hat jemand eine Lösung oder eine Alternative Idee :)

Vielen Dank!!
 
Hm, so wie du das willst, ist da schon "recht umfangreich" zu lösen.

Wärs nicht einfacher (ich weiss ja nicht wie viel Wert du auf die Optik und den Style ;) bei dem Projekt legst) für jede Zeile ein Formular zu machen mit den einzelnen Array-Feldern?

So in etwa:
PHP:
<form method="post" action="edit.php">
<input type="text" value="/Daten/Tools" name="alias" />
<input type="text" value="c:\Daten\Tools" name="pfad" />
...

Und das für jede Zeile.
Dann am Ende der Zeile ein Submit-Button, evtl. noch ein verstecktes Feld für eine eindeutige ID, falls deine DB-Struktur das hat.

Wäre schneller erledigt, aber evtl. nicht so schön, wie deine Idee :)
 
Hm ja wäre vielleicht möglich. Das Problem ist ja leider das DER String in einem Datenbankfeld landen muss und wenn das verschiedene Formulare sind.. gibt das glaube kuddelmuddel. Und es wäre ja auch noch so das die ganzen anderen Felder ja Editierbar sind. Wie Username usw usw. Die Daten würden dann ja verloren gehen :(:(

Alles nicht so einfach
 
Pack die doch in ein array und lese diese später wieder aus.


PHP:
$folders = explode("\n",$outer_row["ConfigValue"]); 
$daten ='<form action"irgend eine Datei" method="POST/GET" name="name"><select>'; 
foreach($folders as $folder){    $daten .= '<option value="ordner">'.$folder.'</option>';    } 
$daten .='</select><input type="submit" name="irgend einer" value="Abschicken"></form>';

PHP:
<?php    
//Array 
       $array_folders = $_POST/_GET["ordner"];
//array auslesen                  
foreach($array_folders as $row) {
//Ausgabe des arrays
echo $row;
//Oder verarbeite die Daten so weiter wie du sie brauchst.
}
?>



*EDIT*
Ohh.. da hab ich was überlesen, dachte es ging nur um die Ordner *fg

*EDIT2*

Kannst die Daten doch alle in ein "array" packen...

Du liest alle Daten aus, und schiebst die in das erste array was erstellt wurde mit array_push() und später dann halt beim auslesen explode() nutzen.

*EDIT3*
Man sollte schon alles richtig lesen :(
Du willst alle Daten als einen string haben? Dann nutze implode() und später dann explode()
 
Zuletzt bearbeitet: (input hinzugefügt -.-)
quicksilver, achso, die 4 Beispielzeilen in deinen Posting sind 1 Feld.
Ich dachte pro Zeile 1 Feld.

Hmmm...
 
Hehe ja ist nicht so einfach wie mir scheint ;)

Also ich probier nochmal nach zu erklären :)

Dies ist ein langer String mit zeilenumbruch getrennt. Und ich muss den genau so wieder zusammenbauen aber möchte ihn zeilenweise Editieren können.

Code:
/Daten/Tools,c:\Daten\Tools,R---,FD--I---
/Daten/Test,c:\Daten\Test,R---,FD--I---
/Daten/Tools,c:\Daten\Tools,R---,FD--I---
/Daten/A-Z,c:\Daten\A-Z,R---,FD--I---

Möchte quasi einzeln editieren können z.b. die Zeile ... und da muss ich diesen String noch zerlegt editieren können.
/Daten/Tools,c:\Daten\Tools,R---,FD--I---

Also einzeln :
/Daten/Tools,
c:\Daten\Tools,
R---,
FD--I---

Der String ist durch komma getrennt.. das wäre ja alles nicht das Problem das per PHP zu zerlegen mit explode usw. Nur mein Problem ist das aus der Seite Heraus zu bekommen und wieder rein. Weil wenn ich das einzeln mit Post mache... könnte ich die anderen 3 Zeilen nicht verwerfen .. die müssten mit erhalten bleiben irgendwie :( grrr
 
So schwer isses doch nicht. ;)
Du sendest einfach neben den editierten Daten noch mit, um welchen Datensatz es sich handelt (also den Primärschlüssel des Datensatzes in der Datenbank) und welche Zeile du in dem Datensatz gerade editiert hast.
Im Zielscript lädst du den Datensatz dann einfach nochmal und ersetzt die entsprechende Zeile durch die neuen Daten. Anschließend mittels UPDATE den bearbeiteten Datensatz in der DB abspeichern und fertig.
 
Tja anscheinend schon :) weil es wie schon erwähnt Alles ein String ist!!

und ich möchte nur TEILE davon editieren... quasi zerlegen ... editieren .. und wieder zurück in das select schreiben!
 
/Daten/Tools,c:\Daten\Tools,R---,FD--I---
/Daten/Test,c:\Daten\Test,R---,FD--I---
/Daten/Tools,c:\Daten\Tools,R---,FD--I---
/Daten/A-Z,c:\Daten\A-Z,R---,FD--I---

Also jeder Datensatz ist mit einem \n unterteilt und innerhalb eines Datensatzes ist ein , als separator zwischen den Spalten, richtig ?

Müsste dann folgendermaßen gehen (Blind getippt ohne zu prüfen ;)
PHP:
<?php
$separator_r = "\n";
$separator_c = ",";

$rows = explode($separator_r,$outer_row["ConfigValue"]); 
$r=0;
foreach ($rows as $row) {
	$c=0;
	$columns = explode($separator_c, $row);
	foreach ($columns as $column) {
		?>
		<input type="text" name="<? echo "row_".$r."_column_".$c; ?>" value="<?php echo $column; ?>" />
		<?
		$c++
	}
	echo "<br />";
	$r++;
}
?>
<input type="hidden" name="rows" value="<?php echo $r; ?>" />
<input type="hidden" name="columns" value="<?php echo $c; ?>" />
<?

// skript fürs form action
$data = "";
for ($r=0; $r<$_POST['rows']; $r++) {
	for ($c=0; $c<$_POST['columns']; $c++) {
		$data.= $_POST['row_'.$r.'_column_'.$c].$separator_c;
	}
	$data = substr($data,0,-1).$separator_r;
}
?>

Musst halt noch ein HTML Formular drum packen und den unteren Teil in das form action Skript packen.

Natürlich könnte man dann für die 3. und 4. Spalte nochmal für jedes Flag ne Selectbox machen ...
 
Ja das Problem ist ja nicht das splitten usw.. es geht eher um das Problem das halbwegs komfortabel editierbar zu machen. und nachher wieder zusammenzusetzen usw :(
 
Ist zwar nen bisschen primitiv, aber geht :


PHP:
//Was vergessen

lg

*edit*

Ohh mom, da fehlt was..

*edit2*
So, sry hatte vergessen das ganze wieder zu einem ganzen String ( Original ) zu machen ->

Besuche ->
http://www.antischimmelpilz.de/computerbase.php

Hier der neue Quellcode:

PHP:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Test</title>
</head>
<?PHP
$string = '/Daten/Tools,c:\Daten\Tools,R---,FD--I---
/Daten/Test,c:\Daten\Test,R---,FD--I---
/Daten/Tools,c:\Daten\Tools,R---,FD--I---
/Daten/A-Z,c:\Daten\A-Z,R---,FD--I---';

echo '<div width="400px">Bitte Ordner auswählen.<br />';

$folders = explode("\n",$string); 
$daten ='<form action"computerbase.php.php" method="POST" name="name"><select name="auswahl">'; 
foreach($folders as $folder){    $daten .= '<option>'.$folder.'</option>';    } 
$daten .='</select><input type="hidden" name="original" value="'.$string.'"><input type="submit" name="uebergabe" value="Abschicken"></form>';


echo $daten;
echo '<br /></div>';


//Auswertung ->
if(isset($_POST["uebergabe"])) {
//was ausgewält wurde ->
$string = $_POST["auswahl"];
//Orignal String ->
$original =$_POST["original"];
echo 'Folgender Ordner wurde gewählt: '.$string.', Sie haben nun die Möglichkeit diesen zu ändern.';
//Zerlege den String ->
$explode = explode(',', $string);
//Formular zum ändern ->

echo '<form action="computerbase.php" name="name2" method="POST">';
//Tabelle
echo '<table width="400px" cellpadding="2" cellspacing="2" border="1">';
echo '<tr valign="top"><td width="40%"><b>Teil 1</b></td><td width="60%"><input type="text" name="1" value="'.$explode[0].'"></td></tr>';
echo '<tr valign="top"><td width="40%"><b>Teil 2</b></td><td width="60%"><input type="text" name="2" value="'.$explode[1].'"></td></tr>';
echo '<tr valign="top"><td width="40%"><b>Teil 3</b></td><td width="60%"><input type="text" name="3" value="'.$explode[2].'"></td></tr>';
echo '<tr valign="top"><td width="40%"><b>Teil 4</b></td><td width="60%"><input type="text" name="4" value="'.$explode[3].'"></td></tr>';
echo '<tr><td></td><td><input type="hidden" name="alt_string" value="'.$string.'"><input type="hidden" name="original" value="'.$original.'"><input type="submit" name="send" value="Bearbeiten"></td></tr>';
echo '</table></form>';


}
if (isset($_POST["send"])) {
//neue Werte ->
$teil_1 = $_POST["1"];
$teil_2 = $_POST["2"];
$teil_3 = $_POST["3"];
$teil_4 = $_POST["4"];
//Original string ->
$original = $_POST["original"];
//alt_string ->
$alt_string =$_POST["alt_string"];

//erzeuge ein array fürs zusammensetzen
$array = array("$teil_1", "$teil_2", "$teil_3", "$teil_4");
//setze zusammen
$implode = implode(",", $array);


echo 'Ersetze alte Variable( '.$alt_string.' ) gegen die neue Variable ( '.$implode.' ) <br /><br />Füge diese wieder zu einem ganzen zusammen ->';
//ersetze ->

$ausgabe = str_replace($alt_string, $implode, $original);

//Test Ausgabe ->
echo '<br /><br />Original -> <br /><br /><b>'.nl2br($original).'</b> <br /><br />';
echo 'Jetzt der neue zusammen gesetzt Teil -><br /><br />';
echo '<b>'.nl2br($ausgabe).'</b>';

echo '<br /><br />String wurde zerlegt, bearbeitet und nu wieder zusammen gesetzt!';
}

?>
</body></html>

Jetzt klappt es auch mit den Nachbarn :)
 

Anhänge

  • Demo.png
    Demo.png
    24,3 KB · Aufrufe: 150
Zuletzt bearbeitet: (FIX...)
@volcano
So wird das aber nix, man sollte sich schon merken, an welcher Stelle die editierte Zeile wieder in den string eingefügt werden muss...

So sollte es ungefähr funktionieren...
PHP:
<?php

//als erstes die datenbankabfrage
$dbquery=mysql_query("SELECT...");
$datensatz=mysql_fetch_assoc($dbquery);

//anschließend wird der string zerlegt
$ordner=explode("\n",$datensatz["ordnerstruktur"]);

//jetzt kommt, falls eine Zeile editiert wurde, das einfügen der Zeile und das Abspeichern in der DB
if(isset($_POST["send"]) {
  $neuezeile=implode(",",$_POST["teile"]);
  $ordner[$_POST["zeile"]]=$neuezeile;
  $ordnerstruktur=implode("\n",$ordner);
  mysql_query("UPDATE ... SET ordnerstruktur=".$ordnerstruktur." ...");
}

//und zum schluss folgt die ausgabe, entweder der ordner mit link zum editieren oder das formular zum editieren der zeile
if($_REQUEST["mode"]!="edit") {
  foreach($ordner as $zeilennummer=>$zeileninhalt) {
    echo ("<a href=\"script.php?mode=edit&zeile=".$zeilennummer."&datensatzid=".$datensatz["id"]."\">".$zeileninhalt."</a>");
  }
} else { 
  $zeile=explode(",",$ordner[$_REQUEST["zeile"]]);
  ?>
  <form action="script.php" method="post">
    <input type="hidden" name="zeile" value="<?php echo($_REQUEST["zeile"]); ?>">
    <input type="hidden" name="datensatzid" value="<?php echo($_REQUEST["datensatzid"]); ?>">
    <input type="text" name="teile[0]" value="<?php echo($zeile[0]); ?>">
    <input type="text" name="teile[1]" value="<?php echo($zeile[1]); ?>">
    <input type="text" name="teile[2]" value="<?php echo($zeile[2]); ?>">
    <input type="text" name="teile[3]" value="<?php echo($zeile[3]); ?>">
    <input type="submit" name="send" value="speichern">
  </form>
<?php } ?>
 
Zuletzt bearbeitet:
Hallo Jungs :)


Vielen Dank für die Hilfe :) Schon nicht schlecht. Danke für die Arbeit!

Das Problem ist ja ich wollte das eigentlich so machen das die Seite nicht neu geladen wird weil sonst ja die anderen Daten auf der Seite (Username, usw usw) Verloren gehen. Hatte schon angefangen mit Js. Klappt auch schon ganz gut. Wollt ihr mal sehen?

http://blog.dominike.de/computerbase.html

Nun Müsste ich das Per JS nurnoch in die 4 Teile Zerlegen, da vielleicht irgendwie durch checkboxen editierbar machen und nachher im On klick wieder zusammensetzen? Meint ihr das wäre umsetzbar und ganz sinnvoll? oder halt doch alles per Php und posts usw ?!?

Edit: bin ein Step weiter :D wird langsam :) schaut mal *FREU* *FREU* *FREU*
 
Zuletzt bearbeitet:
Zurück
Oben