IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Upload photo dans répertoire via mysql


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2011
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 17
    Par défaut Upload photo dans répertoire via mysql
    Bonjour,

    Je ne trouve pas depuis quelques temps, je cherche à permettre à mes clients d'une boutique d'uploader leurs photos.
    J'aimerais que les photos soient stockées dans un répertoire de mon serveur et que la photo uploadée soit associée dans un champs de ma table suivante pour qu'elle corresponde au client qui l'a uploadé :

    id_customer id_gender email passwd birthday lastname newsletter firstname

    Ou alors dans une autre table et la lier à la table au dessus.
    De ce fait je pourrais afficher où je veux la photo en fonction du client sur mon site. D'après le même système que les avatars.

    Le problème c'est que je ne vois vraiment pas comment je pourrais faire car je ne m'y connais pas assez en php/mysql pour écrire moi même le code. Donc si vous pourriez m'aider ou si vous connaissez un script déjà existant...

    Merci d'avance si vous preniez le temps de m'aider car je ne trouve pas.

  2. #2
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Hello

    Ce que tu cherches à faire est assez simple; il te faut une table users et une table users_files ou tu stocke l'id de l'utilisateur et le path du fichier (si tu peux stocker le mime et des commentaires c'est encore mieux).

    Images attachées Images attachées  

  3. #3
    Membre averti
    Inscrit en
    Janvier 2011
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 17
    Par défaut
    Ok merci infiniment pour cette réponse détaillée. Je comprends mieux grâce à ton schéma.
    J'ai déjà ma table customers, le problème c'est que je ne comprends pas comment faire ça :

    une table users_files ou tu stocke l'id de l'utilisateur et le path du fichier
    Enfin je ne comprends pas comment je peux lier les 2 tables et stocker le path dans la bdd.
    D'autant que ça se complique beaucoup plus étant donné que la boutique (Prestashop) utilise le smarty et que le mieux serait de ne pas toucher aux fichiers core system. J'suis un peu perdu

    Ton tuto sur SDZ m'est vraiment très utile mais j'ai entendu dire qu'il pouvait y avoir des failles de sécurité ?!

  4. #4
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Enfin je ne comprends pas comment je peux lier les 2 tables et stocker le path dans la bdd.
    C'est le champ users_id de la table users_files qui assure la relation. Cette relation caractérise par ailleurs une cardinalité 1-n (1 utilisateur à n fichiers).
    On peut (et je te le recommande) sécuriser cette association au moyen d'une contrainte sur la clé étrangère users_id - une clé étrangère est un attribut d'une table qui provient d'une autre table, dans notre exemple, users_id est en fait l'attribut id de la table users, on doit donc s'assurer que chaque users_id présent dans users_files, on a bien un id correspondant dans la table users, sinon on risque de se retrouver avec des entrées orphelines dans la table users_id.

    D'autant que ça se complique beaucoup plus étant donné que la boutique (Prestashop) utilise le smarty et que le mieux serait de ne pas toucher aux fichiers core system. J'suis un peu perdu
    Tu aurais dû poster dans la section Prestashop au lieu de PHP/MySQL. Remarque, je ne comprends pas en quoi une gestion des images pour tes utilisateurs fait partie de ta boutique ? ça devrait être un module indépendant de prestashop non ? Je te déconseille de tout mettre dans le même sac; je te recommande plutôt de faire ton site de façon à avoir
    - mon site
    - page utilisateurs > gestion des images
    - boutique
    - une autre section (blog par exemple)

    Ton tuto sur SDZ m'est vraiment très utile mais j'ai entendu dire qu'il pouvait y avoir des failles de sécurité ?!
    En effet, il t'appartient de t'assurer qu'un utilisateur malveillant ne puisse pas envoyer des fichiers exécutables sur le serveur par exemple ou des fichiers de nature à empêcher les autres utilisateur d'utiliser le service correctement (XSS). C'est relativement simple en fait, tu dois juste vérifier que le fichier que tu reçoit n'est pas un .cgi / .php etc. Le renommer systématiquement avant d'enregistrer son emplacement en BDD est également une façon de se protéger (ça peut se faire très simplement avec move_uploaded_file).

    -- Edit: voici ce à quoi devrait ressembler ton SQL de création des tables:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
    SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
    SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';
     
    -- -----------------------------------------------------
    -- Table `users`
    -- -----------------------------------------------------
    CREATE  TABLE IF NOT EXISTS `users` (
      `id` BIGINT(25) NOT NULL AUTO_INCREMENT ,
      `surname` VARCHAR(90) NOT NULL ,
      `name` VARCHAR(90) NOT NULL ,
      `password` VARCHAR(45) NOT NULL ,
      `birthday` DATE NULL ,
      PRIMARY KEY (`id`) )
    ENGINE = InnoDB;
     
    -- -----------------------------------------------------
    -- Table `users_files`
    -- -----------------------------------------------------
     
    CREATE  TABLE IF NOT EXISTS `users_files` (
      `id` BIGINT(25) NOT NULL AUTO_INCREMENT ,
      `path` VARCHAR(125) NOT NULL ,
      `mime` VARCHAR(15) NULL ,
      `comment` TEXT NULL ,
      `users_id` BIGINT(25) NOT NULL ,
      PRIMARY KEY (`id`) ,
      INDEX `fk_users_files_users` (`users_id` ASC) ,
      CONSTRAINT `fk_users_files_users`
        FOREIGN KEY (`users_id` )
        REFERENCES `users` (`id` )
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    ENGINE = InnoDB;
     
    SET SQL_MODE=@OLD_SQL_MODE;
    SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
    SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

  5. #5
    Membre averti
    Inscrit en
    Janvier 2011
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 17
    Par défaut
    Merci beaucoup je suppose qu'avec ce que tu m'as donné en SQL, la relation est déjà intégré car c'est en partie ce que je n'arrivais pas à faire.

    Je n'avais pas vu qu'il y avait une rubrique Prestashop, en fait j'essaie de créer mon propre module qui puisse ajouter la gestion des images. Pour tout te dire j'essaie d'insérer un mini réseau social à la boutique (avatar, friend requests,...) mais le tout incorporé à ma boutique.

    J'ai appris à créer un module sous Prestashop mais je ne comprends pas techniquement comment je pourrais le réaliser.
    Car un module Prestashop c'est : un folder (module) qui contient en général module.php et module.tpl qui est le fichier template mais qui contient aussi du php et du html.
    Je vais déjà essayer de modifier ma table SQL customers avec ce que tu m'as donné.
    Je ne saurais comment te remercier

  6. #6
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    je suppose qu'avec ce que tu m'as donné en SQL, la relation est déjà intégré
    En réalité, une relation entre deux tables se fait de manière logique. On peut cependant leur donner une existence concrète en utilisant des FOREIGN KEY et des CONSTRAINT sur ces clés:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    INDEX `fk_users_files_users` (`users_id` ASC) , >> Notre clé étrangère
    CONSTRAINT `fk_users_files_users` >> Notre contrainte sur cette clé
      FOREIGN KEY (`users_id` )
      REFERENCES `users` (`id` )
    Pour tout te dire j'essaie d'insérer un mini réseau social à la boutique (avatar, friend requests,...) mais le tout incorporé à ma boutique.
    Ok, pourquoi pas.

    Pour t'aider voici un exemple de requête qui liste les fichiers uploadés par un utilisateur (qu'on connait par son name):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT u.`id`, u.`name`, u.`surname`, f.`path`, f.`mime`, f.`comment`
    FROM users AS u JOIN users_files AS f ON (f.users_id=u.id)
    WHERE u.name='$username';
    Un code tout simple pour tester ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    <?php
    header('Content-Type: text/plain');
     
    $connection = mysql_connect("localhost","root","") or die("Cannot open mysql connection");
    mysql_select_db("UserFiles");
     
    $username = "Charles";
     
    $query = "SELECT u.`id`, u.`name`, u.`surname`, f.`path`, f.`mime`, f.`comment`".
             " FROM `users` AS u JOIN `users_files` AS f ON (f.`users_id`=u.`id`)".
    		 " WHERE u.name='$username'";
     
    if ($results = mysql_query($query))
    {
    	while ($row = mysql_fetch_assoc($results))
    	{
    		var_dump($row);
    	}
    }
    else
    {
    	$err = mysql_error();
    	var_dump($err);
    }
    (j'ai mis le jeu d'essai en pièce jointe)

    Produit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    array(6) {
      ["id"]=>
      string(1) "1"
      ["name"]=>
      string(7) "Charles"
      ["surname"]=>
      string(6) "Dubois"
      ["path"]=>
      string(34) "/var/www/mon_site/upload/file1.jpg"
      ["mime"]=>
      string(10) "image/jpeg"
      ["comment"]=>
      string(22) "Un commentaire stupide"
    }
    array(6) {
      ["id"]=>
      string(1) "1"
      ["name"]=>
      string(7) "Charles"
      ["surname"]=>
      string(6) "Dubois"
      ["path"]=>
      string(34) "/var/www/mon_site/upload/file2.jpg"
      ["mime"]=>
      string(10) "image/jpeg"
      ["comment"]=>
      string(28) "Un autre commentaire stupide"
    }
    On va d'ailleurs se simplifier le travail en utilisant une vue.
    Avec MySQL, comme avec la plupart des SGBD relationnelles, il est possible de créer des vues de données pour abstraire la complexité de certaines requêtes. Dans notre cas, on va s'en servir pour faciliter la requête que je viens de te donner:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CREATE VIEW get_users_files AS 
    SELECT u.`id` , u.`name` , u.`surname` , f.`path` , f.`mime` , f.`comment`
    FROM `users` AS u
    JOIN `users_files` AS f ON ( f.`users_id` = u.`id` )
    On va désormais pouvoir faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM get_users_files WHERE name = "Peter"
    Tout simplement comme s'il s'agissait d'une table. En réalité, on a créé en quelque sorte une macro.
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. [AC-2010] Chercher photos dans répertoire
    Par pounette dans le forum VBA Access
    Réponses: 18
    Dernier message: 13/12/2013, 14h06
  2. Upload fichier dans répertoire défini ?
    Par Le Mad dans le forum VB.NET
    Réponses: 4
    Dernier message: 08/06/2009, 14h35
  3. Introduire une photo dans une base mysql
    Par laurentche dans le forum Requêtes
    Réponses: 5
    Dernier message: 02/04/2009, 17h44
  4. Insérer des images dans flash via Mysql
    Par lbbarrere dans le forum Intégration
    Réponses: 0
    Dernier message: 09/04/2008, 19h49
  5. inserer des photos dans une bdd mysql
    Par oceane751 dans le forum Requêtes
    Réponses: 3
    Dernier message: 20/05/2006, 20h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo