8791 sujets

Développement web côté serveur, CMS

Modérateur
Bonjour,
Je souhaiterais donc ajouter une ligne dans un fichier en utilisant php. Voilà ce que je me propose de faire. Je lis le fichier (dans lequel je souhaite insérer une nouvelle ligne) ligne par ligne en utilisant la fonction "file()". Ensuite je recherche l'endroit où je souhaite placer ma nouvelle ligne (avant la ligne qui comporte la balise <title>, je modifie la ligne "repère" en lui ajoutant la nouvelle ligne. Ensuite je relis le tableau et l'envoie vers le fichier (après l'avoir ouvert en écriture et mis à 0) header.php. Concrètement ça donne ça pour le code :

/* Reading the header file line by line to have an array that will be modify... */
		$header_lines = file(PUN_ROOT.'header.php');
		$lines_number = count($header_lines);
		//Reading each line to find the line containing the <title> tag
		for ($i = 0; $i < $lines_number; $i++) {
			if (strpos($header_lines[$i], '<title>')) {
				//Adding a line to include the Metadata core file
				$header_lines[$i] = '<?php include \'plugins/dcm/core/dcm.php\'; ?>'.$header_lines[$i];
			}
		}
		/*Opening the header file and replacing all the content by the new content (with the added line)*/
		//Deleting content of the file
		$fp = fopen(PUN_ROOT.'header.php', 'w');
		fwrite ($fp, '');
		fclose ($fp);
		//Writing back each line of the file
		$fp = fopen(PUN_ROOT.'header.php', 'a');
		for ($i = 0; $i < $lines_number; $i++) {
			fwrite($fp, $header_lines[$i]);
		}
		fclose ($fp);
		/*Replacing the data in the log file dcm.txt*/
		$dcm_data = file_get_contents(PUN_ROOT.'plugins/dcm/core/dcm.txt');
		$data = explode(';', rtrim($dcm_data));
		$install_data = ($data[0] != 0) ? $data[0] : time();
		$update_data = time();
		$data_plugin_status = 1;
		$all_data = $install_data.';'.$update_data.';'.$data_plugin_status;
		$fp = fopen(PUN_ROOT.'plugins/dcm/core/dcm.txt', 'w');
		fwrite($fp, $all_data);
		fclose($fp);


Le fichier que je modifie s'appelle "header.php". J'ai utilisé une boucle for car, d'après ce que j'ai lu, en utilisant "foreach" on travaille sur une copie du tableau et non sur le tableau lui-même.
Or, en appliquant se script, rien ne se passe, même pas de message d'erreur. Par contre d'après mon éditeur de texte dans lequel j'éditais header.php, ce fichier a bien été modifié...
Je ne suis pas sûr d'employer la bonne méthode, alors si vous avez une autre solution, n'hésitez pas à me la communiquer Smiley cligne

Merci d'avance pour votre aimable aide Smiley smile
Modifié par jojaba (08 May 2010 - 21:57)
jojaba a écrit :
J'ai utilisé une boucle for car, d'après ce que j'ai lu, en utilisant "foreach" on travaille sur une copie du tableau et non sur le tableau lui-même.
J'imagine que tu n'as jamais entendu parler des pointeurs ? Il suffit d'ajouter un '&' devant le nom de variable suivant le 'as' pour modifier le tableau et non une copie :
$arr = array(1, 2, 3);
foreach ($test as &$value)
	$value++;
print_r($arr);	// affiche Array ( [0] => 2 [1] => 3 [2] => 4 )
Modérateur
phpdoesnotcare a écrit :
J'imagine que tu n'as jamais entendu parler des pointeurs ? Il suffit d'ajouter un '&' devant le nom de variable suivant le 'as' pour modifier le tableau et non une copie :
$arr = array(1, 2, 3);
foreach ($test as &$value)
	$value++;
print_r($arr);	// affiche Array ( [0] => 2 [1] => 3 [2] => 4 )

Ah ben merci pour l'info. Je vais tester ça dès que possible Smiley cligne
En attendant, j'ai réussi à trouver ce qui n'allait pas. C'était mon test avec strpos(). Dans le manuel php ils indiquent ce qu'il faut faire.
Donc :
if (strpos($header_lines[$i], '<title>'))

doit être remplacé par :
(strpos($header_lines[$i], '<title>') !== false)


Smiley cligne
Modérateur
phpdoesnotcare a écrit :
Il suffit d'ajouter un '&' devant le nom de variable suivant le 'as' pour modifier le tableau et non une copie

Oui mais... uniquement à partir de php5. Je voulais que ce soit compatible pour la version 4.3 minimum...
Smiley cligne