Petit souci php lors de la migration imposée de PHP 5.5 à 7.0

Résolu/Fermé
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 - Modifié par crapoulou le 15/11/2016 à 00:10
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 - 19 janv. 2017 à 13:37
Bonjour le forum
Mon hébergeur m’oblige à passer en version php 7.0 pour un « vieux » site.
J’ai réussi à tout migrer sauf un point qui concerne de nombreux fichiers et la fonction obsolète ereg (un code que je n'ai pas écrit)
Car la manip est double (modifier ereg en preg_match, puis abandonner fonctions.inc en mettant tout le code dans la même page sur une seule ligne).
Je m’explique, j’ai aujourd’hui dans une page sur Scorcese (et d’autres) le code suivant

<?php
include("fonctions.inc"); echo trouver_extrait('Scorcese','blabla.txt'); ?>

Et le contenu de fonctions.inc
<?php
function trouver_extrait($balise,$fichier) {
  $texte = file_get_contents($fichier);
  $profil = "<!--$balise-->(.*)<!--/$balise-->";
// ici modif pour preg_match
// est-ce ???  if (preg_match($profil ,$texte, $extrait))
  if (ereg($profil ,$texte, $extrait))
  return $extrait[1];
}
?>

Je voudrais mettre le code de fonctions.inc à niveau php7.0,
Puis le mettre sur une seule ligne et l’intégrer dans le premier code en remplaçant include ("fonctions.inc") par ce nouveau code sur une seule ligne (et je n’aurai plus besoin d’utiliser le fichier fonctions.inc).
Merci de votre aide

Seb



A voir également:

12 réponses

Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 525
15 nov. 2016 à 12:11
Salut,

Concernant la fonction ereg, tu peux effectivement la remplacer par preg_match avec les mêmes paramètres à l'exception de l’expression régulière qui doit être encadré par des délimiteurs : https://www.php.net/manual/fr/regexp.reference.delimiters.php
  $profil = "#<!--$balise-->(.*)<!--/$balise-->#";
  if (preg_match($profil ,$texte, $extrait))


Par contre je ne comprend pas la contrainte d'abandonner l'inclusion du fichier fonctions.inc.
PHP7 autorise toujours l'utilisation de include et si ce code est utilisé à plusieurs endroits, il sera plus facile à maintenir si il est factorisé dans un seul fichier.

Bonne journée,
0
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 5
Modifié par Sebas22 le 16/11/2016 à 13:27
Salut Pitet,

Merci de cette réponse rapide: je vais tester et je te tiens au courant.
Compte-tenu que c'est un site figé, je préfèrerais ne plus avoir de fonctions.inc (mon hébergeur s'était fait tirer l'oreille pour accepter un .inc quand j'avais changé et je peux encore changer)

Si j'ai tout sur une ligne je peux remplacer tous les fichiers en une fois avec Notepad++

Est-ce que le code serait?


<?php $texte = file_get_contents($fichier);$profil = "#<!--$balise-->(.*)<!--/$balise-->#"; if (preg_match($profil ,$texte, $extrait)) return $extrait[1]; echo trouver_extrait('Scorcese','blabla.txt'); ?>



A+

Seb
0
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 5
17 nov. 2016 à 14:39
Bonjour le forum, bonjour Pitet,

J'ai testé le code proposé par Pitet et çà ne marche pas sous php 7.0 (mon hébergeur permet de faire le test puis en cas de souci de revenir à php 5.6 actuel).

Pour mémoire voici le code du nouveau fonctions.inc


<?php
function trouver_extrait($balise,$fichier) {
$texte = file_get_contents($fichier);
$profil = "#<!--$balise-->(.*)<!--/$balise-->#";
if (preg_match($profil ,$texte, $extrait))
return $extrait[1];
}
?>


Merci de votre aide

A+, Seb
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 525
17 nov. 2016 à 15:14
Comment considères tu que ce code ne marche pas avec php 7 ?
As tu un message d'erreur ?

De mon coté il fonctionne correctement.
0
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 5 > Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022
17 nov. 2016 à 16:19
Ah c'est que sous PHP 5.6 et l'ancien fonctions.inc la page m'affiche le texte entre les 2 balises sur Internet, alors qu'avec le nouveau fonctions.inc et sous PHP 7 il ne l'affiche pas! (et les attributs de fonctions.inc sont les mêmes, 644)
Plus clair ? (mais pas de message d'erreur!).

A+, Seb
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 525
17 nov. 2016 à 16:42
Le code est pourtant bien équivalent : https://sandbox.onlinephpfunctions.com/code/23da0dc390b7aaaf051648e28973c6f238ef5da3

Es tu sûr que l'affichage des erreurs PHP est bien activé ?
Sinon le problème pourrait venir de la récupération du fichier avec file_get_contents(), le chemin vers le fichier n'est peut être pas correct.
0
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 5
17 nov. 2016 à 18:48
Tu écris : Es tu sûr que l'affichage des erreurs PHP est bien activé ?
çà je sais pas!
Comment le vérifier et l'activer?
Où? chez l'hébergeur ?

file_get_contents ? pas obsolète en php7, mais peut-être ($fichier) manque de détail ???


Merci, Seb
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 525
18 nov. 2016 à 09:30
Pour vérifier que l'affichage des erreurs est activé, tu peux déclencher une erreur en appelant par exemple une variable inexistante :
echo $noexist;

Tu devrais alors voir un message d'erreur Notice : undefined variable...

Pour activer l'affichage des erreurs php, une petite recherche via ton moteur de recherche préféré aurait pu te donner la solution : http://www.infowebmaster.fr/tutoriel/afficher-erreur-php
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 5
18 nov. 2016 à 14:27
Bonjour le forum, bonjour Pitet
Ah tu as raison, j’avais vérifié que file_get_contents était compatible avec PHP7 car c’était du concret.
Pour le forçage d’erreur je ne savais pas comment avancer, mais j’aurais dû.
Bon, donc (pour les visiteurs de ce fil) j’ai ajouté le code suivant en haut de la page fonctions.inc et aussi en haut de la page ‘scorsese’

<?php
// Afficher les erreurs à l'écran
ini_set('display_errors', 1);
// Enregistrer les erreurs dans un fichier de log
ini_set('log_errors', 1);
// Nom du fichier qui enregistre les logs (attention aux droits à l'écriture)
ini_set('error_log', dirname(__file__) . '/log_error_php.txt');
// Afficher les erreurs et les avertissements
error_reporting(e_all);
?>

Et j’ai ajouté le code suivant avant l’appel de la page fonctions.inc dans la page ‘scorsese’

<?php
echo $noexist;
?>

Je suis passé en php7 chez l’hébergeur… et nada pas de message d’erreur, et toute la partie entre balises ne s’affiche pas ! (oui, oui, elle s’affiche bien avec 5.6 et le vieux fonctions.inc)
Bon voici quelques commentaires de béotien qui pourraient peut-être te mettre sur la piste.
En restant en php7 chez l’hébergeur si je remet le vieux fonctions.inc (avec ereg) j’ai un message d’erreur (sans surprise) :
Fatal error: Uncaught Error: Call to undefined function ereg() in /xxx/fonctions.inc:7 Stack trace: #0 /xxxxxx/scorsese.php(61): trouver_extrait('Scorsese', 'blabla.txt') #1 {main} thrown in /xxxx/fonctions.inc on line 7
Et curieusement notepad++ affiche des couleurs bizarres dans le code de fonctions.inc:
dans function trouver_extrait($balise,$fichier) function est en bleu (normal) mais $ba et $f sont en rouge
et le code suivant est tout en vert (comme si inactivé, mais il n’y a pas de //)
$texte = file_get_contents($fichier);
$profil = "#<!--$balise-->(.*)<!--/$balise-->#";
if (preg_match($profil ,$texte, $extrait))
return $extrait[1];

Voilà le casse tête !

Merci de ton aide.
A+

Seb
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 525
Modifié par Pitet le 18/11/2016 à 15:00
Si tu as une page complètement blanche, le problème peut venir d'une erreur de syntaxe php qui du coup bloque l’exécution complète du fichier.
Puisque tout le fichier n'est pas exécuté, les éventuelles modifications de directives avec ini_set() pour afficher les erreurs ne seront pas prises en compte et le serveur va utiliser les valeurs par défaut définies dans le fichier php.ini.

Pour vérifier que tu arrives bien à afficher les erreurs PHP avec la version 7 sans toucher au fichier php.ini, une solution est de déclarer les ini_set() puis d'utiliser l'instruction include pour tester le code qui pourrait contenir une erreur de syntaxe. Grâce à cette inclusion, seul le fichier inclus ne sera pas exécuté si il contient une erreur et les instructions ini_set dans le premier fichier seront bien prise en compte.

Donc pour faire un test simple, crée un nouveau fichier php contenant uniquement le code suivant :
fichier debug.php
<?php
ini_set('display_errors', true);
error_reporting(E_ALL);

include 'test.php';


Puis crée un autre fichier test.php dans le même répertoire avec le code à tester.
Tu peux par exemple reprendre le test sur une variable inexistante pour commencer :
fichier test.php
<?php
echo $noexist;


Si tu accèdes désormais la première page, tu devrais normalement voir le message d'erreur PHP. Est-ce le cas ?

Si tu arrives à voir les erreurs PHP, tu pourras alors recopier le code de ta fonction trouver_extrait ainsi qu'un appel à cette fonction pour la tester dans le fichier test.php.


Autre solution, si les erreurs ne sont pas affichées à l'écran, elle devrait normalement être au moins enregistrées dans un journal d'erreur (fichier erreur.log ou erreur_log).
0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
18 nov. 2016 à 16:42
Bonjour,


curieusement notepad++ affiche des couleurs bizarres dans le code de fonctions.inc:
dans function trouver_extrait($balise,$fichier) function est en bleu (normal) mais $ba et $f sont en rouge
et le code suivant est tout en vert (comme si inactivé, mais il n’y a pas de //)

Tu peux nous mettre une capture écran ?

De plus, au cas où, peux tu regarder si dans notepad++ le langage est bien sur php ?
Dans l'idéal, pourrais tu également nous poster le fichier "fonctions.inc " concerné intégralement ?
L'extension de ton fichier fonctions.inc ... est bien .php ?
Pour ouvrir les balises PHP tu as bien utilisé
<?php

et pas la version "raccourcie" qui pose problème :
 <?
0
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 5
Modifié par Sebas22 le 18/11/2016 à 16:35
Oups, Pitet.
Désolé, il y a erreur de compréhension:
Je n'ai pas une page blanche mais j'ai ma page internet dans laquelle s'affiche tout le header et tout le footer, et même la partie haute de la section centrale.
Ce qui ne s'affiche pas c'est le texte entre <!--$balise--> et <!--/$balise--> qui correspond à l'action de fonctions.inc pour la page concernée (qui revient à extraire du texte selon conditions)

Je préfère attendre ta réponse avant d'engager tous les tests dont tu parles après ta phrase "Si tu as une page complètement blanche".

Merci de ton aide!

Seb
0
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 5
21 nov. 2016 à 14:55
Bonjour,

Notepad++ capture d’écran : je joins un jpg (en espérant que çà marche pour moi, c'est la 1ère fois)).
Notepad++ et PHP : oui tout fonctionne normalement… j’utilise en routine
fonctions.inc : j’ai mis tout le contenu du code de ce fichier
attention ce fichier se nomme fonctions.inc, pas fonctions.inc.php ni fonctions.php
le problème vient sans doute de ce fichier en php 7.0, c’est pour cela que pour contourner et comme le code est court j’ai proposé de tout intégrer dans chaque fichier dans une seule ligne comme
<?php $texte = file_get_contents($fichier); $profil = "#<!--$balise-->(.*)<!--/$balise-->#"; if (preg_match($profil ,$texte, $extrait)) return $extrait[1]; echo trouver_extrait('Scorcese','blabla.txt'); ?>

Mais en relisant cela je m’aperçois que c’est pas bon du tout comme code, donc si vous pouvez corriger, je le mettrai dans une page et je testerai en php7.
OK ?

Merci de votre aide.



Seb
0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
21 nov. 2016 à 15:47

attention ce fichier se nomme fonctions.inc, pas fonctions.inc.php ni fonctions.php

Donc Notepad++ ne sait pas quel est le langage utilisé .....
Tu peux donc aller dans le menu "langage" et choisir PHP.
Normamelement tout devrait rentrer dans l'ordre.....
0
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 5
21 nov. 2016 à 17:17
Ah oui, je ne savais pas. Tout est clair maintenant sur Notepad++ pour fonctions.inc

Cependant mon problème initial est toujours entier.

Jordane (si Pitet est loin) que dis-tu de ma suggestion de placer le code de la fonction dans le fichier scorsese lui-même plutôt que dans un include?
Ainsi je pourrais tester sans utiliser fonctions.inc

Pourrais-tu revoir le code (çà me dépasse)?

Merci, Seb
0
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 5
23 nov. 2016 à 17:42
Bonjour Pitet, Bonjour Jordane 45
J’avance mais j’ai besoin de votre aide.

J’ai mis tous les fichiers nécessaires dans wampserver et je les ai testés en local (localhost)
J’ai aussi créé les 2 fichiers debug.php et test.php.
Le fichier test.php affiche l’erreur :
Notice: Undefined variable: noexist in D:\_ \test.php on line 2
Et la ligne 2 est:
echo $noexist;

Le fichier scorsese avec ton code avant le <!DOCTYPE html>
<?php
// Afficher les erreurs à l'écran
ini_set('display_errors', 1);
// Enregistrer les erreurs dans un fichier de log
ini_set('log_errors', 1);
// Nom du fichier qui enregistre les logs (attention aux droits à l'écriture)
ini_set('error_log', dirname(__file__) . '/log_error_php.txt');
// Afficher les erreurs et les avertissements
error_reporting(e_all);
?>
Affiche le message d’erreur suivant
Notice: Use of undefined constant e_all - assumed 'e_all' in D/scorsese.php on line 9
La ligne 9 est égale à:
error_reporting(e_all);
Il semblerait qu’il ne tienne pas compte de fonctions.inc car dans ce fichier j’ai aussi ajouté le même code que ci-dessus en haut (et donc il aurait dû, sauf erreur afficher le même message d’erreur une autre fois, non ?).
En local, comme sur Internet, le header s’affiche, le haut du body et le footer aussi, mais le code de fonctions.inc ne marche pas (pas de texte généré par le preg_match).

Donc les erreurs provoquées ou non s'affichent bien.
Voilà j’espère que cela vous donne des pistes.

Merci,
Seb
0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
24 nov. 2016 à 01:31
Bonjour,

Pour :
Notice: Use of undefined constant e_all - assumed 'e_all' in

La bonne syntaxe c'est :
error_reporting(E_ALL);


Pour ce qui est du message sur la variable $noexist .. et .. bien.. c'est normal... car elle n'existe pas (elle n'est déclarée nul part)
relis ce qui est marqué ici : https://forums.commentcamarche.net/forum/affich-34094463-petit-souci-php-lors-de-la-migration-imposee-de-php-5-5-a-7-0#10

Tu peux par exemple reprendre le test sur une variable inexistante pour commencer :
fichier test.php
<?php
echo $noexist;


Donc.. c'est bon.. les messages d'erreurs s'affichent bien cette fois.


Maintenant interessons nous à ton fichier "fonction.inc".
A la place de juste faire un INCLUDE
include("fonctions.inc");

Fais donc un REQUIRE
require_once "fonctions.inc";

Cela affichera un message dans le cas où le fichier ne serait pas trouvé ou son nom mal orthographié.
0
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 5
25 nov. 2016 à 14:14
Bonjour Jordane45,

Merci pour cette piste.

Le remplacement de include par require ne change rien en localhost (wampserver), le même message d’erreur (provoquée) s’affiche.

Sur Internet, avec require, ereg et PHP 5.6, la page s'affiche bien (le texte entre balise s'affiche comme tout le reste).

Sur Internet, avec require, ereg et PHP 7.0, la page ne s'affiche pas bien (le texte entre balise ne s'affiche pas) et je n'ai même pas de footer (mais pas de message d'erreur), mais c'est normal ereg est obsolète.

Sur Internet, avec require, preg_match et PHP 7.0, la page ne s'affiche pas bien (le texte entre balise ne s'affiche pas) mais j'ai le footer (et pas de message d'erreur).

A+

Seb
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 525
25 nov. 2016 à 16:06
Si l'erreur provoquée exprès est présente sur ton dernier test (Sur internet avec require, preg_match et PHP7), il est toujours étrange de ne pas réussir à voir ces messages d'erreur.

Peux tu nous donner le contenu du fichier utilisé avec la fonction trouver_extrait() afin que nous puissions tester la fonction adapté en PHP7 (fichier blabla.txt) ?
0
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 5
25 nov. 2016 à 18:08
Oui Pitet voici la structure de blabla.txt (ce sont des fichiers sur les réals avec le nom commençant par s), mais y a toutes les lettres.
Dans blabla.txt donc seulement du texte brut et des balises html, aucun code php et pour chaque réal entre <!--Real--> et <!--/Real-->

<!--Scorsese--> <table><tr><td><p> <table><tr><th class="small" title="BIO... les étapes marquantes de la vie, la personnalité">BIOGRAPHIE</th><th class="small" title="STYLE... les influences et les caractéristiques du langage, les films emblématiques">STYLE CINÉ</th></tr><tr><td class="small" style="text-indent: 5px; line-height: 130%"> Martin Scorsese [19xx, USA - ] etc., etc.</table> <!--/Scorsese-->
<!--Spielberg--> <table><tr><td><p> <table><tr><th class="small" title="BIO... les étapes marquantes de la vie, la personnalité">BIOGRAPHIE</th><th class="small" title="STYLE... les influences et les caractéristiques du langage, les films emblématiques">STYLE CINÉ</th></tr><tr><td class="small" style="text-indent: 5px; line-height: 130%"> Steven Spielberg [19xx, USA - ] etc., etc.</table> <!--/Spielberg-->
<!--Stahl--> <table><tr><td><p> <table><tr><th class="small" title="BIO... les étapes marquantes de la vie, la personnalité">BIOGRAPHIE</th><th class="small" title="STYLE... les influences et les caractéristiques du langage, les films emblématiques">STYLE CINÉ</th></tr><tr><td class="small" style="text-indent: 5px; line-height: 130%"> John Stahl [19xx, USA - ] etc., etc.</table> <!--/Stahl-->
Etc. (le fichier blabla.txt pèse environ 200 Ko)

Et encore tous mes remerciements pour votre aide
A+
0
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 525
28 nov. 2016 à 09:22
Ta fonction retourne bien le contenu de la balise commentaire <!--Scorsese--> en PHP7 avec ce texte : https://sandbox.onlinephpfunctions.com/code/6db64abe4de6b6dc399e444c2efdb51c747f46c4
0
Sebas22 Messages postés 110 Date d'inscription jeudi 13 mai 2010 Statut Membre Dernière intervention 24 juillet 2018 5
19 janv. 2017 à 13:37
Bonjour,
C’est enfin résolu !
Et je veux remercier à la fois Pitet et Jordane45 d’avoir aidé et d’être restés fermes sur leur position.
La soluce était vraiment très tordue.
En fait le fameux fichier txt était généré par macro VBA d’un xlsm.
Il reprenait de manière mécanique des données des réalisateurs, toutes sur le même format.
J’ai fini après des heures de vérif par remarquer qu’en passant de PHP 5.6 à 7.0 cela marchait pour certains rares réals pour lesquels je n’avais qu’un seul film sélectionné (pas pour les autres).
Dans le txt, la VBA introduit des tabulations entre les cellules Excel et même un retour ligne (« pi ») en cas de plusieurs films.
Pas de problème avec PHP 5.5 et 5.6 et la fonction avec ereg.
Mais plantage avec PHP 7.0 et la fonction avec pregmatch pour les réals avec plusieurs films.
Donc j’ai repris mon txt avec notepad++ et je l’ai nettoyé des tabs et « pi » et cela marche nickel avec PHP 7.0 et la fonction avec pregmatch.
Pas évident !
(et je ne sais toujours pas si le plantage vient de PHP 7 ou de la fonction avec pregmatch !)
En tout cas encore merci.
Seb
0