Upload de fichiers dans une table Mysql

Eléphanteau du PHP | 39 Messages

19 mars 2011, 17:25

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

ViPHP
ViPHP | 5462 Messages

19 mars 2011, 18:44

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

Eléphanteau du PHP | 39 Messages

19 mars 2011, 19:37

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?

ViPHP
ViPHP | 5462 Messages

19 mars 2011, 19:43

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

Eléphanteau du PHP | 39 Messages

20 mars 2011, 01:05

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.

devlop78
Invité n'ayant pas de compte PHPfrance

20 mars 2011, 03:20

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,

Eléphanteau du PHP | 39 Messages

20 mars 2011, 12:35

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.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

20 mars 2011, 13:50

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 :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 39 Messages

20 mars 2011, 14:05

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.

Eléphanteau du PHP | 39 Messages

20 mars 2011, 18:04

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.

ViPHP
AB
ViPHP | 5818 Messages

20 mars 2011, 20:25

Concernant l'upload de fichiers il y a un tuto ici
Et une classe d'upload prête à l'emploi ici

Eléphanteau du PHP | 39 Messages

20 mars 2011, 21:52

Merci ça va m'être d'une grande aide! :D

Eléphanteau du PHP | 39 Messages

23 mars 2011, 15:32

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.
Modifié en dernier par damien01 le 23 mars 2011, 16:34, modifié 1 fois.

DBU
Eléphanteau du PHP | 42 Messages

23 mars 2011, 16:17

C'est justement ce que je cherche à Faire.
Peux-tu partager ta science ?

Merci

Eléphanteau du PHP | 39 Messages

23 mars 2011, 16:28

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.