2013-06-10 13 views
0

Je travaille à faire un téléchargement de fichier dans l'ordre de restaurer une table de sauvegarde (format .sql) ... Le code ci-dessous pour télécharger le fichier sql:Importer un fichier sql via PHP télécharger

<form enctype="multipart/form-data" method="post"> 

<font style="font-size:18px;">File to import:</font><br /> 

<input size='30' type='file' name='filename'> 

<input type="submit" name="submit" value="Upload File"> 
</form> 

Après avoir fait soumettre, les codes suivants sont:

set_time_limit (0); 

    //Upload File 
    if (isset($_POST['submit'])) { 
     if (is_uploaded_file($_FILES['filename']['tmp_name'])) { 
    if (move_uploaded_file($_FILES['filename']['tmp_name'], $_FILES['filename']['name'])) { 



$dbhost = 'localhost'; 
$dbuser = 'root'; 
$dbpass = ''; 
$conn = mysql_connect($dbhost, $dbuser, $dbpass); 
if(! $conn) 
{ 
    die('Could not connect: ' . mysql_error()); 
} 
$table_name = "items"; 

$backup_file = $_FILES['filename']['name']; 

if(!file_exists($backup_file)){ 
    echo "File Not Exists"; 
} 

$sql = "LOAD DATA INFILE '$backup_file' INTO TABLE $table_name"; 

mysql_select_db('MM_db'); 
$retval = mysql_query($sql, $conn); 
if(! $retval) 
{ 
    die('Could not load data : ' . mysql_error()); 
} 
echo "Loaded data successfully\n"; 
mysql_close($conn); 
fclose($handle); 
    } 
    ?> 
    <script> 
    alert('Items Uploaded Successfully'); 
    </script> 
    <?php 
exit(); 
     } 
    } 

Lorsque vous effectuez le téléchargement, je reçois cette erreur:

Could not load data : File 'c:\wamp\bin\mysql\mysql5.5.24\data\MM_db\items.sql' not found (Errcode: 2) 

Son comme il n'a pas trouvé mon fichier items.sql, bien que j'ai vérifié si c'est là ou non en faisant file_exists($backup_file), mais je suis toujours confronté à ce problème. Je pense qu'il pourrait y avoir quelque chose qui manque avec le code de téléchargement de fichier? S'il vous plaît aidez-moi les gars! LOAD DATA INFILE ne peut pas exécuter les instructions SQL trouvées dans un script SQL.

+0

Veuillez ne pas faire ceci. Vous avez le contrôle d'accès ** zéro ** ici. Si quelque chose vous devriez utiliser [phpMyAdmin] (http://www.phpmyadmin.net/home_page/index.php) au lieu de rouler le vôtre. Rappelez-vous que "LOAD DATA INFILE" doit avoir le fichier sur le serveur MySQL, pas sur le serveur web. – tadman

+0

@tadman Désolé, mais vous avez tort, Si je remplace la valeur '$ backup_file' dans un chemin de fichier spécifique - Exemple' C:/items.sql' Et supprimer le téléchargement du fichier entier ... Cela fonctionnera comme un charme, mais J'aime prendre les choses de manière plus stimulante! –

+0

Ce chemin doit être sur la même machine que le processus du serveur MySQL. Peut-être que c'est la même machine dans ce cas. – tadman

Répondre

1

Il s'attend à ce que le fichier contienne des données de texte avec des options pour les symboles comme séparateurs et délimiteurs. Il ne reconnaît pas les instructions SQL. Si vous utilisez LOAD DATA INFILE sur un script SQL, vous chargez uniquement les instructions SQL de texte dans votre base de données, ce qui est assez différent de l'exécution des instructions SQL elles-mêmes.

Si vous devez exécuter des instructions SQL dans un script, vous pouvez trouver du code dans l'application phpMyAdmin. Dupliquer cette fonctionnalité à partir de zéro est beaucoup plus difficile que ça en a l'air. Voir des exemples à ce sujet dans mes réponses à:

La meilleure solution est d'exécuter un script SQL en utilisant shell_exec() pour lancer le client MySQL avec le script SQL de téléchargement en entrée .

Mais @tadman a raison, c'est une chose dangereuse et non sécurisée, permettant à l'utilisateur d'envoyer un script SQL que vous exécutez mot pour mot. Vous ne pouvez pas savoir quelles requêtes malveillantes ils vont inclure dans ce fichier de script!