Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/03/2006, 17h03   #1
M4x
Candidat au titre de Membre du Club
 
Inscription : mars 2006
Messages : 15
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 15
Points : 13
Points : 13
Par défaut [SQL] Traitement de plusieurs requêtes .SQL dans un script PHP?

Bonjour,

En rapport avec ce problème.

Voila grosso modo la tronche du script qui sera executé périodiquement avec un cron job:

Code :
1
2
3
4
5
6
7
8
9
10
<?
require("identifresh.inc.php");
 
$connexion = mysql_connect(localhost,$user,$pass);
@mysql_select_db($database) or die( "Base introuvable");
 
ICI un fichier .sql contenant toutes les requêtes à executer. 
 
mysql_close($connexion);
?>
Dans le identifresh.inc.php je mettrai mes variables de connexion bien sûr.

Ma question est donc : Comment éxecuter dans un fichier PHP les requêtes SQL qui se trouvent à l'intérieur d'un fichier .sql (quelque part sur le serveur, exemple backup.sql) ? Doit bien y avoir une fonction pour ça je suppose nah ?
Certes je pourrai copier/coller en ces fameuses requetes, mais doit bien y avoir un moyen de lire celles-ci depuis un fichier sql non ?
M4x est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2006, 18h25   #2
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Salut

Je pense que tu as deux options.
  • Utiliser une commande système pour exécuter les commandes de ton fichier (je déplacerai le sujet dans le forum MySQL si c'est la solution que tu choisis)
  • Utiliser la fonction PHP split() pour exécuter les requêtes une à une, ce qui peut poser problème si tu as des points virgules ailleurs que pour séparer les requêtes

À mon avis, le mieux serait d'avoir un fichier texte de données brutes et d'utiliser mysqlimport ou LOAD DATA INFILE, plutôt que d'exécuter le SQL contenu dans un fichier.
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/03/2006, 13h01   #3
M4x
Candidat au titre de Membre du Club
 
Inscription : mars 2006
Messages : 15
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 15
Points : 13
Points : 13
Salut Kirkis,

En fait je place ceci dans un fichier .php car je veux que ce soit executer automatiquement et periodiquement par un cron (donc aucun input utilisateur).

Citation:
Utiliser la fonction PHP split() pour exécuter les requêtes une à une, ce qui peut poser problème si tu as des points virgules ailleurs que pour séparer les requêtes
Ok mais la fonction split elle va trifouiller dans le fichier sql ? Car il est pour moi hors de question que je sorte les requetes de leur fichier sql.

Enfin bon, je jetterai un oeil à toutes les fonctions PHP dispo' qui tournent autour de MySQL, et puis je me suis commandé le bouquin des editions o'reilly, étant donné que ça n'a pas l'air si simple que ça, donc bon...je finirais par trouver comment lire et executer automatiquement un fichier .sql a partir d'un fichier php -_-' .
M4x est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/03/2006, 16h57   #4
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Peu importe que ton script soit exécuté par une tâche cron ou autrement. Du moment qu'il est exécuté, cela nous suffit pour réfléchir à la manière de le construire ^^

Comment veux-tu exécuter des requêtes contenues dans un fichier SQL si tu n'accèdes jamais à ce fichier ? Tu es bien obligé de le lire à un moment ou à un autre !
Mon idée était d'utiliser file_get_contents() pour récupérer les requêtes dans une variable, puis split() sur cette variable pour séparer les requêtes et ainsi pouvoir les exécuter une à une.

Je le répète, la meilleure solution consisterait à avoir un fichier CSV plutôt qu'un fichier contenant les requêtes SQL. Là, oui, ce serait simple à importer. Mais j'imagine qu'il ne s'agit pas (uniquement ou du tout) d'importer des données...
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/03/2006, 18h22   #5
M4x
Candidat au titre de Membre du Club
 
Inscription : mars 2006
Messages : 15
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 15
Points : 13
Points : 13
Citation:
Envoyé par Kirkis
Peu importe que ton script soit exécuté par une tâche cron ou autrement. Du moment qu'il est exécuté, cela nous suffit pour réfléchir à la manière de le construire ^^
Oui

Citation:
Comment veux-tu exécuter des requêtes contenues dans un fichier SQL si tu n'accèdes jamais à ce fichier ? Tu es bien obligé de le lire à un moment ou à un autre !
Mais justement c'est la ma question, comment y accéder à ce foutu fichier et lire son contenu :p !?

Citation:
Mon idée était d'utiliser file_get_contents() pour récupérer les requêtes dans une variable,
Et ben voila ! Ca ressemble a ce que je cherchais ça dites donc :p !!! je vais aller lire les détails de cette fonction tiens.

Citation:
puis split() sur cette variable pour séparer les requêtes et ainsi pouvoir les exécuter une à une.
Hum ok ok...ne connaissant que peu encore ce genre de bidouilles, je ne vois pas l'intéret du split encore, ça va sûrement venir quand j'aurai fait crasher le serv lol...

Citation:
Je le répète, la meilleure solution consisterait à avoir un fichier CSV plutôt qu'un fichier contenant les requêtes SQL. Là, oui, ce serait simple à importer. Mais j'imagine qu'il ne s'agit pas (uniquement ou du tout) d'importer des données...
Et bien je t'explique brièvement. Imagine que je souhaite mettre phpBB et son administration en demonstration sur un site, pour que les internautes puissent essayer l'admin de phpBB, voir à quoi ça ressemble, si ça leur convient etc...Moi je leur fournis un identifiant admin lambda genre user=admin et pass=demo. Seulement voila...si je laissais faire, au bout d'un moment, le forum pourrait avoir plein de sujets tests à la con, ou pire encore un admin lambda vilain (ô le vil) pourrait décider de changer le mot de passe "demo" et la les autres pourraient plus essayer l'admin par defaut...donc je souhaite "reset" périodiquement la base de données phpBB (une fois par heure peut etre) en remplacant cette dernière avec un backup (qui est au format SQL) effectué avant même que je ne mette le site en demo.

Pour faire + court :

1. phpBB est installé avec son install par defaut, avec un compte admin bidon (admin/demo).
2. je backup le tout sur un fichier sql.
3. Les visiteurs arrivent, s'amusent avec l'administration.
4 Au bout d'une heure, cron entre en action avec le script qui se connecte a la base de donnees et remplace celle-ci (supposément modifié par les visiteurs donc) par le backup effectué dans l'etape 2.

Voila de quoi il s'agit exactement. Maintenant un fichier CSV (c'est pas pour gérer les changement de version ça ?) je suis pas sur de voir ce que c'est :p..donc je vais me documenter dessus.
M4x est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/03/2006, 19h59   #6
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Ah, alors il y a bien plus simple

MySQL dispose de fonctions permettant de copier des tables entières avec leur contenu. J'imagine, sans avoir vérifié, qu'il y a la même fonctionnalité avec une BDD complète.

Tout dépend des droits que tu as sur ta BDD. Si tu es autorisé à créer plusieurs bases de données, le plus simple est d'en conserver une copie (dans une BDD appelée `phpbb2_bak`, par exemple). Ton script se contentera donc de vider la BDD `phpbb2` puis d'y copier `phpbb2_bak`.
Sinon, le principe est identique mais appliqué à chaque table. La seule difficulté consiste à sélectionner toutes les tables de la BDD en faisant la différence entre les tables _bak et les autres (celles utilisées pour la démo).

J'ai dit CVS de tête mais je crois que j'ai fait erreur. Je faisais référence aux fichiers de données utilisant un caractère pour séparer les champs (TAB, par exemple).
Bien sûr, mon logiciel de traitement de texte me fait la tête aujourd'hui et il ne me propose plus ce format, donc pas moyen de retrouver le nom correct.
[Edit] Je n'étais pas loin : je parlais de "CSV".
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h38.


 
 
 
 
Partenaires

Hébergement Web