Accès à une DB MySQLi d'un autre domaine

Résolu/Fermé
Herve_be Messages postés 1015 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 10 mars 2024 - 28 mars 2023 à 16:57
Herve_be Messages postés 1015 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 10 mars 2024 - 30 mars 2023 à 14:12

Bonjour,
J'ai 2 domaines chez le même hébergeur, disons A.be et B.com qui contient une DB Mysql.
Je construis des images dans le domaine A dont je peux utiliser l'URL dans la DB du domaine B.

Les images stockées en A ne sont pas toujours utilisées dans le domaine B, elles occupent de la place inutilement.
Je voudrais donc supprimer de A les images qui ne sont pas référencées dans B.
Pour ce faire 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.
Une idée ?

14 réponses

yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
28 mars 2023 à 17:03

bonjour,

tu pourrais exporter les données utiles de B, et les importer dans une table temporaire sur A.

0
Herve_be Messages postés 1015 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 10 mars 2024 8
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 !

0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
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.

0
Herve_be Messages postés 1015 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 10 mars 2024 8
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.

0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
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?

0
Herve_be Messages postés 1015 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 10 mars 2024 8 > yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024
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.

0
Herve_be Messages postés 1015 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 10 mars 2024 8
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.

0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
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

0

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

Posez votre question
Herve_be Messages postés 1015 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 10 mars 2024 8
29 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.

0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
29 mars 2023 à 12:09

L'idée est de copier le fichier, pas d'y accéder d'un domaine à l'autre.

0
Herve_be Messages postés 1015 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 10 mars 2024 8
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 ?

0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
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.

0
Herve_be Messages postés 1015 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 10 mars 2024 8
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.

0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
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?

0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
29 mars 2023 à 14:06

Je pense que tu devrais utiliser "commenter", et pas "répondre".

0
Herve_be Messages postés 1015 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 10 mars 2024 8
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 

  1. faire tourner un script pour obtenir un fichier reprenant la liste des messages
  2. copier manuellement la liste d'un domaine vers l'autre
  3. faire tourner un script pour construire la liste des fichiers inutilisés
  4. copier la liste dans le premier domaine
  5. 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.

0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
29 mars 2023 à 15:23

Tu donnes peu d'information précises.  Je crois deviner ceci:

  1. 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
  2. il y a 40000 enregistrements avec ce champ texte
  3. il y a 785 fichiers référencés
  4. tu n'as pas dit combien tu avais de fichiers sur B

Je suggère donc:

  1. d'avoir une page php, sur B, qui retourne la liste des 785 fichiers
  2. sur A, d'avoir un script qui appelle la page en B pour récupérer les 785 noms
  3. ce script, ensuite, enregistre ces noms dans une table indexées
  4. 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.
0
Herve_be Messages postés 1015 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 10 mars 2024 8
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

0
Herve_be Messages postés 1015 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 10 mars 2024 8
Modifié le 29 mars 2023 à 15:51

yg_be a écrit

  1. 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.
  2. il y a 40000 enregistrements avec ce champ texte EXACT
  3. il y a 785 fichiers référencés EXACT
  4. 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:

  1. d'avoir une page php, sur B, qui retourne la liste des 785 fichiers OK
  2. 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

0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
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.

0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
29 mars 2023 à 16:46

Utilise "commenter" et pas "répondre".

0
Herve_be Messages postés 1015 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 10 mars 2024 8
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 ?

0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
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.

0
Herve_be Messages postés 1015 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 10 mars 2024 8
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 ?

0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
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;
			}  
		}  
	}  
0
Herve_be Messages postés 1015 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 10 mars 2024 8
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 ?

0
Herve_be Messages postés 1015 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 10 mars 2024 8
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.

0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
30 mars 2023 à 14:09

peux-tu alors marquer la discussion comme résolue?

0
Herve_be Messages postés 1015 Date d'inscription mercredi 4 août 2010 Statut Membre Dernière intervention 10 mars 2024 8 > yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024
30 mars 2023 à 14:12

C'était déjà fait.

0