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

Discussion dans 'Développement d'un site Web ou d'une appli mobile' créé par ortolojf, 21 Janvier 2010.

  1. ortolojf
    ortolojf WRInaute accro
    Inscrit:
    14 Août 2002
    Messages:
    3 682
    J'aime reçus:
    39
    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
     
  2. rudddy
    rudddy WRInaute passionné
    Inscrit:
    1 Août 2007
    Messages:
    2 125
    J'aime reçus:
    0
    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 !!!
     
  3. ortolojf
    ortolojf WRInaute accro
    Inscrit:
    14 Août 2002
    Messages:
    3 682
    J'aime reçus:
    39

    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
     
  4. Julia41
    Julia41 WRInaute passionné
    Inscrit:
    31 Août 2007
    Messages:
    1 774
    J'aime reçus:
    0
    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 :
    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.
     
  5. ortolojf
    ortolojf WRInaute accro
    Inscrit:
    14 Août 2002
    Messages:
    3 682
    J'aime reçus:
    39
    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
     
  6. Julia41
    Julia41 WRInaute passionné
    Inscrit:
    31 Août 2007
    Messages:
    1 774
    J'aime reçus:
    0
    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 ;)
     
  7. ortolojf
    ortolojf WRInaute accro
    Inscrit:
    14 Août 2002
    Messages:
    3 682
    J'aime reçus:
    39
    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
     
  8. ortolojf
    ortolojf WRInaute accro
    Inscrit:
    14 Août 2002
    Messages:
    3 682
    J'aime reçus:
    39
    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
     
  9. Julia41
    Julia41 WRInaute passionné
    Inscrit:
    31 Août 2007
    Messages:
    1 774
    J'aime reçus:
    0
    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
     
  10. ortolojf
    ortolojf WRInaute accro
    Inscrit:
    14 Août 2002
    Messages:
    3 682
    J'aime reçus:
    39
    Bonjour Julia41

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

    Merci beaucoup de tes réponses.

    Bien à vous.

    Amicalement.

    Jean-François Ortolo
     
  11. Julia41
    Julia41 WRInaute passionné
    Inscrit:
    31 Août 2007
    Messages:
    1 774
    J'aime reçus:
    0
    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 ;)
     
  12. ortolojf
    ortolojf WRInaute accro
    Inscrit:
    14 Août 2002
    Messages:
    3 682
    J'aime reçus:
    39
    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
     
  13. rudddy
    rudddy WRInaute passionné
    Inscrit:
    1 Août 2007
    Messages:
    2 125
    J'aime reçus:
    0
    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
     
Chargement...
Similar Threads - vue migration fonctions Forum Date
En vue d'une migration sous PHP 6 Développement d'un site Web ou d'une appli mobile 17 Février 2010
Hacking sur la page vue par Google Bot (non WP) Problèmes de référencement spécifiques à vos sites 1 Août 2021
WordPress Analytics, Vues et Wordpress Google Analytics 21 Avril 2021
80k page vues /jour mais seulement 1,5k sur adsense AdSense 21 Avril 2021
webmaster tools vue d'ensemble Référencement Google 25 Février 2021
GA : données Audience-vue d'ensemble et comportement-vue d'ensemble Google Analytics 15 Décembre 2020
Création d'une vue dans Google Analytics GA4 Google Analytics 10 Novembre 2020
GA/GTM avoir des statistiques de vue par pages Google Analytics 3 Novembre 2020
Chute libre des abonnés Youtube et des vues YouTube, Google Images et Google Maps 11 Juillet 2020
Pages vues en double Google Analytics 29 Juin 2020
Création d'une vue Google Analytics sans sous-répertoires Google Analytics 5 Mars 2020
Flipbooks et Pages vues dans Google Analytics qui s'effondrent Google Analytics 27 Novembre 2019
Conflit entre mon filtre de vue Analytics et mon objectif Google Analytics 25 Octobre 2019
Page vue affichée en temps réel mais ne remonte pas dans les rapports normaux Analytics Google Analytics 3 Mai 2019
Nombre de pages vues moyen après une visite sur page spécifique Google Analytics 16 Avril 2019
Variations de pages vues extrêmement régulières... Problèmes de référencement spécifiques à vos sites 12 Mars 2019
Passer mon site en https, galère en vue Développement d'un site Web ou d'une appli mobile 26 Janvier 2019
Taux de vue moyen annonces Discovery Youtube AdWords 5 Novembre 2018
Nommer un restaurant en vue d'un bon positionnement Référencement Google 2 Novembre 2018
personnaliser une vue google analytics, comment faire ? Google Analytics 5 Octobre 2018