Aller eerst allemaal de beste wensen voor 2019.

Mijn INI-file ziet er als volgt uit (Dit is een fragment er uit)

[algemeen]
programmanaam = testnaam
versienummer = 0.1.1


Deze wil ik wijzigen in:

[algemeen]
programmanaam = testnaam
versienummer = 0.1.2


Het versienummer is dan dus gewijzigd.

Het aanmaken van het bestand is geen probleem, dus dacht ik het op de zelfde manier te doen.
Hiervoor heb ik een functie:

//functie om ini-bestand te maken
function write_ini($filename, $b) {
	$output = '';
	foreach ($b as $section => $settings) {
		$output .= '[' . $section . ']' . PHP_EOL;
		foreach ($settings as $key => $value) {
			$output .= $key . ' = ' . $value . PHP_EOL;
		}
		$output .= PHP_EOL;
	}
	file_put_contents($filename, $output);
	return true;
}


Met de volgende code dacht ik het muteren te kunnen doen, maar dat lijkt hij niet te doen.
Ik hoopte hiermee de volledige array die ik eerst heb uitgelezen, gemuteerd weer terug te plaatsen.


$b = array(
'algemeen'=>array(
	'programmanaam'=>$programmanaam,
	'versienummer'=>$versienummer),
....);
			
write_ini($filename, $b);

Iemand een tip?

Alvast bedankt voor de assistentie.

Vriendelijke groet,
Frits van Leeuwen
Wat gebeurt er dan wel precies?
Klopt het pad naar het bestand?
Is het bestand/de directory schrijfbaar en is het bestand niet gelocked?
En wat @Ariën zegt, wat gebeurt er dan wel?

Dan over de functie zelf, wellicht kun je hier output buffering gebruiken? En ook, die return waarde zegt je niets - file_put_contents() retourneert false als het misgaat, dus wellicht kun je daar iets mee doen om na te gaan om te zien of alles goed gaat, dus zoiets?

<?php
function write_ini($filename, $b) {
    ob_start();
    foreach ($b as $section => $settings) {
        echo '[' . $section . ']' . PHP_EOL;
        foreach ($settings as $key => $value) {
            echo $key . ' = ' . $value . PHP_EOL;
        }
        echo PHP_EOL;
    }
    return false !== file_put_contents($filename, ob_get_clean());
}
?>
Even een zij-spoortje: is er een dringende reden waarom je je config in een .ini bestand opslaat? Moet de gebruiker het zelf handmatig kunnen wijzigen bijvoorbeeld?

On-topic: werkt dit niet?

$ini = parse_ini_file($filename);
$ini['algemeen']['versie'] = '0.1.2';
write_ini($filename,$ini);
Allemaal erg bedankt voor de reactie en de aanwijzingen van mogelijke aanpassingen.

Ariën, er gebeurt niets. Ik krijg geen foutmelding en het bestand wordt niet aangepast.

Thomas van den Heuvel, Ik maak het bestand aan en even later probeer ik het op de zelfde manier te wijzigen. Ik ben dus dan de zelfde gebruiker en heb dus de zelfde rechten. De plek van het bestand is het zelfde, dus ook dat kan het niet zijn.
Er is niemand die het bestand gebruikt, dus niemand kan het locken. Wat misschien zou kunnen, is dat ik het zelf gelockt heb. Maar dan moet ik toch een melding krijgen denk ik.
Ik heb je code gebruikt maar het resultaat blijft onveranderd.

Rob Doemaarwat, Ik heb de code gebruikt maar helaas zonder resultaat. Bij wat jij aan gaf moest ik wel versie veranderen in versienummer, maar zelfs toen werkte het niet.

Ik ben wel verder gegaan met testen en merk dat ik het bestand niet op die plek zo kan veranderen door het te openen met een editor en dan op te slaan. Echter, ook dan krijg ik geen melding dat het opslaan niet lukt.

Hm, hoe heb je het bestand aangemaakt? En waar gebeurt dit precies? Op je webserver (welk besturingssysteem?)? Misschien helpt het als je het bestand ook via PHP creëert met touch().
Ik vergat nog aan Rob Doemaarwat te melden dat ik inderdaad gebruikers de mogelijkheid geef om iets aan te passen. Maar dat is in principe alleen bij de installatie. Daarna gebeurt dat door de php code.


Met de volgende code maak ik het bestand aan. Ik schrijf dit naast de php bestanden op mijn nas. Daar het ik een soort intranet server van gemaakt. Volgens mij draait er op mijn nas Linux QNAP 3.4.6, PHP Version 5.6.36



$b = array(
	'algemeen'=>array(
		'programmanaam'=>'Testnaam',
		'versienummer'=>'0.1.1'));
write_ini($filename, $b);


touch() ken ik niet. Daar zal ik naar moeten kijken.

Je kunt je config ook gewoon als PHP opslaan. Dan hoef je die .ini niet bij elke call te parsen.

Als het echter een rechten probleem is heb je dan nog steeds hetzelfde probleem.
Heb je anders je error logs al geraadpleegd en/of het melden + weergeven van fouten aangezet?

Zet anders de volgende code eens boven/voor al je anders code:
<?php
error_reporting(E_ALL);
ini_set('display_startup_errors', true);
ini_set('display_errors', 'stdout');

// de rest van je code
// ...
?>

Het klinkt namelijk alsof we iets voor de hand liggends vergeten.

De plek van het bestand is het zelfde, dus ook dat kan het niet zijn.
Zaken aannemen zolang we geen oorzaak hebben is dan ook niet verstandig. Je vindt dingen altijd op de laatste plek waar je kijkt :).
Ik ga nu naar bed, maar ik kom hier op terug.
Ik heb wat foutjes hiermee opgelost, maar dat had geen invloed op waar we hier mee bezig zijn.
Het gekke is, dat als ik het ini bestand verwijder en een nieuwe er voor in de plaats zet. (Volledig buiten php om) Dan staat toch data in het bestand dat in het verwijderde bestand stond. Dus hier moet ik nog eens wat dieper onderzoek naar doen. Maar dus niet deze nacht meer. Bedankt voor zo ver en wordt vervolgd.
Frits van Leeuwen op 06/01/2019 00:58:23

Het gekke is, dat als ik het ini bestand verwijder en een nieuwe er voor in de plaats zet. (Volledig buiten php om) Dan staat toch data in het bestand dat in het verwijderde bestand stond.

Waar/hoe wordt de variabele $versienummer ingesteld op de nieuwe versie?

Reageren