insérer un fichier dump dans une base de données

Eléphanteau du PHP | 10 Messages

09 juil. 2006, 11:09

Bonjour à tous,

Dans un premier temps j'effectue un dump d'une base de données. Ce dump est enregistré dans un fichier dump.sql

Par la suite j'essaie d'insérer ce fichier dans une autre base de données, en ayant vider cette base auparavant.

Mon problème est qu'il refuse d'insérer le fichier à cause de caractères spéciaux.

Par exemple voici une des lignes du fichier dump.sql

Code : Tout sélectionner

INSERT INTO fichier VALUES('39', '29', './data/plan_d'acces.jpg', '');
c'est le &#39 qui pose problème, ça correspond à un apostrophe.

Voici le script PHP que j'utilise pour insérer le fichier:
<?php
include_once "connexionBDD.php";

$deleteQuery="DROP TABLE fichier";
if ($res=mysql_query($deleteQuery)) echo "true".$res; else echo "false".$res;
mysql_error();

$handle = fopen("dump.sql", "rb");
$contents = '';
while (!feof($handle)) {
  $contents .= fread($handle, 8192);
}
fclose($handle);

$contents=str_replace("(,", "( NULL,", $contents);
$contents=str_replace(", , )", ", NULL, NULL )", $contents);
$contents=str_replace(", ,", ", NULL,", $contents);
$contents=str_replace(", ,", ", NULL,", $contents);
if ($res=mysql_query($contents)) echo "true".$res; else echo "false".$res;

echo $contents;
mysql_error();
?>
avez vous une petite idée pour résoudre ce problème?

EDIT: le problème viendrait de l'écriture du fichier dump.sql ou de la manière dont je le récupère?
voici comment je récupère les informations de ma base.
Je génère un fllux que je récupère dans director, et je crée le fichier dump.sql sur mon pc grace à director. Après vérification le fichier est encodé en ANSI.
<?php
$host = "host_name";  
$user = "user_name";
$bdd = "bdd_name";
$passwd  = "password";
	
function dumpMySQL($serveur, $login, $password, $base, $mode)
{
   $connexion = mysql_connect($serveur, $login, $password);
   mysql_select_db($base, $connexion);
   
   $creations = "";
   $insertions = "\n\n";
   
   $listeTables = mysql_query("show tables", $connexion);
   while($table = mysql_fetch_array($listeTables))
   {
      if($mode == 1 || $mode == 3)
      {
         $listeCreationsTables = mysql_query("show create table ".$table[0], $connexion);
         while($creationTable = mysql_fetch_array($listeCreationsTables))
         {
           $creations .= $creationTable[1].";\n\n";
         }
      }
      if($mode > 1)
      {
         $donnees = mysql_query("SELECT * FROM ".$table[0]);
         $insertions .= "-- insertions dans la table ".$table[0]."\n";
         $insertions .= "-- -----------------------------\n";*/
         while($nuplet = mysql_fetch_array($donnees))
         {
            $insertions .= "INSERT INTO ".$table[0]." VALUES(";
            for($i=0; $i < mysql_num_fields($donnees); $i++)
            {
              if($i != 0)
                 $insertions .=  ", ";             
                 $insertions .=  "'";
                $insertions .= addslashes($nuplet[$i]);
                $insertions .=  "'";
            }
            $insertions .=  ");\n";
         }
         $insertions .= "\n";
      }
   }

   mysql_close($connexion);
   echo $entete . $creations .$insertions;
}
dumpMySQL($DBServer, $user, $passwd, $bdd, 3);
?>

meric à tous et bon dimanche

Eléphanteau du PHP | 10 Messages

09 juil. 2006, 17:19

j'ai essayé en ajoutant ceci avant la requête d'insertion mais ça n'y fait rien:
$contents=utf8_encode($contents); 

Eléphanteau du PHP | 10 Messages

11 juil. 2006, 08:25

bonjour à tous, j'avance doucement.
J'ai fait en sorte que mes caractères apostrophes ne soient plus enregistré en tant que ' mais plutôt \'

Lorsque je lance l'import via mon script php ça ne fonctionne pas, par contre si je fais un copier coller de ma requête dans phpmyadmin ça fonctionne....

voua avez une petite idée?

merci à tous et bonne journée

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

11 juil. 2006, 09:05

Normalement, le contenu d'un fichier dump est une suite de requete SQL, tu devaris donc pouvoir l'exécuter directement dans phpMyAdmin

Sinon, pour insérer un \ devant tous les caractères spéciaux, tu peut utiliser la fonction addslashes()

L'utilisation de cette fonction est toujours recommandée avant d'exécuter une requete (a condition que le magic_quote_gpc soit désactivé sur le serveur)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Invité
Invité n'ayant pas de compte PHPfrance

11 juil. 2006, 20:10

oui c'est en effet ce que j'ai fait.
Mon fichier sql fonctionne dans phpmyadmin mais ne fonctionnait pas dans ma requêtes et ce pour une réison simple et totalement idiote de ma part. Comme tu l'as bien fait remarquer il s'agit de plusieurs requêtes alors que mysql_query n'en traine qu'une seule.
J'ai donc fais un split sur mon fichier suivi d'un mysql_query sur mon tableau et tout fonctionne parfaitement maintenant