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 :

Demande d'aide pour script PHP qui associe des produits à une catégorie sous Prestashop via fichier CSV


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Infographiste, Webdesigner
    Inscrit en
    Juillet 2012
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Infographiste, Webdesigner
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juillet 2012
    Messages : 109
    Par défaut Demande d'aide pour script PHP qui associe des produits à une catégorie sous Prestashop via fichier CSV
    Bonjour à tous et à toutes,

    Je m'occupe d'un site Internet qui tourne sous Prestashop.
    J'ai récupéré un script qui permet de manipuler une BDD (SELECT, UPDATE, INSERT, DELETE ...) par l'intermédiaire d'un fichier CSV.
    Je voudrais le modifier pour pouvoir associer plusieurs produits à une catégorie.

    Pour info :
    - La table où on associe un/des produit(s) à une catégorie s'appelle ps_category_product
    - Il y a 3 colonnes dans cette table (et aussi dans le fichier CSV) :
    - id_category
    - id_product
    - position

    Dans un premier temps, ce que je souhaiterai faire, c'est que, pour chaque ligne du fichier CSV, PHP teste si la catégorie existe bien en BDD. Sinon => message erreur "La catégorie n'existe pas" + arrêt du script.
    Voici le script en question :
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    <?
     
    include(dirname(__FILE__).'/../../config/config.inc.php');
    require(dirname(__FILE__).'/../../init.php');
     
    error_reporting(E_ALL);
    ini_set('display_errors', true);
     
    $fileName = 'category.csv';
    $lineHandler = 1; 
    $arrayQuery = array();
    $fieldSeparator = ";";
    $row = 0;
    $arrayKeys = array();
    $arrayCategory = array();
     
    // IMPORTANT : Customizable vars
    $id_category = 'id_category';
     
    /**
     * Part 1 : translate csv to array.
     *
    */
     
    if (($handle = fopen($fileName, "r")) !== FALSE)
        {
        while (($data = fgetcsv($handle, 1000, $fieldSeparator)) !== FALSE) {
    		$num = count($data);$row++;
    		if($row == 1)
    			for ($c=0; $c < $num; $c++) {
    				$arrayKeys[] = $data[$c];
    			}
    		else
    		{
    			$arrayCursor = array();
    			for ($c=0; $c < $num; $c++) {
    				$arrayCursor[$arrayKeys[$c]] = $data[$c];
    			}
    			array_push($arrayCategory, $arrayCursor);
    		}
        }
        fclose($handle);
    	/**
    	 * Part 2 : array treatment.
    	 *
    	*/
    	foreach ($arrayCategory as $category)
    	{
    		if ( !empty($category[$id_category])) 
    		{
     
    		}
    		else
    		{
    			exit;
    		}
    	}
    }
    Comment faire pour vérifier que (l'id de) la catégorie existe bien dans la BDD, dans la table ps_category_product ?
    Bien sûr, je pourrais aller en BDD et le vérifier par moi-même, mais je pose la question pour "sécuriser" mon script, pour ne pas avoir à vérifier à chaque fois et aussi, et surtout, pour l'exercice et apprendre PHP car pour le moment, je suis débutant en la matière.
    Pouvez-vous m'aider SVP à rédiger ce script ?

    D'avance merci.
    Bonne journée

  2. #2
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Tu peux charger la liste des catégories disponibles dans un tableau au début du script et ensuite vérifier pour chaque ligne du CSV que la catégorie est bien présente dans le tableau.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  3. #3
    Membre confirmé
    Homme Profil pro
    Infographiste, Webdesigner
    Inscrit en
    Juillet 2012
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Infographiste, Webdesigner
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juillet 2012
    Messages : 109
    Par défaut
    Ne trouvant pas la solution tout seul, j'ai demandé à un copain programmeur.
    Je l'embête assez régulièrement, donc généralement j'essaye de trouver tout seul.
    Bref...
    (Pour ceux que ça intéressent) Il m'a donné la solution suivante, en passant par un objet, pour vérifier, au début de mon script, si une donnée (en l'occurrence si une catégorie) existe en BDD :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $categoryObject = new Category($category[$id_category]);
     
    		if (!\Validate::isLoadedObject($categoryObject))
    		{
    		echo '<strong>Attention :</strong> La catégorie ' . (int)$category[$id_category] . ' n\'existe pas.</br>';
    		exit;
    		}
    J'en ai également profité pour vérifier que le produit existait bien lui aussi. C'est idiot, mais encore une fois, c'est pour l'exercice.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $productObject = new Product($category[$id_product]);
     
    		if (!\Validate::isLoadedObject($productObject))
    		{
    		echo '<strong>Attention :</strong> Le produit ' . (int)$category[$id_product] . ' n\'existe pas.</br> Crée-le et recommence.</br>';
    		exit;
    		}
    Comme on peut le voir, on peut nommer la variable (ici $categoryObject ou $productObject) comme on veut. On n'est même pas obligé d'ajouter le suffixe Object.

    Sinon (pour continuer), comme j'importe les données d'un fichier CSV qui est converti en array, je fais un boucle où je demande qu'il fasse telle et telle action (ici vérifier si la catégorie et le produit existent) pour chaque ligne du fichier CSV.
    En code, voici ce que ça donne au final :
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    <?
     
    include(dirname(__FILE__).'/../../config/config.inc.php');
    require(dirname(__FILE__).'/../../init.php');
     
    error_reporting(E_ALL);
    ini_set('display_errors', true);
     
    $fileName = 'category.csv';
    $lineHandler = 1; 
    $arrayQuery = array();
    $fieldSeparator = ";";
    $row = 0;
    $arrayKeys = array();
    $arrayCategory = array();
     
    // IMPORTANT : Customizable vars
    $id_category = 'id_category';
    $id_product = 'id_product';
     
    /**
     * Part 1 : translate csv to array.
     *
    */
     
    if (($handle = fopen($fileName, "r")) !== FALSE) {
        while (($data = fgetcsv($handle, 1000, $fieldSeparator)) !== FALSE) {
    		$num = count($data);$row++;
    		if($row == 1)
    			for ($c=0; $c < $num; $c++) {
    				$arrayKeys[] = $data[$c];
    			}
    		else
    		{
    			$arrayCursor = array();
    			for ($c=0; $c < $num; $c++) {
    				$arrayCursor[$arrayKeys[$c]] = $data[$c];
    			}
    			array_push($arrayCategory, $arrayCursor);
    		}
        }
        fclose($handle);
    	/**
    	 * Part 2 : array treatment.
    	 *
    	*/
    	foreach ($arrayCategory as $category)
    	{
    		/*On vérifie que la catégorie existe bien en BDD*/
    		$categoryObject = new Category($category[$id_category]);
     
    		if (!\Validate::isLoadedObject($categoryObject))
    		{
    		echo '<strong>Attention :</strong> La catégorie ' . (int)$category[$id_category] . ' n\'existe pas.</br>';
    		exit;
    		}
    		/*On vérifie que le produit existe bien en BDD*/
    		$productObject = new Product($category[$id_product]);
     
    		if (!\Validate::isLoadedObject($productObject))
    		{
    		echo '<strong>Attention :</strong> Le produit ' . (int)$category[$id_product] . ' n\'existe pas.</br>';
    		exit;
    		}
    	}
    }

  4. #4
    Membre confirmé
    Homme Profil pro
    Infographiste, Webdesigner
    Inscrit en
    Juillet 2012
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Infographiste, Webdesigner
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juillet 2012
    Messages : 109
    Par défaut
    Bonjour à tous et à toutes,

    J'ai continué dans l'écriture de mon script pour associer des produits à une catégorie sous Prestashop, via un fichier CSV.
    Voici ce que j'ai mis comme code, dans une boucle foreach :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    /*On récupère la dernière position du produit de telle catégorie*/
        $lastposition = "SELECT max(position) FROM `ps_category_product` WHERE `id_category`=" . $category[$id_category];
        /*Si il n'y a pas de produit, associe le produit à la catégorie et attribue-lui la position 0*/
        if (Db::getInstance()->execute('SELECT max(position) FROM `ps_category_product` WHERE `id_category`=' . $category[$id_category]== NULL)){
          Db::getInstance()->execute('INSERT INTO `ps_category_product` (`id_category`, `id_product`, `position`) VALUES (' . (int)$category[$id_category] . ',' . (int)$category[$id_product] . ',0)');
        }
        /*Sinon, associe le produit à la catégorie et attribue-lui la dernière position +1*/
        else {
          Db::getInstance()->execute('INSERT INTO `ps_category_product` (`id_category`, `id_product`, `position`) VALUES (' . (int)$category[$id_category] . ',' . (int)$category[$id_product] . ',' . $lastposition+1 . ')');
                }
        $lastposition++;
    Quand j'exécute mon script, ça ne fonctionne pas.
    Vous auriez une idée du pourquoi SVP ?
    D'avance merci pour votre réponse.

    Bonne journée

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/09/2014, 19h29
  2. Réponses: 16
    Dernier message: 06/11/2010, 13h34
  3. Recherche d'un script PHP pour renommer des fichiers en masse
    Par pekka77 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 19/11/2006, 23h43
  4. [Galerie] Cherche un script php pour avoir une galerie de photos
    Par Nimajneb dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 03/08/2006, 10h19
  5. Réponses: 2
    Dernier message: 26/07/2006, 12h46

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