Page 1 sur 2

Upload de fichiers dans une table Mysql

Posté : 19 mars 2011, 17:25
par damien01
Bonjour,

Je n'arrive pas à finaliser ma fonction php qui a pour but d'uploader dans une base de données mysql des fichiers transmis à partir d'un formulaire.
function upload_file() {
?>
<div class="contenu">
	<font size="3" color="green">Upload de fichiers:</font><br /><br />
	<form method="post" enctype="multipart/form-data" action="#">
		<font size="2" color="#2A65A1"><label for="mon_fichier">Fichier (tous formats | max. 4 Go) :</label></font>
	  	<input style="color:#2A65A1" type="hidden" name="MAX_FILE_SIZE" value="4294967295"/>
                <input style="color:green" type="file" name="form_data" id="mon_fichier" /><br /><br />
                <input style="color:#2A65A1" type="submit" name="upload" value="Envoyer" />
       </form>   
<?php
	if(!empty($_POST['upload']))
	{
		include('includes/connexionBdd.php');
		$data = addslashes(fread(fopen($form_data, "r"), filesize($file_data))); 
		MYSQL_QUERY("INSERT INTO upload (name, type, size, content, user) ". "VALUES ('".$form_data_name."','".$form_data_type."','".$form_data_size."','".$data."','".$_SESSION['name']."')") or die ('Erreur SQL !'.mysql_error()); 
		$id= mysql_insert_id(); 
	}
	echo '</div>';	
}
Je me suis inspiré de cette documentation: http://php.about.com/od/advancedphp/ss/ ... upload.htm

Ma table 'upload' est sous cette forme:

+---------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+----------------+
| id      | int(11)     | NO   | PRI | NULL    | auto_increment |
| name    | varchar(30) | NO   |     | NULL    |                |
| type    | varchar(30) | NO   |     | NULL    |                |
| size    | int(11)     | NO   |     | NULL    |                |
| content | longblob    | NO   |     | NULL    |                |
| user    | varchar(20) | YES  |     | NULL    |                |
+---------+-------------+------+-----+---------+----------------+
Actuellement je n'ai pas d'erreurs mais le contenu n'est pas uploader. La table upload quant à elle n'est pas affecté à chaque tentatives: sur les 4 tentatives, seulement deux INSERT ont été exécuté et tout les champs ne sont pas remplis:
+----+------+------+------+---------+-------+
| id | name | type | size | content | user  |
+----+------+------+------+---------+-------+
|  1 |      |      |    0 |         | admin |
|  2 |      |      |    0 |         | admin |
+----+------+------+------+---------+-------+
En espérant votre aide, Merci :D .
@ bientôt

Re: Upload de fichiers dans une table Mysql

Posté : 19 mars 2011, 18:44
par stealth35
je te déconseille de faire ca, met plutôt le fichier dans un dossier et dans ta base le chemin qui pointe vers le fichier,
je te conseil aussi de "modernisé" ton code, le HTML et le PHP sont obsolètes

Re: Upload de fichiers dans une table Mysql

Posté : 19 mars 2011, 19:37
par damien01
Tout d'abord merci de ta réponse.
Pourrais tu être plus précis par obsolète?? utiliser PDO?
On gagne au niveau sécurité? performance?

Sinon pour l'upload dans mysql, quels proches fais tu exactement?

Re: Upload de fichiers dans une table Mysql

Posté : 19 mars 2011, 19:43
par stealth35
mysql_* est une vielle extension (tableau à la fin : http://fr2.php.net/manual/fr/mysqli.overview.php)

tu gagneras largement en performance, a ne pas mettre les fichiers dans base

Re: Upload de fichiers dans une table Mysql

Posté : 20 mars 2011, 01:05
par damien01
Bien, sur vos conseils j'ai procédé à un grand remaniement, à savoir l'utilisation de 'mysqli'.

C'est un hors sujet vis à vis du post initial mais maintenant j'ai certaines fonctions qui ne marchent plus. :s

Par exemple:
//Contrôle si un le nom d'utilisateur existe déjà
// @ retourne true si disponible
// @ retourne flase si indisponible
function control_iduser($user){
	if(mysqli_num_rows(mysqli_query($bdd, "SELECT * from users where iduser = '".$user."'"))) return false;
	if(!mysqli_num_rows(mysqli_query($bdd, "SELECT * from users where iduser = '".$user."'"))) return true;
}
Cette même fonction marchait précédemment!

Après plusieurs tests, je m’aperçois que le mysqli_num_row() ne me retourne rien! Les autres fonctions qui bugs également utilisent la même fonction mysqli J'aimerais vos conseils.

Bonne soirée.

Re: Upload de fichiers dans une table Mysql

Posté : 20 mars 2011, 03:20
par devlop78
il faut surtout échapper proprement tes données avec les méthodes données par l'extension se connectant à ton SGBD et adaptée à ce dernier. Faire un simple insert sans échappement, c'est finalement assez normal que ça ne fonctionne pas vu que l'échappement des caractère NULL ' " et autres ne se font pas (ou alors on ne le voit pas ici) et sont poutant grandement présent dans du code binaire.

Par ailleurs :

Code : Tout sélectionner

if(mysqli_num_rows(mysqli_query($bdd, "SELECT * from users where iduser = '".$user."'"))) return false; if(!mysqli_num_rows(mysqli_query($bdd, "SELECT * from users where iduser = '".$user."'"))) return true;
L'extension mysqli est différente de mysql, notamment avec la possibilité d'utiliser l'objet. Et plus précisemment pour ton code, il y a plusieurs points importants :

- if / else offre une possibilité en plus aux simples if if.
- Ici, tu executes deux fois une requêtes, là où un if else n'en executerait qu'une.
- Ici, tu fais un SELECT * alors même que tu ne récupères pas la ressource dans une variable.
- Ici, tu ne dissocies pas le retour FALSE du retour 0 renvoyé par mysqli_num_rows

Je ne peux donc que te suggérer pour ma part de lire des docs sur les conditions, les boucles etc sur php si nécessaire, et surtout de lire la documentation et de regarder les exemples d'utilisation de l'extension de mysqli.

Cordialement,

Re: Upload de fichiers dans une table Mysql

Posté : 20 mars 2011, 12:35
par damien01
Merci pour vos conseils. :)

Bien, avec le code ci-dessous ça fonctionne:
function control_iduser($user){
	include('includes/connexionBdd.php');
	$req = mysqli_query($bdd,"SELECT * from users where iduser = '".$user."'");
	if(!$req)
	{
		echo "Impossible d'exécuter la requête! " . mysqli_error();
   	        exit;
	}
	else 
	{
		$req_rows = mysqli_num_rows($req);
		//echo '<br /> nb row: ' . $req_rows; 
		if($req_rows == '0') {return TRUE;}
		else {return FALSE;}
	}
        mysqli_free_result($req);
}
Si vous voyez des défauts, ou des améliorations possibles dans ce code je suis preneur. :d

Bonne journée.

Re: Upload de fichiers dans une table Mysql

Posté : 20 mars 2011, 13:50
par Ryle
Si ton code a simplement pour objectif de vérifier la présence d'un enregistrement en base, évite le "SELECT * " qui va ramener tous les champs des enregistrement trouvés, alors que tout ce qui t'intéresse c'est leur nombre :)

Pour optimiser cela, tu peux utiliser la fonction COUNT de SQL, qui retourne uniquement le nombre de résultat sans données superflues :
$req = mysqli_query($bdd,"SELECT COUNT(*) AS nb FROM users WHERE iduser = '".$user."'");
        if(!$req)
        {
                echo "Impossible d'exécuter la requête! " . mysqli_error();
                exit;
        }
        else 
        {
                $req_rows = mysqli_fetch_assoc($req);
                //echo '<br /> nb row: ' . $req_rows['nb']; 
                if ($req_rows['nb'] == 0) {return TRUE;}
                else {return FALSE;}
        }
Enfin, je suis du même avis que stealth35 concernant la gestion des fichiers. Ceux-ci ne devraient être stockés en base que si tu as besoin de faire des recherches ou des comparaisons binaires de fichiers... Pour le reste, rien ne vaut le système de fichier, tandis qu'en base tu conserves juste l'emplacement du fichier sur le disque :)

Re: Upload de fichiers dans une table Mysql

Posté : 20 mars 2011, 14:05
par damien01
C'est pas bête! :D
Merci bien! Je suis désolé pour toutes ces erreurs, je suis issu de formations réseaux et n'ai pas grandes expériences en développement.

Je vais maintenant me recentrer sur mon upload de fichiers.

Re: Upload de fichiers dans une table Mysql

Posté : 20 mars 2011, 18:04
par damien01
Bien! les ennuis continus.

J'ai un problème tout autre maintenant avec ma fonction upload :s.

Voici mon code:
<div class="contenu">
	<font class="title" >Upload de fichiers:</font><br /><br />
	<form method="post" enctype="multipart/form-data" action="#">
		<input type="hidden" name="MAX_FILE_SIZE" value="4294967295"/>
                <input type="file" name="file" id="file" /><br /><br />
                <input type="submit" name="upload" value="Envoyer" />
        </form>
        <pre><?php  print_r($_FILES); ?></pre>   
</div>	
Lorsque je saisis un fichier et procède à l'upload de ce dernier, print_r me retourne un tableau vide! :s:s
Je pense donc que la source du problème est dans la configuration du php.ini? J'aimerais connaitre vos avis.

Re: Upload de fichiers dans une table Mysql

Posté : 20 mars 2011, 20:25
par AB
Concernant l'upload de fichiers il y a un tuto ici
Et une classe d'upload prête à l'emploi ici

Re: Upload de fichiers dans une table Mysql

Posté : 20 mars 2011, 21:52
par damien01
Merci ça va m'être d'une grande aide! :D

Re: Upload de fichiers dans une table Mysql

Posté : 23 mars 2011, 15:32
par damien01
Bonjour,

J'ai enfin réussi à créer ma fonction upload. Je vous remercie de vos conseils.
J'ai seulement une dernière question avant de clore ce post.
Dans mon cas, des utilisateurs peuvent être amenés à uploader des fichiers de tous genres.

Comment alors éviter, par exemple, l'exécution d'un fichier PHP uploader, si un utilisateur ayant de mauvaises intentions, saisit le chemin du fichier dans l'URL?
Si je bloque au niveau des droits je supprime l'upload, d'après ce que j'ai pu constater.

Avez vous des idées?

Bonne journée.

Re: Upload de fichiers dans une table Mysql

Posté : 23 mars 2011, 16:17
par DBU
C'est justement ce que je cherche à Faire.
Peux-tu partager ta science ?

Merci

Re: Upload de fichiers dans une table Mysql

Posté : 23 mars 2011, 16:28
par damien01
je veux bien te présenter mon code mais sache que je ne passe pas par mysql, juste une upload dans un répertoire, d'ou mon dernier post.