En vue d'une migration des fonctions mysql_*() vers l'interface PDO objet

WRInaute accro
Bonsoir

Actuellement, j'ai mis au point un script awk et un script en Bourne Shell, capables de migrer pratiquement automatiquement, les fonctions type ereg ( ereg(), ereg_replace(), split() , mais pas spliti() ni cette toute dernière fonction dont le nom m'échappe... ;( ) vers les fonctions correspondantes de type PCRE ( preg_match(), et preg_split() ). Cà a l'air de fonctionner suffisamment pour mes besoins.

Je fais cela, pour rendre mon site ( local et remote sur mon ordinateur ), et aussi mon site partenaire ( sa copie sur mon ordinateur ), compatibles PHP 6. Actuellement, il sont seulement compatibles PHP 5.

Je vais bientôt passer à l'étape suivante : Migration des fonctions mysql_*() , vers l'interface objet PDO d'accès à MySQL.

J'utiliserai pour celà la même approche que pour la migration précédente : Un script en Bourne Shell récursif pour se positionner sur les sous-répertoires, et un script awk pour lire les lignes suivant certains patterns des fonctions à migrer, et remplaçant ces fonctions par leur équivalent en mode objet PDO, pour l'accès à la base de données MySQL.

Pour celà, j'ai besoin d'une information sur php, php 6 en particulier.

Tout d'abord, je n'utilise pas la classe PDO, mais une classe MyPDO surchargeant la fonction rowCount(), de manière à donner la possibilité de compter le nombre de lignes d'un résultat données par une fonction MyPDO::query()

Cette fonction rowCount() est la seule fonction surchargée, les autres fonctions sont donc héritées telles quelles, de la classe PDO.

Je cherche à garder la logique de modularisation du site partenaire à migrer.

Supposons une classe ( mettons de type MyPDO extends PDO ), instanciée en objet $conn donnant la référence avec laquelle on construit les requêtes ( $conn->query($sql) , $conn->exec($sql) ).

Les connexions à MySQL se font mettons avec la fonction aconnect(), et un objet ( la variable ) $conn, la fonction aconnect() est définie dans un script script_connexion.php inclus au début des scripts php, et contient l'instruction classique de connexion à MySQL façon PDO. ( $conn = new MyPDO( etc... ); , avec classique traitement d'erreur.

Cette fonction aconnect(void), instancifie donc l'objet $conn de type MyPDO, qui est global, et est utilisé dans les scripts, simplement en le déclarant global.

On a donc :

Code:
<?php
  include("script_connexion.php");

  global $conn;

  aconnect();

... Et à ce moment-là, l'objet $conn sera-t-il effectivement disponible pour des requêtes genre $conn->query($sql) ou $conn->exec($sql) ?

C'est ma première question.


Ma deuxième question, c'est de savoir si l'objet $conn, instancifié dans le corps du script php ( aconnect(); ) sera aussi disponible dans une fonction ou $conn est délaré global ?

Par exemple :

Code:
<?php
  include("script_connexion.php");

  global $conn;

  aconnect();

  function example() {

    global $conn;

Ma question : $conn sera-t-il disponible pour des requêtes
de type $conn->query($sql) ou $conn->exec($sql) ?



}

Enfin, ma dernière question, c'est de savoir si c'est aussi le cas ( $conn disponible pour des requêtes ) si la fonction example() est déclarée avant le déclenchement de aconnect(); , mais que la fonction aconnect() est déclenchée avant l'appel à la fonction example()?

Merci beaucoup de vos réponses.

Bien à vous.

Amicalement.

Jean-François Ortolo
 
WRInaute passionné
JF, je sais pas quoi te dire, mais tu m'a mis un gros coup d'angoisse, qu'il serait temps que je me mettes sérieusement à programmer POO !!!
 
WRInaute accro
rudddy a dit:
JF, je sais pas quoi te dire, mais tu m'a mis un gros coup d'angoisse, qu'il serait temps que je me mettes sérieusement à programmer POO !!!


Bonjour ruddy ;)

En fait, sous php 6, les instructions type ereg et split(), ne seront plus supportées, il n'y aura plus que les fonctions type PCRE ( preg_match(), preg_replace() et preg_split() ), supportant donc les expressions rationnelles de type PCRE ( ou Perl amélioré ), et non plus de type Posix.

Il faudra donc, si votre interpréteur php se met à la version 6, obligatoirement avoir migré toutes ces fonctions type ereg, vers les fonctions équivalentes type PCRE.

Même chose pour les fonctions mysql_*() d'accès à MySQL ( par exemple mysql_connect(), mysql_query() et tout le bazar... ), qui devront être migrées, pratiquement, vers les fonctions membres de la classe PDO ( dans mon cas MyPDO une classe dérivée surchargeant la fonction membre rowCount() ), car les fonctions type mysql_*(), ne seront plus disponibles sous php 6, à moins que l'interpréteur php 6, n'ait été compilé avec 'with-mysql=mysqlnd' , mysqlnd est le driver natif de MySQL, et qui supporte encore ( pour combien de temps ? ) les fonctions mysql_*() .

Sans migration, vos sites ne fonctionneront plus... ;( Ce serait dommage, non ? ;)

Donc, merci ce serait gentil pour les accros en POO, de me dire les réponses à mes questions de mon message précédent. ;)

Merci beaucoup de ton message.

Bien à vous.

Amicalement.

Jean-François Ortolo
 
WRInaute passionné
Pour les mysql_ il me semble qu'ils seront supportés.
En PHP 5.3 tu peux activer les E_DEPRECIATED pour voir ce qui ne sera pas supporté en PHP6, tu vois donc les ereg, split et autre qui sont en depreciated et il suffit de les virer.
Pour mysql_* ça m'étonnerait quand même sachant que "tous" les sites l'utilises.

Pour répondre à ta question :
Ma question : $conn sera-t-il disponible pour des requêtes
de type $conn->query($sql) ou $conn->exec($sql) ?
Il te faudrait mettre à la fin de ta classe :
Code:
$conn = new Ta_Class();
Ainsi lorsque tu l'inclus, c'est ouvert et tu peux donc utiliser tes global $conn.
Ta fonction aconnect(); pourrait être
Code:
function aconnect() {
$conn = new Ta_Class();
return $conn;
}

A vérifier, personnellement j'utilise mysqli dans une petite classe modifiée, et sachant que toutes mes pages appelles mysql, ce n'est pas gênant.
 
WRInaute accro
Bonjour Julia41

Et... Dois-je déclarer $conn dans la fonction, comme global, ou comme public ?

Par exemple :

Code:
// Script principal.
<?php

  include("script_connexion.php");

  global $conn;

  // Ou bien ...

  public $conn;

  function example()
  {
      global $conn;

      // ou bien ...

      public $conn;

  }

  aconnect();

  if($conn !==false)
  {
      // Traitement  MySQL,
      // faisant appel à la fonction example().

      disconnect();
  }

  exit(0);
?>

Evidemment, la fonction aconnect() contenue dans script_connexion.php , contient l'instruction :

Code:
// Script script_connexion.php

<?php

  global $conn;

  // Ou...

  public $conn;

  public MyPDO extends PDO {

    // Etc... code de surcharge de la fonction rowCount()

  }

  aconnect() {

        global $conn;

        // Ou bien ...

        public $conn;

        $base = "xxxx";
        $login = "xxxx";
        $password = "xxxx";
        $serveur = "xxxx";

        $param = 'mysql:host=' . $serveur . ';dbname=' . $base;

        try(
                $conn = new MyPDO($param, $login, $password);
                return($conn);
        }

        catch(Exception $e) {

               echo 'Erreur : ' . $e->getMessage() . "<br />\n";
               echo 'N° : ' . $e->getCode() . "<br />\n";
               return(false);

        }
  }

  disconnect() {

      unset($conn);
  }

?>

Merci beaucoup de ta réponse.

Bien à vous.

Amicalement.

Jean-François Ortolo
 
WRInaute passionné
normalement non
ça devrait faire :
Code:
<?php
public MyPDO extends PDO {
private function connect($var si tu as) {
global $conn;
ta function;
}
}
// Si tu veux déclarer le tout :
$conn = new MyPDO;
?>
Je dis peut-être de la merde car ton exemple me semble un peu bizarre.
Mais si $conn est déjà déclaré quelques part, tu utilises le global $conn uniquement dans les fonctions.
Le mieux pour tester est de ne pas le mettre, si ça ne marche pas, tu regardes les erreurs ;)
 
WRInaute accro
Bonjour Julia41

Le problème, c'est que je n'ai pas encore php 5.3 sur mon ordi ( Linux Fedora 11 64 bits ), seulement php 5.2, donc la constante E_DEPRECATED n'est pas définie. ;(

J'ai vu ton exemple, celà m'obligerait à remplacer tous les appels à la fonction aconnect(), par la séquence suivante :

$conn = new MyPDO;
$conn->aconnect();

Je croyais, que le fait d'instancier la classe PDO ( new PDO(...paramètres...); ), permettait d'avoir un objet permettant d'accéder à la base de données. A ce moment-là, les paramètres sont donnés au moment où la classe est instanciée ?

Ton exemple instancifie sans paramètre la classe PDO à travers MyPDO, et la fonction aconnect() membre de MyPDO est chargée de la connexion, donc transmission des paramètres de conexion à MyPDO, mais comment faire, pour que la classe MyPDO, donc déjà instanciée, reçoive les paramètres de connexion comme si c'était au moment de son instanciation ?

Cà me semble plus logique d'instancier la classe MyPDO à l'intérieur de la fonction aconnect(), et que cette fonction rende un objet $conn de type MyPDO, qui a déjà reçu les paramètres de connexion au moment de son instanciation par la fonctio aconnect() ?

Comme la classe MyPDO est publique, les objets instances de cette classe, peuvent donc être déclarés global ?

Merci beaucoup de ta réponse.

Bien à vous.

Amicalement.

Jean-François Ortolo
 
WRInaute accro
Bonjour

Sinon, on peut toujours mettre comme constructeur de la classe MyPDO, le code de connexion correct, instancifiant la classe père PDO avec les paramètres, et dans le destructeur de MyPDO, l'instruction unset($conn);

A ce moment-là, la fonction aconnect() se contenterait d'instancifier la classe MyPDO en faisant : $conn = new MyPDO; , et l'objet $conn serait global, donc utilisable partour où il serait déclaré comme global ?

Merci beaucoup de ta réponse.

Bien à vous.

Amicalement.

Jean-François Ortolo
 
WRInaute passionné
Cà me semble plus logique d'instancier la classe MyPDO à l'intérieur de la fonction aconnect(), et que cette fonction rende un objet $conn de type MyPDO, qui a déjà reçu les paramètres de connexion au moment de son instanciation par la fonctio aconnect() ?
C'est ce que je disais dans mon premier post.
Une fonction "hors de ta classe PDO" qui retourne l'object "$conn".

Personnellement je m'en sers comme ça (pour mes classes).
fichier "index.php" par exemple
Code:
<?php
require_once('inc/config.php');
mon code de la page d'accueil
?>

Pour le fichier de config.php
Code:
<?php
// Mes datas de connexion SQL et trucs du genre
// Je récupère mes classes
require_once('ma_classe_pdo.php');
require_once('mes_autres_class.php');
$PDO = new MyPDO();
Après dans mes autres pages, genre le index.php
Je peux utiliser :
$PDO->query..
$PDO->insert
 
WRInaute accro
Bonjour Julia41

Bon, ben j'ai la réponse à mes questions. ;)

Merci beaucoup de tes réponses.

Bien à vous.

Amicalement.

Jean-François Ortolo
 
WRInaute passionné
Je ne suis pas du tout un pro en PDO et en class, donc peut-être que tu auras un apport de quelqu'un s'y connaissant mieux.
Si jamais tu veux partager ton script shell, ça peut être intéressant pour d'autres en tout cas ;)
 
WRInaute accro
Bonjour Julia41

Voici les codes des scripts filtre.awk , migration.sh , et copie.sh

Ces trois scripts doivent être positionnés au répertoire racine du site à migrer.

Ils sont destinés à être lancés en tant que root. Il faut spécifier la variable ${perm} adéquate au début des scripts migration.sh et copie.sh

- filtre.awk est le script awk destiné à traduire les fonctions type regexp ( ereg (), etc... ) en fonctions de type PCRE ( preg_match() , etc... ).

- migration.sh et copie.sh , sont respectivement le script en Bourne Shell, lançant filtre.awk après s'être positionné sur tous les sous répertoires du répertoire où sont ces trois scripts, et le script en Bourne Shell remettant les scripts originaux ( *.php ) à partir des versions traduites ( super_new_*.php.txt ) correspondants.

Avant de lancer copie.sh, qui efface les originaux, il faut évidemment faire quelques vérifications de correction de la traduction.

En particulier, le caractère délimiteur des expressions rationnelles PCRE, est "/" dans mon cas. Il faut que vous choisissiez un caractère délimiteur tel, qu'il n'apparaisse dans aucune des expressions rationnelles Posix à migrer, autrement que sous le mode échappé ( précédé par un nombre impair de backslashes ), soit en général : "\/". Ou bien que ce caractère délimiteur "/" n'apparaisse pas du tout dans les expressions rationnelles Posix, premier paramètre des fonctions à migrer.

Une fois le caractère délimiteur choisi, il faut modifier la fonction changer() au début et vers la fin, pour mettre le caractère délimiteur choisi, au lieu de "/".

Si vous avez des doutes sur awk, faire : 'man awk' , ou 'info awk'.

Ces scripts supposent plus ou moins que vous être sous Linux, puisque vous devez disposer du programme awk, et d'un accès en Bourne Shell. Touts les distributions Linux ont un Bourne Shell qui est : /bin/sh , ou /bin/bash ( Bourne Again Shell ).

Les fonctions migrées sont :

- ereg()
- eregi()
- ereg_replace()
- eregi_replace()
- split()

vers les fonctions :

- preg_match()
- preg_replace()
- preg_split()

La fonction spliti() n'est pas modifiée par ces scripts, vous pouvez vous amuser à compléter le corps du script filtre.awk , pour l'ajouter.

La variable ${dir_init} doit contenir le chemin absolu du répertoire racine, dans les deux scripts en Bourne Shell.

Vous devez vérifier le chemin absolu des commandes awk, mv et autres ( si j'en oublie ).

Théoriquement, ces scripts fonctionnent pour le mode iso ( iso-8859-1 ou iso-8859-15 ), mais je ne sais pas ce que celà donne en mode utf-8. ;(

Voici donc d'abord le code de filtre.awk :

Code:
function change(param, fin)
{
	# fin="/" ou fin="/i",
	# suivant que la reconnaissance
	# d'expression rationnelle
	# est sensible ou insensible
	# à la casse.

	# Fin d'expression rationnelle
	# trouvée.
	fin_trouve=0;

	# Quote simple ou double
	# de fin d'expression
	# rationnelle partielle
	# ou globale.
	quote_trouve=0;

	p=split(param, tableau, "");

	# n = nombre de caractères backslashes
	# ( \ ) rencontrés.
	n=0;

	# Initialisation
	# du premier paramètre
	# de la fonction pcre.
	chaine="\"/\".";

	for(i=1; i<=p; i++)
	{
		t=tableau[i];

		if(t=="$")
		{
			quote_trouve=0;
			
			# On suppose que les variables
			# sont toujours accolées
			# aux autres expressions,
			# par un point, et que
			# leurs noms ne contiennent pas
			# de point.
			while((i<=p)&&(t!=".")&&(t!=","))
			{
				# Pas d'espace
				# dans un nom de variable.
				if((t!=" ")&&(t!="\t"))
					chaine=chaine t;

				i++;
				t=tableau[i];
			}

			if(i>p)
			{
				# Fin de tableau[i]
				# rencontré, sans
				# atteindre la fin
				# de l'expression rationnelle,
				# donc erreur.
				#
				# On sort de la boucle.
				break;
			}
			else if(t==".")
			{
				# L'expression rationnelle
				# continue avec une autre
				# expression accolée.
				chaine=chaine t;
			}
			else
			{
				# Fin de l'expression rationnelle
				# rencontrée.
				fin_trouve=1;

				# t n'a pas été affecté,
				# elle le sera en sortie de boucle.
				#
				#
				# On sort de la boucle.
				break;
			}
		}
		else if((t=="t")||(t=="c"))
		{
			if(t=="t")
			{
				# début de trim(
				pattern="trim";
			}
			else
			{
				# début de chr(
				pattern="chr";
			}

			w=split(pattern, tab, "");

			for(x=1; ((i<=p)&&(x<=w)); x++)
			{
				if(t==tab[x])
				{
					chaine=chaine tab[x];

					i++;
					t=tableau[i];
				}
				else
				{
					# Erreur, token non prévu.
					break;
				}
			}

			if(x<=w)
			{
				# Le token n'est pas
				# conforme.
				print "Erreur: token non prévu: " param "      " chaine > "/dev/stderr";

				#" On sort de la boucle.
				break;
			}
			else
			{
				# Recherche de la parenthèse
				# ouvrante,
				# puis suite du traitement.
				while((i<=p)&&(t!="("))
				{
					i++;
					t=tableau[i];
				}

				chaine=chaine "(";

				i++;
				t=tableau[i];
				
				if(pattern=="chr")
				{
					# Dans ce cas, on cherche
					# la parenthèse fermante,
					# suivie le cas échéant
					# d'un point ( . )
					# ou la virgule de fin
					# d'expression rationnelle.
					while((i<=p)&&(t!=")"))
					{
						chaine=chaine t;

						i++;
						t=tableau[i];
					}

					chaine=chaine ")";

					# On cherche un point
					# Ou la virgule de fin.
					i++;
					t=tableau[i];
					while((i<=p)&&(t!=".")&&(t!=","))
					{
						# On prend le point,
						# mais pas la virgule.
						if(t!=",")
							chaine=chaine t;
						i++;
						t=tableau[i];
					}

					# La fin de l'expression rationnelle
					# a été trouvée, on sort.
					if(t==",")
					{
						fin_trouve=1;

						break;
					}
					else
						# C'est le point.
						chaine=chaine t;
				}
				else
				{
					# Cas de la fonction trim().
					z=1;

					# On recherche la première parenthèse
					# fermante, matchant
					# la parenthèse ouvrante
					# déjà rencontrée.

					while((i<=p)&&(z>0))
					{
						if(t=="\\")
						{
							n++;
						}
						else
						{
							for(x=1; x<=n; x++)
								chaine=chaine "\\";

							chaine=chaine t;

							# n est pair ou nul.
							if((n%2)==0)
							{
								if(t==")")
								{
									z--;

									if(z==0)
									{
										# Parenthèse fermante matchant
										# trouvée, on sort de la boucle.
										break;
									}
								}
								else if(t=="(")
								{
									z++;

								}


							}

							n=0;
						}

						i++;
						t=tableau[i];
					}

					n=0;

					if(i>p)
					{
						# Le token n'est pas
						# conforme.
						print "Erreur: token non prévu: " param "      " chaine > "/dev/stderr";

						# On sort de la boucle.
						break;
					}
					else
					{
						# On cherche un point
						# Ou la virgule de fin.
						i++;
						t=tableau[i];
						while((i<=p)&&(t!=".")&&(t!=","))
						{
							# On prend le point,
							# mais pas la virgule.
							if(t!=",")
								chaine=chaine t;
							i++;
							t=tableau[i];
						}

						# La fin de l'expression rationnelle
						# a été trouvée, on sort.
						if(t==",")
						{
							fin_trouve=1;

							break;
						}
						else
							# C'est le point.
							chaine=chaine t;
					}
				}
			 }
		}
		else if((t=="\"")||(t=="'"))
		{
			chaine=chaine t;

			# Mémorisation du type de quote
			# ( double ou simple )
			# encadrant l'expression
			# rationnelle.
			s=t;

			i++;
			t=tableau[i];

			while((i<=p)&&(quote_trouve==0))
			{
					if(t=="\\")
					{
						n++;
					}
					else
					{
						for(x=1; x<=n; x++)
							chaine=chaine "\\";

						indic=0;
						# Echappement
						# au cas où.
						if((n>0)&&((n%2)==0)&&((t=="&")||(t=="+")||(t=="/")))
						{
							indic=1;

							# On n'échappe pas
							# le signe +
							# s'il est précédé
							# de ]
							# ( expression rationnelle ).
							if(t=="+")
							{
								if(tableau[i-1]!="]")
									chaine=chaine "\\";
								else
									indic=0;
							}
							else if(t=="&")
								chaine=chaine "\\";
							# Echappement du caractère délimiteur.
							else if(t=="/")
								chaine=chaine "\\";
						}
						# Echappement du caractère délimiteur.
						else if((n==0)&&(t=="/"))
							chaine=chaine "\\";


						chaine=chaine t;

						n=0;

						# quote sans échappement :
						# La fin de l'expression
						# rationnelle en cours
						# a été trouvée.
						if((indic==0)&&(t==s))
							quote_trouve=1;
					}

				i++;
				t=tableau[i];
			}

			# On a trouvé la quote terminale
			# de l'expression rationnelle en cours,
			# donc on cherche le point,
			# ou la virgule qui marque la fin
			# de l'expression rationnelle globale.
			quote_trouve=0;

			while((i<=p)&&(t!=".")&&(t!=","))
			{
				# On prend le point,
				# mais pas la virgule.
				if(t!=",")
					chaine=chaine t;
				i++;
				t=tableau[i];
			}

			# La fin de l'expression rationnelle
			# a été trouvée, on sort.
			if(t==",")
			{
				fin_trouve=1;

				break;
			}
			else
				# C'est le point.
				chaine=chaine t;
		}
	}

	if(fin_trouve==1)
	{
		# tableau[i]==","

		# On complète la chaîne,
		# de manière à l'adapter
		# à la norme pcre.
		chaine=chaine ".\"" fin "\",";

		# Et puis, on complète
		# le reste de la fonction.
		i++;

		while(i<=p)
		{
			t=tableau[i];

			chaine=chaine t;

			i++;
		}
	}
	else
	{
		# Fin de tableau[i]
		# rencontré, sans
		# atteindre la fin
		# de l'expression rationnelle,
		# donc erreur.
		print "Erreur: expression rationnelle sur plusieurs lignes: " param "      " chaine > "/dev/stderr";
	}

	return(chaine);
}
{
	line=$0;
	line2=$0;

	if(line ~ /=[ \t]*split[ ]*\(/)
	{
		r=split(line, tableau2, /=[ \t]*split[ ]*\(/);

		for(l=1; l<=r; l++)
		{
			u=tableau2[l];

			if(l==1)
				line=u;
			else
			{
				line=line "= preg_split(";
				v=change(u, "/");
				line=line v;
			}
		}
	}

	if(line ~ /eregi[ ]*\(/)
	{
		r=split(line, tableau2, /eregi[ ]*\(/);

		for(l=1; l<=r; l++)
		{
			u=tableau2[l];

			if(l==1)
				line=u;
			else
			{
				line=line "preg_match(";
				v=change(u, "/i");
				line=line v;
			}
		}
	}

	if(line ~ /ereg[ ]*\(/)
	{
		r=split(line, tableau2, /ereg[ ]*\(/);

		for(l=1; l<=r; l++)
		{
			u=tableau2[l];

			if(l==1)
				line=u;
			else
			{
				line=line "preg_match(";
				v=change(u, "/");
				line=line v;
			}
		}
	}

	if(line ~ /eregi_replace[ ]*\(/)
	{
		r=split(line, tableau2, /eregi_replace[ ]*\(/);

		for(l=1; l<=r; l++)
		{
			u=tableau2[l];

			if(l==1)
				line=u;
			else
			{
				line=line "preg_replace(";
				v=change(u, "/i");
				line=line v;
			}
		}
	}

	if(line ~ /ereg_replace[ ]*\(/)
	{
		r=split(line, tableau2, /ereg_replace[ ]*\(/);

		for(l=1; l<=r; l++)
		{
			u=tableau2[l];

			if(l==1)
				line=u;
			else
			{
				line=line "preg_replace(";
				v=change(u, "/");
				line=line v;
			}
		}
	}

	printf ("%s\n", line);
}


Voici le code de migration.sh :

Code:
#!/bin/sh

# Propriétaire et groupe
# des scripts *.php
perm="root:root"

# Variables de configuration, c'est le répertoire de départ.
dir_init="/var/www/html/php/Lescours"

# Et le script awk de filtre.
filtre_awk=${dir_init}"/filtre.awk"

# On calcule le répertoire absolu courant.
# Quand le paramètre n'est pas présent,
# c'est le répertoire de départ, sinon
# c'est le paramètre du script.
if [ $# -eq 0 ]; then
	dir=${dir_init}
else
	dir=$1
fi

# Positionnement dans le répertoire courant.
cd ${dir}

# On parcourt le répertoire courant en sélectionnant
# tous les scripts php.
for i in `ls *.php 2>/dev/null`; do
	if [ -f $i ]; then
		file=${dir}"/"${i}
		file2=${dir}"/super_new_"${i}".txt"

# Traitement du script *.php,
#
		echo "" > /root/tmp2.txt
		echo ${file} >> /root/tmp2.txt
		echo ${file2} >> /root/tmp2.txt

		awk -f ${filtre_awk} -- ${file} 1>${file2} 2>>/root/tmp2.txt

		chown $perm ${file2}
		chmod 777 ${file2}

		t1=`ls -l ${file} | awk '{ print $5; }'`
		t2=`ls -l ${file2} | awk '{ print $5; }'`

# On loggue les scripts modifiés.
#
		if [ ${t1} -ne ${t2} ]; then
			cat /root/tmp2.txt >> /root/tmp.txt
		fi
	fi
done

# On lit tous les sous-répertoires du répertoire courant,
# et on relance le même script, avec ces sous-répertoires
# comme paramètre, pour que ces processus fils
# se positionnent sur ces sous-répertoires.
#
for j in `ls -d * 2>/dev/null`; do
	if [ -d $j ]; then

# Calcul du sous-répertoire absolu.
		direct=${dir}"/"${j}

		${dir_init}/migration.sh ${direct}
	fi
done

# A la fin du script, on remonte vers le répertoire
# père.
cd ..

exit 0


Voici le code de copie.sh :

Code:
#!/bin/sh

# Propriétaire et groupe
# des scripts *.php
perm="root:root"

# Variables de configuration, c'est le répertoire de départ.
dir_init="/var/www/html/php/Lescours"

# Et le script awk de filtre.
filtre_awk=${dir_init}"/filtre.awk"

# On calcule le répertoire absolu courant.
# Quand le paramètre n'est pas présent,
# c'est le répertoire de départ, sinon
# c'est le paramètre du script.
if [ $# -eq 0 ]; then
	dir=${dir_init}
else
	dir=$1
fi

# Positionnement dans le répertoire courant.
cd ${dir}

# On parcourt le répertoire courant en sélectionnant
# tous les scripts php.
for i in `ls *.php 2>/dev/null`; do
	if [ -f $i ]; then
		file=${dir}"/"${i}
		file2=${dir}"/super_new_"${i}".txt"

		mv -f ${file2} ${file}

		chown $perm ${file2}
		chmod 777 ${file2}

#		fi
	fi
done

# On lit tous les sous-répertoires du répertoire courant,
# et on relance le même script, avec ces sous-répertoires
# comme paramètre, pour que ces processus fils
# se positionnent sur ces sous-répertoires.
#
for j in `ls -d * 2>/dev/null`; do
	if [ -d $j ]; then

# Calcul du sous-rÃépertoire absolu.
		direct=${dir}"/"${j}

		${dir_init}/copie.sh ${direct}
	fi
done

# A la fin du script, on remonte vers le rèpertoire
# père.
cd ..

exit 0


N'hésitez pas à me demander des infos sur les problèmes que vous rencontrez, ou des informations de type plus général.

Bien à vous.

Amicalement.

Jean-François Ortolo
 
WRInaute passionné
merci jf de ta réponse (pour les preg_ c'est déjà ok chez moi le souci vient plutot du mysql_*)

les gars vous me faites baliser là !

vous connaissez un bon tutu, car là je pIge rien à ce que vous dites !

merci
 
Discussions similaires
Haut