| 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! |
 |

19-03-2009, 09:43
|
|
Kallewaze
Registrierter Benutzer
|
|
Registriert seit: Mar 2009
Beiträge: 5
|
|
INI Datei beschreiben
Hallo Liebe Gemeinde!
Ich habe ein kleines Problem bei dem beschreiben einer INI Datei in PHP4.
Und zwar hab ich folgendes Problem:
Erstmal hier der Code inklusive Funktionen:
PHP-Code:
function parseIniFile($iIniFile)
{
$aResult =
$aMatches = array();
$a = &$aResult;
$s = '\s*([[:alnum:]_\- \*]+?)\s*'; preg_match_all('#^\s*((\['.$s.'\])|(("?)'.$s.'\\5\s*=\s*("?)(.*?)\\7))\s*(;[^\n]*?)?$#ms', @file_get_contents($iIniFile), $aMatches, PREG_SET_ORDER);
foreach ($aMatches as $aMatch)
{
if (empty($aMatch[2]))
$a [$aMatch[6]] = $aMatch[8];
else $a = &$aResult [$aMatch[3]];
}
return $aResult;
}
function array_to_ini($array){
foreach($array as $key => $value){
if(is_array($value)){
$output .= "[$key]\n";
foreach($value as $key2 => $value2){
$output .= "$key2=$value2\n";
}
} else {
$output .= "$key=$value\n";
}
}
return $output;
}
function file_put_contents($filename, $data) {
if ( is_array($data) ) {
$data = implode('', $data);
}
$handle = fopen ($filename, 'w');
// Datei zum schreiben oeffnen und Inhalt loeschen
$return = fwrite($handle, $data, strlen($data));
// Inhalt in die Datei schreiben
fclose($handle);
// Datei schliessen
return $return;
}
$ini_array = parseIniFile("lmo/ligen/1-liga-5-saison.l98",true);
$ini_array[$lmo_id]['NOT'] = $trainer_name;
$ini_array[$lmo_id]['URL'] = $icq;
$ini_array[$lmo_id]['URL2'] = $trainer_id;
$ini_array[$lmo_id]['URL3'] = $trainer_id;
$neue_ini = array_to_ini($ini_array);
file_put_contents("lmo/ligen/1-liga-5-saison.l98", $neue_ini);
Nun zu dem Problem. Wenn ich die Ini Datei im Urzustand anschaue hat sie auch einzelne Felder die nach dem = keinen Wert haben und leer sind. Diese füllen sich erst im laufe der Zeit (Saison) mit Berichten usw. Das Problem ist aber das sie bei dem erstellen des ganzen immer gleich in der INI mit drin sind.
INI im Originalzustand: (z.B hier die Felder NT1, BE1 und TI1)
[Round2]
D1=01.01.2009
D2=01.01.2010
TA1=16
TB1=13
GA1=2
GB1=3
NT1=
BE1=
TI1=
AT1=1231527600
TA2=14
TB2=11
GA2=1
GB2=3
NT2=
BE2=
TI2=
AT2=1231855200
Nun die Ini nach dem ersten Speichern durch das Script. (Die angaben werden korrekt gespeichert aber die Felder die leer sind werden durch das darunterliegende Feld gefüllt und das sieht dann so aus.
[Round2]
D1=01.01.2009
D2=01.01.2010
TA1=16
TB1=13
GA1=2
GB1=3
NT1=BE1=
TI1=AT1=1231527600
TA2=14
TB2=11
GA2=1
GB2=3
NT2=BE2=
TI2=AT2=1231855200
Nun wollt ich mal fragen ob hier vieleicht jemand von Euch ne Lösung zur Hand hat wie ich dies verhindern kann. Ich probiere schon seit gestern daran rum und verzweifle bald.
Nach mehrmaligem speichern zerstört mir das natürlich die ganze INI Datei und macht sie unbrauchbar.
Wäre von daher für abhilfe sehr dankbar.
LG
Kallewaze
__________________
Vielen Dank für Euer Bemühen!
|

19-03-2009, 10:15
|
|
ModestLife
Registrierter Benutzer
|
|
Registriert seit: Sep 2007
Beiträge: 105
|
|
Ich kann dir zwar nicht weiterhelfen, aber ich kann dir zeigen, wie ich es gelöst hätte. Die PHP5 Filesystem-Funktionen musst du halt umschreiben. Und wieso zur Hölle hast du kein PHP5 zur Verfügung? Wir sind im Jahr 2009, hallo?? ;-)
PHP-Code:
function ini_write($filePath, $data)
{
$output = '';
foreach ($data as $section => $values)
{
$output .= "[$section]\r\n";
foreach ($values as $key => $val) {
$output .= "$key=$val\r\n";
}
$output .= "\r\n";
}
file_put_contents($filePath, trim($output));
}
function ini_read($filePath)
{
$lines = array_map('trim', file($filePath));
$data = array();
$currentSection = null;
foreach ($lines as $line)
{
if (substr($line, 0, 1) == '[') {
$currentSection = substr($line, 1, -1);
$data[$currentSection] = array();
}
else {
list($key, $val) = explode('=', $line);
if (empty($key)) {
continue;
}
$data[$currentSection][$key] = $val;
}
}
return $data;
}
$data = array(
'Round1' => array(
'D1' => '01.01.2005',
'D2' => '01.01.2054',
'TA1' => 1346,
'NT1' => 'sadf',
'BE1' => null,
'AT1' => 13600,
'TA2' => 12
),
'Round2' => array(
'D1' => '01.01.2009',
'D2' => '01.01.2010',
'TA1' => 16,
'NT1' => null,
'BE1' => null,
'AT1' => 1231527600,
'TA2' => 14
)
);
ini_write('test.ini', $data);
$data = ini_read('test.ini');
var_dump($data);
Geändert von ModestLife (19-03-2009 um 10:23 Uhr)
|

19-03-2009, 10:38
|
|
Kallewaze
Registrierter Benutzer
|
|
Registriert seit: Mar 2009
Beiträge: 5
|
|
Hallo und Vielen Dank erstmal für deine Antwort!
Also ich ha gerade mal bei meinem Hoster nachgesehen und festgestellt das ich tatsächlich nur PHP 4.9 besitze dort.
Nun zu meiner Frage.
Welche Filesystem Funktion meinst du?
Muss ich so die ganze Datei von Hand füllen oder wie ist das gemeint?
PHP-Code:
$data = array(
'Round1' => array(
'D1' => '01.01.2005',
'D2' => '01.01.2054',
'TA1' => 1346,
'NT1' => 'sadf',
'BE1' => null,
'AT1' => 13600,
'TA2' => 12
),
'Round2' => array(
'D1' => '01.01.2009',
'D2' => '01.01.2010',
'TA1' => 16,
'NT1' => null,
'BE1' => null,
'AT1' => 1231527600,
'TA2' => 14
)
);
LG
__________________
Vielen Dank für Euer Bemühen!
|

19-03-2009, 10:47
|
|
ModestLife
Registrierter Benutzer
|
|
Registriert seit: Sep 2007
Beiträge: 105
|
|
Das war nur ein Anschaungsbeispiel.
Du kannst das INI File mit ini_read() auslesen, danach gewisse Einträge mit $data[$section][$key] = $val; ändern und danach das Ganze mit ini_write() wieder speichern.
Wie gesagt: Wollte dir nur eine andere Sicht auf die Systematik geben. Habe deinen Post vorhin kurz als Anlass genommen, selber sowas zu schreiben ... ;-)
Hier gibt's übrigens die kommentierte Version.
|

19-03-2009, 11:22
|
|
Kallewaze
Registrierter Benutzer
|
|
Registriert seit: Mar 2009
Beiträge: 5
|
|
ich bins nochmal.
also mein code sieht nun folgendermaßen aus:
PHP-Code:
function file_put_contents($filename, $data) {
if ( is_array($data) ) {
$data = implode('', $data);
}
$handle = fopen ($filename, 'w');
// Datei zum schreiben oeffnen und Inhalt loeschen
$return = fwrite($handle, $data, strlen($data));
// Inhalt in die Datei schreiben
fclose($handle);
// Datei schliessen
return $return;
}
function ini_write($filePath, $data)
{
$output = '';
foreach ($data as $section => $values)
{
$output .= "[$section]\r\n";
foreach ($values as $key => $val) {
$output .= "$key=$val\r\n";
}
$output .= "\r\n";
}
file_put_contents($filePath, trim($output));
}
function ini_read($filePath)
{
$lines = array_map('trim', file($filePath));
$data = array();
$currentSection = null;
foreach ($lines as $line)
{
if (substr($line, 0, 1) == '[') {
$currentSection = substr($line, 1, -1);
$data[$currentSection] = array();
}
else {
list($key, $val) = explode('=', $line);
if (empty($key)) {
continue;
}
$data[$currentSection][$key] = $val;
}
}
return $data;
}
$data = array(
$lmo_id => array(
'URL' => $icq,
'URL2' => $trainer_id,
'URL3' => $trainer_id,
'NOT' => $trainer_name
)
);
ini_write('lmo/ligen/5-liga-5-saison.l98', $data);
$data = ini_read('lmo/ligen/5-liga-5-saison.l98');
Er speichert die Daten nun in der Datei ab aber löscht den kompletten Inhalt der Datei so das nur noch das drin steht was ich jetzt mit dem script eingefügt habe.
Hast du da eine Lösung zur Hand?
LG
__________________
Vielen Dank für Euer Bemühen!
|

19-03-2009, 11:29
|
|
ModestLife
Registrierter Benutzer
|
|
Registriert seit: Sep 2007
Beiträge: 105
|
|
Erst die Daten auslesen und dann explizit nur das ändern was du auch willst.
PHP-Code:
$data = ini_read('lmo/ligen/5-liga-5-saison.l98');
$data[$lmo_id]['URL'] = $icq;
$data[$lmo_id]['URL2'] = $trainer_id;
$data[$lmo_id]['URL3'] = $trainer_id;
$data[$lmo_id]['NOT'] = $trainer_name;
ini_write('lmo/ligen/5-liga-5-saison.l98', $data);
Bemerke aber, dass $data[$lmo_id] als Array/INI Section existieren muss. Wenn du weisst, dass es den Key nicht gibt, kannst du auch sowas machen:
PHP-Code:
$data = ini_read('lmo/ligen/5-liga-5-saison.l98');
$data[$lmo_id] = array(
'URL' => $icq,
'URL2' => $trainer_id,
'URL3' => $trainer_id,
'NOT' => $trainer_name
);
ini_write('lmo/ligen/5-liga-5-saison.l98', $data);
Geändert von ModestLife (19-03-2009 um 11:32 Uhr)
|

19-03-2009, 12:34
|
|
Kallewaze
Registrierter Benutzer
|
|
Registriert seit: Mar 2009
Beiträge: 5
|
|
Das war die Lösung!
Danke nochmal und einen weiterhin schönen Tag wünsche ich Dir!
LG
__________________
Vielen Dank für Euer Bemühen!
|
|
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
|