Accès à une DB MySQLi d'un autre domaine
Résolu/FerméHerve_be Messages postés 1077 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 6 décembre 2024 - 30 mars 2023 à 14:12
- Accès à une DB MySQLi d'un autre domaine
- Acces rapide - Guide
- Mysqli::real_connect(): (hy000/2002): aucune connexion n’a pu être établie car l’ordinateur cible l’a expressément refusée. - Forum PHP
- Sortir un pc du domaine ✓ - Forum Réseau
- Db designer - Télécharger - Bases de données
- Je n'ai plus acces a ma boite mail gmail - Guide
14 réponses
28 mars 2023 à 17:03
bonjour,
tu pourrais exporter les données utiles de B, et les importer dans une table temporaire sur A.
28 mars 2023 à 17:14
Merci, oui, c'est l'idée.
Il existe des liens dans B qui ne pointent pas nécessairement vers des fichiers hébergés sous A.
Il faudrait donc exporter toutes les données de B de qui représente un gros volume à exporter.
A mon avis il faut faire le contraire : exporter la liste des fichiers présents sur A afin que je puisse vérifier ceux qui ne sont pas référencés dans B pour les supprimer dans A.
Il y a bien une solution
- exporter la liste des fichiers de A
- l'importer dans B, supprimer de la liste les fichiers qui y sont référencés, exporter cette liste
- revenir dans A, importer la liste réduite et supprimer de A les fichiers qui subsistent dans la liste
pas pratique !
28 mars 2023 à 18:02
Il ne faut exporter de B que la liste des URLs. C'est quoi, un gros volume? Tu n'as donné aucune information, au départ, sur les volumes. Ni sur tes contraintes.
Tu as donc maintenant deux pistes possibles.
Pour les deux, je pense, tu peux travailler sans programmer, en faisant travailler uniquement les bases de données.
28 mars 2023 à 18:35
Bonsoir,
Les données sont noyées dans plus de 40.000 zones de texte, parfois plusieurs URL dans le même texte.
Les URL sont de la forme https://www.A.be/X/Y/Z/TimeStamp.jpg
Je dois donc sélectionner toutes les zones qui contiennent https://www.A.be/X/Y/Z/ pour extraire le TimeStamp qui suit et qui est le nom du fichier : phpMyAdmin en trouve 785.
Je ne comprends pas comment je peux exporter cette liste pour l'utiliser dans A.
28 mars 2023 à 19:31
40000 zones de texte, cela ne fait pas un très gros fichier, si?
Si phpmyadmin en trouve 785, quelle est la difficulté d'exporter ces 785?
28 mars 2023 à 23:11
La difficulté est que je ne comprends pas ce que tu veux dire par "exporter" ni comment je pourrais ensuite importer dans l'autre domaine.
29 mars 2023 à 09:09
La question est que je ne comprends pas ce que tu veux dire par "exporter" ni comment je pourrais ensuite importer dans l'autre domaine.
29 mars 2023 à 11:29
Exporter, c'est créer un fichier avec des données extraites d'une base.
Importer, c'est insérer des données dans une base, à partir du contenu d'un fichier.
Un fichier peut facilement être copié d'un domaine à l'autre, j'imagine.
https://web.maths.unsw.edu.au/~lafaye/CCM/mysql/mysqlimport.htm
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question29 mars 2023 à 11:49
"Un fichier peut facilement être copié d'un domaine à l'autre, j'imagine."
si j'héberge le script dans A je n'ai pas accès aux fichiers de B et réciproquement, c'est bien là le problème.
29 mars 2023 à 12:09
L'idée est de copier le fichier, pas d'y accéder d'un domaine à l'autre.
29 mars 2023 à 12:21
"L'idée est de copier le fichier, pas d'y accéder d'un domaine à l'autre."
Comment pourrais-je copier le fichier d'un domaine à l'autre sans accéder d'un domaine à l'autre ?
J'avais posé la question sur un autre forum où on me propose une autre solution :
- un script php dans B qui vérifie si un fichier dont on lui donne le nom en input est référencé dans sa DB
et répond seulement Y ou N - un script dans A qui, pour chaque fichier, appelle le script B via son URL
si B répond N alors A supprime le fichier.
Qu'en penses-tu ?
29 mars 2023 à 13:10
Tu ne copies pas des fichiers entre ton ordi et chacun des domaines? Tu peux alors copier de B vers ton ordi, puis de ton ordi vers A.
29 mars 2023 à 13:36
Je ne comprends pas pourquoi ta réponse se perd chaque fois parmi tous les messages, je dois chaque fois la recopier à la fin.
"Tu ne copies pas des fichiers entre ton ordi et chacun des domaines?
Tu peux alors copier de B vers ton ordi, puis de ton ordi vers A."
Effectivement, mais c'est alors manuel !
J'utilise différents scripts automatiquement chaque jour, je voudrais y inclure une fonction qui supprime les fichiers d'un domaine non référencés par l'autre automatiquement aussi.
29 mars 2023 à 13:47
Tu n'avais pas expliqué que tu voulais faire cela tous les jours, ni automatiquement.
Pour gagner un peu de place, tu vas développer et ensuite faire ainsi tourner une usine à gaz tous les jours?
29 mars 2023 à 14:06
Je pense que tu devrais utiliser "commenter", et pas "répondre".
Modifié le 29 mars 2023 à 13:56
J'ai quand même bien écrit dans mon message initial
j'ai écrit un script php qui va lire le répertoire de A puis effectue une recherche SQL dans B, s'il ne trouve pas l'URL de l'image il la supprime de A.
Le problème : si j'héberge le script dans A je n'ai pas accès à la DB de B et réciproquement.
ce qui est implicitement automatique; si je dois manuellement
- faire tourner un script pour obtenir un fichier reprenant la liste des messages
- copier manuellement la liste d'un domaine vers l'autre
- faire tourner un script pour construire la liste des fichiers inutilisés
- copier la liste dans le premier domaine
- faire tourner un autre script pour supprime les fichiers qui se trouvent dans la liste
- je vais oublier de le faire "de temps en temps"
- je ne me souviendrai plus comment il faut procéder
- avec toutes ces étapes je risque de commettre des erreurs
le mieux est donc de tout faire dans un seul script que je peux faire tourner quand j'y pense
et encore mieux automatiquement même si je n'y pense pas.
Je creuse la solution du script qui vérifie si le fichier est référence dans l'autre domaine.
29 mars 2023 à 15:23
Tu donnes peu d'information précises. Je crois deviner ceci:
- dans le domaine B, les noms de fichiers ne sont pas enregistrés de façon structurée, ils sont inclus dans des champs textes
- il y a 40000 enregistrements avec ce champ texte
- il y a 785 fichiers référencés
- tu n'as pas dit combien tu avais de fichiers sur B
Je suggère donc:
- d'avoir une page php, sur B, qui retourne la liste des 785 fichiers
- sur A, d'avoir un script qui appelle la page en B pour récupérer les 785 noms
- ce script, ensuite, enregistre ces noms dans une table indexées
- ce script, ensuite, vérifie, pour chacun des fichiers présents sur A, si il est présent dans la table, et le supprime si il n'est pas présent.
29 mars 2023 à 15:18
Bon, je ne peux pas appeler un script php de B à partir d'un script php de A !
Warning: include(): https:// wrapper is disabled in the server configuration by allow_url_include=0
Modifié le 29 mars 2023 à 15:51
yg_be a écrit
- dans le domaine B, les noms de fichiers ne sont pas enregistrés de façon structurée, ils sont inclus dans des champs textes EXACT, comme je l'ai écrit
Les données sont noyées dans plus de 40.000 zones de texte, parfois plusieurs URL dans le même texte. - il y a 40000 enregistrements avec ce champ texte EXACT
- il y a 785 fichiers référencés EXACT
- tu n'as pas dit combien tu avais de fichiers sur B AUCUN, les fichiers sont sur A, sur B c'est une DB
Je suggère donc:
- d'avoir une page php, sur B, qui retourne la liste des 785 fichiers OK
- sur A, d'avoir un script qui appelle la page en B pour récupérer les 785 noms
Comme je viens de l'écrire je ne peux pas appeler un script php de B à partir d'un script php de A !
Le contraire non plus : j'obtiens une erreur
Warning: include(): https:// wrapper is disabled in the server configuration by allow_url_include=0
29 mars 2023 à 16:46
Combien as-tu de fichiers sur A?
"sur A, d'avoir un script qui appelle la page en B pour récupérer les 785 noms", cela se fait en faisant appel à l'URL de la page, pas en incluant le code PHP! Tu peux utiliser fopen() pour réaliser cela.
29 mars 2023 à 16:46
Utilise "commenter" et pas "répondre".
Modifié le 29 mars 2023 à 17:25
Combien as-tu de fichiers sur A? 1.621 pour un total de 3GB, 785 sont référencés donc 836 sont inutiles.
"sur A, d'avoir un script qui appelle la page en B pour récupérer les 785 noms", cela se fait en faisant appel à l'URL de la page, pas en incluant le code PHP! Tu peux utiliser fopen() pour réaliser cela.
OK, dans A je fais
$sc = scandir($dir); foreach($sc as $file) { if ((!is_dir($file)) & (substr($file,-3)=="jpg")) { fopen("URL de B/script.php?File=".$file,"r"); } }
dans le script sur B je récupère le nom du fichier par un $_GET["File"]
puis je recherche avec SQL le nombre de fois où il est utilisé.
Comment puis-je récupérer ce nombre dans A ?
Avec echo dans B et OB_get_contents dans A ?
29 mars 2023 à 18:10
Ma suggestion, c'est que le script en B renvoie la liste de tout les fichiers référencés dans la base B. Pour éviter de faire des centaines d'appels à ce script.
Tu peux utiliser fgets() pour lire la réponse.
29 mars 2023 à 18:54
OK pour limiter le nombre d'appels, il est vrai que c'est long, on verra après; pour le moment
Dans B
$File=utf8_encode($_GET["File"]);
$Num=0;
$results = mysqli_query($db,"SELECT count(*) as Num ... WHERE `text` LIKE '%".$File."%'");
$data = mysqli_fetch_assoc($results);
$Num=$data['Num'];
echo $File." ".$Num;
Si j'appelle ce script dans mon navigateur j'obtiens bien le nom du fichier suivi du nombre de références : OK
Dans A
$dir = 'Shelter';
$sc = scandir($dir);
foreach($sc as $file)
{
if ((!is_dir($file)) & (substr($file,-3)=="jpg"))
{
$RetCode = fopen("URLdeB.php?File=".$file,"r");
if ($RetCode)
{
$Reply = fgets($RetCode);
echo "<br>".$Reply;
}
}
}
Je n'ai que des lignes blanches donc probablement seulement les <br>
Qu'est-ce que j'ai encore fait comme bêtise ?
30 mars 2023 à 13:37
Il serait bien de nous montrer le contenu de la page retournée par B (control-U dans le navigateur).
En utilisant fgets(), Il faut faire une boucle et appeler plusieurs fois fgets(), un fois par ligne de la réponse.
Si la réponse est courte, il suffit sans doute de faire:
$dir = 'Shelter'; $sc = scandir($dir); foreach($sc as $file) { if ((!is_dir($file)) & (substr($file,-3)=="jpg")) { $Reply = file_get_contents("URLdeB.php?File=".$file,"r"); if ($Reply ) { echo "<br>".$Reply; } } }
30 mars 2023 à 10:08
Bonjour,
Je ne parviens toujours pas à récupérer le résultat de l'autre domaine.
Voici le script dans le domaine B, celui où se trouve la DB
$File=utf8_encode($_GET["File"]);
$Num=0;
$results = mysqli_query($db,"SELECT count(*) as Num FROM `posts` WHERE `text` LIKE '%".$File."%'");
if ($results)
{
$data = mysqli_fetch_assoc($results);
$Num=$data['Num'];
}
echo $Num;
Si je l'appelle directement par exemple
https://www.leforumrecifal.com/Shelter.php?File=Herve_PRD230329115446.jpg
j'obtiens "1" : le fichier est référencé une fois; si je modifie le nom du fichier j'obtiens "0" : OK.
Voici comment je l'appelle (j'ai mis un break pour que la boucle ne s'exécute qu'une seule fois)
$dir = 'Shelter';
$sc = scandir($dir);
foreach($sc as $file)
{
if ((!is_dir($file)) & (substr($file,-3)=="jpg"))
{
$RetCode = fopen("https://www.leforumrecifal.com/Shelter.php?File=".$file,"r");
echo "<br>".$RetCode.":".$file;
break;
}
}
j'obtiens
Resource id #30:Herve_PRD230329115446.jpg
pourquoi la ressource et pas le résultat de echo $Num ?
30 mars 2023 à 14:08
J'ai trouvé : en utilisant file_get_contents au lieu de fgets
Keep 961 Delete 658 Total 1619
Problème résolu.
30 mars 2023 à 14:09
peux-tu alors marquer la discussion comme résolue?
30 mars 2023 à 14:12
C'était déjà fait.