[RESOLU] Exécuter un fichier .sql avec PHP

Eléphanteau du PHP | 17 Messages

19 oct. 2007, 11:39

Bonjour,

J'ai réussi à créer un fichier .sql qui contient ma base de données grâce à l'aide des membres de ce forum, je les en remercie beaucoup. Maintenant, quand j'ai voulu l'exécuter ça me donne une erreur de syntaxe :(

Code : Tout sélectionner

$requete = file_get_contents("copie_bdd.sql"); mysql_query($requete)or die(mysql_error());
Voici l'erreur:

Erreur de syntaxe près de '; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESUL' à la ligne 7

Je ne sais pas quoi faire, c'est un fichier généré par mysqldump donc j'ai pensé qu'il peut être exécuté directement dans "mysql_query()"

Si c'est la mauvaise méthode, comment faire pour exécuter ce fichier .sql ?

Je travaille avec EasyPHP 1.8

Merci beaucoup

Eléphant du PHP | 443 Messages

19 oct. 2007, 11:54

Salut,

mysql_query(...) est prévu pour n'éxécuter qu'un seul ordre. Donc il te faudra encore une fois passer par un exec(...) du prompt de mysql avec en paramêtre le fichier de sauvegarde .sql


Tracker.

Eléphanteau du PHP | 17 Messages

19 oct. 2007, 11:57

comment je fais avec "exec()" ?

car quand je fais "exec(" copie_bdd.sql ");" il me l'ouvre comme un fichier texte :(
Modifié en dernier par reem le 19 oct. 2007, 11:58, modifié 1 fois.

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

19 oct. 2007, 11:57

Le problème c'est que mysql_query() n'exécute qu'une seule requête à la fois, et échoue au premier point-virgule utilisé pour séparer les requêtes. Si tu es sous PHP5 et que ton fichier .sql n'est pas trop gros tu peux essayer mysqli_multi_query(), sinon le plus simple serait de passer par phpMyAdmin ou mieux encore, en ligne de commande avec mysql.

Pour la ligne de commande, ça devrait ressembler à
menu Démarrer -> Exécuter -> cmd
puis

Code : Tout sélectionner

mysql -uroot -pmotdepasse -Dbase "c:\chemin\fichier\backup.sql"

Eléphanteau du PHP | 17 Messages

19 oct. 2007, 12:02

J'ai PHP 4.3.10 et la fonction mysqli_multi_query() n'est pas défini je viens de l'essayer.

Le problème c'est qu'il faut que je le fasse avec PHP et non pas dans PhpMyAdmin

ViPHP
ViPHP | 4039 Messages

19 oct. 2007, 12:29

ben charge le contenu sql de ton fichier dans une variable, fait un explode dessus, et puis un foreach pour exécuter une à une les requêtes, enfin, il me semble..
$sql = file_get_contents("le fichier sql");
$sql_array = explode (";",$sql);
foreach ($sql_array as $val) {
 mysql_query($val);
}
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Eléphanteau du PHP | 17 Messages

19 oct. 2007, 13:02

très bien, avec ça les requêtes sont bien découpées, mais la base de données n'est pas créée.
On me dit "Aucune base n'a été sélectionnée"

Ce fichier SQL contient les requêtes qu'il faut pour recréer une base de données donc les insertions doivent se faire sur cette base de données récemment créée pourquoi faut-il sélectionner une bdd ?

Eléphanteau du PHP | 17 Messages

19 oct. 2007, 13:35

j'ai fini par créer la base de données avec une requête à part, puis exécuter le fichier .sql pour la remplir.

Tout marche très bien jusqu'au premier accent ! J'ai mis dans ma bdd 'Féminin' avec é au lieu de 'é' pour ne pas avoir le problème d'affichage des accents, et maintenant le ";" qui est dans 'Féminin' gène le bon découpage des requêtes :(

ViPHP
ViPHP | 4039 Messages

19 oct. 2007, 13:49

ah oui..

dans ton ficher sql, qu'est-ce qu'il y a entre chaque requête, mis à part le point virgule ?

SI c'est un espace, il suffit de mettre
explode("; ",$sql)
Pour une nouvelle ligne, ce serait
explode(";\n",$sql)
(\r\n ou \r, faut voir)

Enfin, des trucs comme ça quoi..
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Eléphanteau du PHP | 17 Messages

19 oct. 2007, 14:33

youpiiiiiiiiiiiiiiiiiiiii ça marche très très très bien avec :
explode(";\r",$sql);
Merci infiniment pour votre aide :D

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

19 oct. 2007, 15:25

Modération :
reem, si ta question est résolue, pense à ajouter le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.
Tu peux réaliser cette opération en cliquant sur le bouton Image en haut à gauche de ce sujet.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Oneill_
Invité n'ayant pas de compte PHPfrance

04 mai 2012, 10:42

Merci Beaucoup pour ce petit bout de code qui vient de me sauver la vie !!

theo
Invité n'ayant pas de compte PHPfrance

27 nov. 2013, 14:30

merci merci merci