PHP include externe

Petit nouveau ! | 1 Messages

29 déc. 2013, 17:12

Quelqu'un saurait il me dire où se trouve mon erreur ?

- Sur le domaine "D1" (chez OVH), j'ai un programme PHP "P1" qui effectue des accès à une base mySQL.
- Le programme de connexion "SP" à la base est intégré à "P1" par un "include SP" dans "P1" (chemin relatif).
- je lance l'exécution de http://D1.P1
Tout va bien, cela fonctionne parfaitement.

Dans un soucis d'organisation,
- je déplace mes programmes PHP de "D1" sur "D2" (également chez OVH).
- J'écris un programme PHP "P2" sur "D1" qui ne contient qu'un include "http://D2.P1" (lien externe) en remplaçant également dans "P1" le lien include par un lien externe sur "SP"
- Je lance l'exécution de http://D1.P2
Le programme s'exécute et visiblement les "include" ont bien pris leur leur place, par contre j'ai une erreur d'exécution dans le programme de connexion "SP" qui me dit
"impossible de se connecter : Access denied for user 'xxxxxxxxx' (using password: YES)" ???

Après quelques tests (impression des variables des noms de base, nom user et mot de passe) tout fonctionne bien, mais il semblerait qu'il ne trouve plus la base !
Je croyais que le include de PHP était à l'identique d'un copier/coller...

Merci d'avance pour vos avis éclairés.

alain56_
Invité n'ayant pas de compte PHPfrance

30 déc. 2013, 08:59

Personne n'a d'idées ?
Peut être que mon explication est un peu compliquée !
Je vais reformuler ma question autrement !

<?php
$host = "mysql5-2";
$user = "alain56";
$passw = "xxxxxx";
$bdd = "mabase";
mysql_connect($host, $user, $passw) or die(mysql_error());
mysql_select_db($bdd) or die(mysql_error());
?>

Cette routine insérée dans un programme PHP par include retourne un message "Access denied for user" si elle est située sur un domaine différent de celui du programme principal et incluse (include "http://...routine") à partir d'un lien externe.

Si la routine se situe sur le même domaine, tout fonctionne bien !

Pourquoi ?

Eléphant du PHP | 52 Messages

30 déc. 2013, 12:44

Bonjour,

Tes deux domaines ne seraient pas sur deux machines différentes ? Auquel cas une machine peut accéder aux bases et pas nécessairement l'autre.
Image Zend Certified Engineer

alain56_
Invité n'ayant pas de compte PHPfrance

30 déc. 2013, 15:44

Merci ikkiphenix pour ta réponse,

L'exécution s'effectue dans les deux cas sur le même domaine, donc sur la même machine !
Ce n'est que le code du include PHP qui est copié depuis un autre domaine dans le programme principale.
Je pensais que le include ne faisait qu'un copier/coller pour ensuite être exécuté dans le programme principal.

Je vais tenter d'approfondir dans la direction de ta remarque !

Eléphant du PHP | 52 Messages

30 déc. 2013, 16:41

J'insiste un peu mais tu as un bien deux scripts PHP ? Un script qui tourne sur domain1.com et qui fonctionne et un script qui tourne sur domain2.com, qui contient un include des paramètres de connexion, et qui te renvoie l'erreur Access denied for user 'xxxxxxxxx' (using password: YES)".
Image Zend Certified Engineer

Invité
Invité n'ayant pas de compte PHPfrance

30 déc. 2013, 17:11

J'ai un script qui tourne sur domain1.com qui contient un include des instructions et paramètres de connexion depuis domain2.com... on ne peut pas dire qu'il tourne sur domain2.com, ce n'est pas un sous programme mais des lignes de code copier/coller (importées) par le include !

Eléphant du PHP | 52 Messages

31 déc. 2013, 13:36

Dans le script qui te renvoie l'erreur, si tu remplaces la ligne du include par le code en dur, ça fonctionne ?
Image Zend Certified Engineer

alain56_
Invité n'ayant pas de compte PHPfrance

31 déc. 2013, 16:19

Non plus ! Même erreur !

En résumé :

fonctionne
D1.P1
-- include D1.SP

ne fonctionne pas
1) D1.P2
-- include D2.P1 avec include D2.SP

2) D1.P2
-- include D2.P1 avec SP en dur

3) D1.P1
-- include D2.SP

Il semble qu'il soit nécessaire que P1 et SP se trouvent sur le même domaine d'exécution !

Merci pour ton intérêt !

Eléphant du PHP | 52 Messages

31 déc. 2013, 17:01

Ok... J'ai relu la doc PHP et le fichier inclus dans le include() est exécuté/évalué sur le serveur où il est stocké. A mon avis, ce serveur dans ton cas, n'a pas accès à la base.

Il faut soit que tu utilises un file_get_contents() sur un fichier *.txt pour éviter que le fichier soit évalué et qu'il t'arrive comme tu le disais en "copier / coller". Soit tu fais file_get_contents() sur le fichier *.php suivi d'un eval() pour l'exécuter sur le serveur qui accède correctement à la base.

Attention, dans tous les cas, ces techniques sont intéressantes intellectuellement et permettent de tester si c'est bien ce qui te bloque, mais elles sont plutôt dangereuses d'un point de vue sécurité si mal utilisées. Il faudrait au minimum bloquer l'affichage des *.txt
Modifié en dernier par ikkiphenix le 31 déc. 2013, 18:34, modifié 1 fois.
Image Zend Certified Engineer

alain56_
Invité n'ayant pas de compte PHPfrance

31 déc. 2013, 17:39

Très clair !
Merci pour ton diagnostic rapide. Je n'avais pas réussi à trouver cette précision de fonctionnement du include() PHP !
par exemple... http://www.php.net/manual/fr/function.include.php