Problème if else et requête SQL

Merevihn
Invité n'ayant pas de compte PHPfrance

20 mars 2013, 11:07

Bonjour, j'ai un problème sur ma condition, elle n'effectue pas ce que je veux. Mon programme arrive a lire mon fichier CSV dont voici un petit exemple :

"Sacs en Papier","Sac Papier - poignées plates","DPL002","80 grs Blanc","22 + 10 x 31 cm","blanc","€ 0,19","1","doos","250","1"

"Sacs en Papier","Sac Papier - poignées plates","DPL001","80 grs brun","22 + 10 x 31 cm","brun","€ 0,19","1","doos","250","1"

"Sacs en Plastique",,"DQU007","Poly","30 x 36 cm","Semi Transparant","€ 0,14","1","doos","500","1"

"Sacs en Plastique",,"DQU002","Poly","37 x 44 + 2 x 4 cm","Blanc","€ 0,06","1","doos","500","1"

"Sacs PP Tissés","Big Shopper PP Tissé","DQP001","tissé PP","45 + 18 x 48 cm","Blanc","€ 1,65","1","doos","100","1"

"Sacs PP Tissés",,"DQP002","tissé PP","30 + 13 x 35 cm","Blanc","€ 1,34","1","doos","100","1"

en faisant un var_dump il affiche bien mes données. Comme vous voyez sur cet exemple il y a deux fois "Sacs en Papier", j'ai réussi à faire un if qui dit que si il lit ce nom de colonne il insert une fois la donnée correspondante dans la ma base de données. Mais que je fais commence à faire mon elseif en disant que maintenant cela correspond à "Sacs en Plastique" il ne rentre pas dedans et n'effectue pas la requête. Quelqu'un sait-il pourquoi cela ne marche pas?

Voici mon code php :
<?php

	$bdd="prestashop";
	$host="localhost";
	$user="root";
	$pass="";

	@mysql_connect($host, $user, $pass) or die ("Impossible de se connecter à la base de données");
	@mysql_select_db($bdd);

	$fichier = "./fichier.csv";

	$fichier = $_FILES['userfile']['tmp_name'];
	if (file_exists($fichier)) {
		$fp = fopen($fichier, "r");
	}

	else {
		echo "Fichier introuvable !<br />Importation stoppée.";
		exit();
	}

	$existe = false;
	
	while (!feof($fp)){
		$ligne = fgets($fp,4096);
		$liste = explode( ",",$ligne);
		
		$liste[0] = ( isset($liste[0]) ) ? $liste[0] : Null;
        $liste[1] = ( isset($liste[1]) ) ? $liste[1] : Null;
        $liste[2] = ( isset($liste[2]) ) ? $liste[2] : Null;
        $liste[3] = ( isset($liste[3]) ) ? $liste[3] : Null;
        $liste[4] = ( isset($liste[4]) ) ? $liste[4] : Null;
        $liste[5] = ( isset($liste[5]) ) ? $liste[5] : Null;
        $liste[6] = ( isset($liste[6]) ) ? $liste[6] : Null;
        $liste[7] = ( isset($liste[7]) ) ? $liste[7] : Null;
        $liste[8] = ( isset($liste[8]) ) ? $liste[8] : Null;
        $liste[9] = ( isset($liste[9]) ) ? $liste[9] : Null;
        $liste[10] = ( isset($liste[10]) ) ? $liste[10] : Null;
		
			$champ1=$liste[0];
            $champ2=$liste[1];
            $champ3=$liste[2];
            $champ4=$liste[3];
            $champ5=$liste[4];
            $champ6=$liste[5];
            $champ7=$liste[6];
            $champ8=$liste[7];
            $champ9=$liste[8];
            $champ10=$liste[9];
            $champ11=$liste[10];
		
		$champ1 = str_replace('"', '', $champ1);
		if($champ1 == 'Sacs en Papier' && $existe == false)
		{ 
			$req = mysql_query("insert into ps_category(id_category, id_parent) values('', 2)"); 
			$existe = true;
		}
		elseif($champ1 == 'Sacs en Plastique' && $existe == false)
		{
			$req = mysql_query("insert into ps_category(id_category, id_parent) values(last_insert_id(), 2)");
			$existe = true;
		}
	}

	/*echo"pouet";*/
fclose($fp);
?>

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

20 mars 2013, 23:27

salut,

Commence par alléger ton code, tu peux largement simplifier.

file : pour la lecture du fichier

foreach pour le parcours du tableau

str_getcvs plutot qu'un explode pour récupérer les données d'une ligne.

en gros
<?php
$fileName = 'le fichier';
$file = file($fileName);

foreach($file as $ligne) {
    // le traitement
}

ce qui peux donner (avec PDO)
<?php

try {
	$pdo = new PDO('mysql:host=localhost;dbname=test','test','test');
	$pdo->setAttribute( PDO::ATTR_ERRMODE , PDO::ERRMODE_EXCEPTION );
	$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
	$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
	$pdo->setAttribute (PDO::ATTR_CASE, PDO::CASE_LOWER);
	// Préparation d'une requete sql pour l'insertion
	$prepareInsertr = $pdo->prepare('insert into ps_category (id_parent, nom, description, ref, gram,
			taille, couleur, prix, unnombre,doos,deuxnombre,troisnombre)
			value(:parent, :nom,  :description, :ref, :gram, :taille, :couleur, :prix, :unnombre, :doos, :deuxnombre, :troisnombre)');
	// Préparation d'une requete pour vérifier s'il y a déja une ligne avec le nom "nom"
	$prepareCount = $pdo->prepare('select count(*) as nb from ps_category where nom= :nom');
	// Préparation d'une requete pour récupérer l'id parent
	$prepareGetId = $pdo->prepare('select id_category as idparent from ps_category where nom = :nom');

	$fileName = 'merevihn.csv';
	$file = file($fileName);
	xdebug_var_dump($file);
	// on parcourt les lignes du fichier
	foreach($file as $ligne) {
		// on récupère les infos de la ligne dans un tableau
		$csv = str_getcsv($ligne);
		$prepareCount->bindValue(':nom', $csv[0]);
		$result = $prepareCount->execute();
		if( $result === false ){
			$err = $prepareCount->errorInfo();
			throw new Exception($err[2]);
		}
		else {
			$data = $prepareCount->fetch();
			if($data->nb == 0){
				// insertion avec null
				$prepareInsertr->bindValue(':parent','null');
			}
			else {
				// il y a un parent
				$prepareGetId->bindValue(':nom', $csv[0]);
				$result = $prepareGetId->execute();
				if( $result === false ){
					$err = $prepareCount->errorInfo();
					throw new Exception($err[2]);
				}
				else {
					$data = $prepareGetId->fetch();
					$prepareInsertr->bindValue(':parent',$data->idparent);
				}

			}
			$prepareGetId->closeCursor();
		}
		$prepareCount->closeCursor();

		// on prepare pour l'insertion
		$prepareInsertr->bindValue(':nom',$csv[0]);
		$prepareInsertr->bindValue(':description',$csv[1]);
		$prepareInsertr->bindValue(':ref',$csv[2]);
		$prepareInsertr->bindValue(':gram',$csv[3]);
		$prepareInsertr->bindValue(':taille',$csv[4]);
		$prepareInsertr->bindValue(':couleur',$csv[5]);
		$prepareInsertr->bindValue(':prix',$csv[6]);
		$prepareInsertr->bindValue(':unnombre',$csv[7]);
		$prepareInsertr->bindValue(':doos',$csv[8]);
		$prepareInsertr->bindValue(':deuxnombre', $csv[9]);
		$prepareInsertr->bindValue(':troisnombre', $csv[10]);
		// on execute la requete d'insertion
		$prepareInsertr->execute();
	}
}
catch(Exception $e){
	xdebug_var_dump($e);
}
A toi de voir si la gestion de la parenté est bonne ou pas ;)

pour info la table de test
CREATE TABLE `ps_category` (
	`id_category` INT(11) NOT NULL AUTO_INCREMENT,
	`id_parent` INT(11) NULL DEFAULT NULL,
	`nom` VARCHAR(50) NOT NULL,
	`description` VARCHAR(250) NOT NULL,
	`ref` VARCHAR(10) NOT NULL,
	`gram` VARCHAR(30) NOT NULL,
	`taille` VARCHAR(30) NOT NULL,
	`couleur` VARCHAR(10) NOT NULL,
	`prix` VARCHAR(10) NOT NULL,
	`unnombre` INT(11) NOT NULL DEFAULT '0',
	`doos` VARCHAR(10) NOT NULL,
	`deuxnombre` VARCHAR(10) NOT NULL DEFAULT '100',
	`troisnombre` VARCHAR(10) NOT NULL DEFAULT '1',
	PRIMARY KEY (`id_category`)
);
J'utilise PDO dans ce code pour t'inciter à tester pour préparer l'avenir avant que l'extension Mysql soit supprimée (l'extension mysqli reste utilisable :) )


@+
Il en faut peu pour être heureux ......