bonjour quelqu'un aurait-il un idée?

Petit nouveau ! | 4 Messages

11 janv. 2017, 09:14

Bonjour à tous petit nouveau dans le monde PHP
je vous expose mon problème:
j'ai un fichier brut de type csv que je dois intégrer dans une bdd

Code : Tout sélectionner

6,1,582,446/0 6,1,4,0/3985.6 6,1,206,23/87.45 6,1,1039,4/37.75 6,1,1110,157/0 6,1,32,0/3985.6 6,1,1109,0/2610.25 6,1,138,297/0 6,1,207,7/35.8 6,1,944,07.11.16/08:59:24 6,1,945,07.11.16/18:37:03 6,1,321,207/2024.2 6,1,323,90/1833.8 6,1,324,14/127.6 6,1,445,0/2024.2 6,1,450,0/1961.4 6,1,833,404/1371.25 6,1,834,585/2610.25 6,1,843,116/430.3 6,1,150,1/0 6,1,936,0/0 6,1,301,0/2024.9 6,1,303,0/1833.1 6,1,304,0/127.6 6,1,996,384/1364.25 6,1,1044,0/0.7 6,1,1116,406/2610.25 6,1,80,0/20 6,1,89,0/3.33 6,1,81,0/1371.25 6,1,90,0/71.49 6,1,82,0/2594.35 6,1,91,0/235.85
<?php
	if(($handle = fopen('rapport.csv', 'r')) !== FALSE)
	{
		while(($line = fgetcsv($handle, 0, ',', '\'' )) !== FALSE)
		{
//echo '<pre>';
var_dump($line);
//echo '</pre>';*/
			if(!isset($financier) OR !array_key_exists('codeCaisse', $financier) OR $financier['codeCaisse'] != $line[1])
			{
				if(isset($financier))
				{
					$financiers[] = $financier;
					unset($financier);
				}
				$financier =
				[
					'codeCaisse' => null,
					'decompteZ1' => null,
					'totalChifAffaire' => null,
					'correction' => null,
					'voidReceipt' => null,
					'gcCustomerCount' => null,
					'sansCommission' => null,
					'gcTotalSales' => null,
					'hoteClient' => null,
					'annulation' => null,
					'premiereTransaction' => null,
					'derniereTransaction' => null,
					'totalTiroirPaiement1' => null,
					'totalTiroirPaiement3' => null,
					'totalTiroirPaiement4' => null,
					'totalTiroirPaiement5' => null,
					'totalDevise1Grp1' => null,
					'totalDevise1Grp2' => null,
					'modificateur6' => null,
					'modificateur7' => null,
					'modificateur16' => null,
					'paiement1' => null,
					'paiement3' => null,
					'paiement4' => null,
					'paiement5' => null,
					'modificateur17' => null,
					'venteSurTable' => null,
					'stImposable1' => null,
					'tva1' => null,
					'stImposable2' => null,
					'tva2' => null,
					'stImposable3' => null,
					'tva3' => null,
				];

				$financier['codeCaisse'] = $line[1];
				//$financier['quantity'] = $line[3];
			}

			if($line[2] == '582')
			{
				$key = 'decompteZ1';
			}
			elseif($line[2] == '4')
			{
				$key = 'totalChifAffaire';
			}
			elseif($line[2] == '206')
			{
				$key = 'correction';
			}
			elseif($line[2] == '1039')
			{
				$key = 'voidReceipt';
			}
			elseif($line[2] == '1110')
			{
				$key = 'gcCustomerCount';
			}
			elseif($line[2] == '32')
			{
				$key = 'sansCommission';
			}
			elseif($line[2] == '1109')
			{
				$key = 'gcTotalSales';
			}
			elseif($line[2] == '138')
			{
				$key = 'hoteClient';
			}
			elseif($line[2] == '207')
			{
				$key = 'annulation';
			}
			elseif($line[2] == '944')
			{
				$key = 'premiereTransaction';
			}
			elseif($line[2] == '945')
			{
				$key = 'derniereTransaction';
			}
			elseif($line[2] == '321')
			{
				$key = 'totalTiroirPaiement1';
			}
			elseif($line[2] == '323')
			{
				$key = 'totalTiroirPaiement3';
			}
			elseif($line[2] == '324')
			{
				$key = 'totalTiroirPaiement4';
			}
			elseif($line[2] == '325')
			{
				$key = 'totalTiroirPaiement5';
			}
			elseif($line[2] == '445')
			{
				$key = 'totalDevise1Grp1';
			}
			elseif($line[2] == '450')
			{
				$key = 'totalDevise1Grp2';
			}
			elseif($line[2] == '833')
			{
				$key = 'modificateur6';
			}
			elseif($line[2] == '834')
			{
				$key = 'modificateur7';
			}
			elseif($line[2] == '843')
			{
				$key = 'modificateur16';
			}
			elseif($line[2] == '301')
			{
				$key = 'paiement1';
			}
			elseif($line[2] == '303')
			{
				$key = 'paiement3';
			}
			elseif($line[2] == '304')
			{
				$key = 'paiement4';
			}
			elseif($line[2] == '305')
			{
				$key = 'paiement5';
			}
			elseif($line[2] == '996')
			{
				$key = 'modificateur17';
			}
			elseif($line[2] == '1116')
			{
				$key = 'venteSurTable';
			}
			elseif($line[2] == '80')
			{
				$key = 'stImposable1';
			}
			elseif($line[2] == '89')
			{
				$key = 'tva1';
			}
			elseif($line[2] == '81')
			{
				$key = 'stImposable2';
			}
			elseif($line[2] == '90')
			{
				$key = 'tva2';
			}
			elseif($line[2] == '82')
			{
				$key = 'stImposable3';
			}
			elseif($line[2] == '91')
			{
				$key = 'tva3';
			}
			if(isset($key))
			{
				$financier[$key] = (float) $line[4];
				unset($key);
			}
		}
	}
	fclose($handle);

	var_dump($financier);//exit;
	//	Connexion à la base de données
	$connection = new PDO
	(
		'mysql:host=localhost;dbname=vectron;charset=utf8',
		'root',
		'troiswa',
		[
			PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
			PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
		]
	);
	foreach($financier AS $finance)
	{
		$query = 
		'INSERT INTO
			financier
			(
				codeCaisse,
				decompteZ1,
				totalChifAffaire,
				correction,
				voidReceipt,	
				gcCustomerCount,
				sansCommission,
				gcTotalSales,
				hoteClient,
				annulation,
				premiereTransaction,
				derniereTransaction,
				totalTiroirPaiement1,
				totalTiroirPaiement3,
				totalTiroirPaiement4,
				totalTiroirPaiement5,
				totalDevise1Grp1,
				totalDevise1Grp2,
				modificateur6,
				modificatuer7,
				modificateur16,
				paiement1,
				paiement3,
				paiement4,
				paiement5,
				modificateur17,
				venteSurTable,
				stImposable1,
				tva1,
				stImposable2,
				tva2,
				stImposable3,
				tva3
			)
		VALUES
			(
				?,
				?,
				?,
				?,
				?,
				?,
				?,
				?,
				?,
				?,
				?,
				?,
				?,
				?,
				?,
				?,
				?,
				?,
				?,
				?,
				?,
				?,
				?,
				?,
				?,
				?,
				?,
				?,
				?,
				?,
				?,
				?,
				?
				
			)
		';
		$resultSet = $connection->prepare($query);
		$resultSet->execute(array_values($finance));
		$finance = $resultSet;
	}
?>
avant de le traiter je remplace le slash par une virgule manuellement parce que je ne trouve pas la solution dans php (la valeur avant le slash représente une quantité),
dans un premier temps je mets le fichier sous forme de tableau dans un deuxième temps je le prépare pour l'intégrer ds ma bdd.

Code : Tout sélectionner

array (size=5) 0 => string '6' (length=1) 1 => string '1' (length=1) 2 => string '91' (length=2) 3 => string '0' (length=1) 4 => string '235.85' (length=6) array (size=33) 'codeCaisse' => string '1' (length=1) 'decompteZ1' => float 0 'totalChifAffaire' => float 3985.6 'correction' => float 87.45 'voidReceipt' => float 37.75 'gcCustomerCount' => float 0 'sansCommission' => float 3985.6 'gcTotalSales' => float 2610.25 'hoteClient' => float 0 'annulation' => float 35.8 'premiereTransaction' => float 8 'derniereTransaction' => float 18 'totalTiroirPaiement1' => float 2024.2 'totalTiroirPaiement3' => float 1833.8 'totalTiroirPaiement4' => float 127.6 'totalTiroirPaiement5' => null 'totalDevise1Grp1' => float 2024.2 'totalDevise1Grp2' => float 1961.4 'modificateur6' => float 1371.25 'modificateur7' => float 2610.25 'modificateur16' => float 430.3 'paiement1' => float 2024.9 'paiement3' => float 1833.1 'paiement4' => float 127.6 'paiement5' => null 'modificateur17' => float 1364.25 'venteSurTable' => float 2610.25 'stImposable1' => float 20 'tva1' => float 3.33 'stImposable2' => float 1371.25 'tva2' => float 71.49 'stImposable3' => float 2594.35 'tva3' => float 235.85 ( ! ) Warning: array_values() expects parameter 1 to be array, string given in C:\xampp\htdocs\sites\Vectron\rapport.php on line 285 Call Stack # Time Memory Function Location 1 0.0013 148920 {main}( ) ...\rapport.php:0 2 0.0082 163168 array_values ( string(1) ) ...\rapport.php:285 ( ! ) Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: no parameters were bound' in C:\xampp\htdocs\sites\Vectron\rapport.php on line 285 ( ! ) PDOException: SQLSTATE[HY093]: Invalid parameter number: no parameters were bound in C:\xampp\htdocs\sites\Vectron\rapport.php on line 285 Call Stack # Time Memory Function Location 1 0.0013 148920 {main}( ) ...\rapport.php:0 2 0.0093 163200 execute ( null ) ...\rapport.php:285
en espérant avoir été claire dans mes propos. :?: :?:

Mammouth du PHP | 1238 Messages

11 janv. 2017, 09:37

pas simple ce code, il y a pas mal de vecteur d'amèlioration.

première remarque, n'y aurait il pas une confusion entre $financier et $financiers ? je pense qu'il manque un s à la variable utilisé dans le foreach juste avant la requète SQL

[Sait tu que fgetcsv renvoi un tableau dont le premier index est 0 et non 1 ? il me semble que tout tes index sont une unité trop grande. en tout cas pour $line[4];] => j'ai compris tu remplace les / par des , donc c'est OK.

ensuite pour le remplacement de $line[2] par un texte, je te conseillerai de faire un tableau indexé et ensuite tu recupère la valeur depuis ce tableau, cela simplifierai le code
$correspondance = array(
582 => 'decompteZ1',
4 => 'totalChifAffaire',
206 => 'correction',
...
);
if (array_key_exists($line[2],$correspondance)){
$financier[$correspondance[$line[2]] = (float)$line[4];
}
Pour faire modifier par php tous les / par , il te faut utiliser d'autre fonction que fopen et fgetcsv
file_get_contents et str_getcsv avec un strtr entre les deux sera parfait
http://php.net/manual/fr/function.str-getcsv.php
http://php.net/manual/fr/function.file-get-contents.php
http://php.net/manual/fr/function.strtr.php
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone de rubik's cube
Ingénieur Industriel Chimie / Biochimie

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 8755 Messages

11 janv. 2017, 10:28

salut,

pour la lecture d'un fichier csv il y a des façon plus simple
glob qui va fourni un tabelau avec une "case" par ligne du fichier et, comme déjà dit, str_getcsv

une autre solution est d'utiliser l'extension SPL :SplFileObject
exemple simple : http://php.net/manual/en/splfileobject.fgetcsv.php
tu pourras alléger le code et éviter les soucis

Coté requête SQL utilise des marqueurs nommé pour coller aux index de ton tableau.

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

Petit nouveau ! | 4 Messages

11 janv. 2017, 17:28

pas simple ce code, il y a pas mal de vecteur d'amèlioration.

première remarque, n'y aurait il pas une confusion entre $financier et $financiers ? je pense qu'il manque un s à la variable utilisé dans le foreach juste avant la requète SQL

[Sait tu que fgetcsv renvoi un tableau dont le premier index est 0 et non 1 ? il me semble que tout tes index sont une unité trop grande. en tout cas pour $line[4];] => j'ai compris tu remplace les / par des , donc c'est OK.

ensuite pour le remplacement de $line[2] par un texte, je te conseillerai de faire un tableau indexé et ensuite tu recupère la valeur depuis ce tableau, cela simplifierai le code
$correspondance = array(
582 => 'decompteZ1',
4 => 'totalChifAffaire',
206 => 'correction',
...
);
if (array_key_exists($line[2],$correspondance)){
$financier[$correspondance[$line[2]] = (float)$line[4];
}
Pour faire modifier par php tous les / par , il te faut utiliser d'autre fonction que fopen et fgetcsv
file_get_contents et str_getcsv avec un strtr entre les deux sera parfait
http://php.net/manual/fr/function.str-getcsv.php
http://php.net/manual/fr/function.file-get-contents.php
http://php.net/manual/fr/function.strtr.php
Merci pour votre réponse,
oui je sais que le premier index est 0 mais pas le temps de tout vous décortiquer l'index 0 me sert à rien il renseigne le n° de rapport. Ce qui importe pour moi c'est $ligne[3] pour la quantité et $ligne[4] pour la valeur.
par contre moi c'est plutôt le message d'erreur que je ne comprend pas.
si j'ai bien compris il faut que je face un $data->bindParam(":decompteZ1", $decompteZ1, PDO::PARAM_INT);etc.. pour mes 32 valeurs avant de vouloir l'intégrer dans ma bdd.

Mammouth du PHP | 1238 Messages

11 janv. 2017, 17:45

le premier message d'erreur te dit que array_value veut un tableau et tu lui a donné une chaine de caractère. cela est du au faite que tu parcours le dernier $financier créer dans ta boucle plutot que de parcourir tous tes financier contenu dans $financiers
Donc remplace ceci
foreach($financier AS $finance)
par ceci
foreach($financiers AS $finance)

la 2ème erreur découle de la première et sera aussi résolue en passant chaque paramètre un à un. c'est d'ailleur le meilleur moyen de t'assurer que la bonne valeur est assigné au bon paramètre dans ta base.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone de rubik's cube
Ingénieur Industriel Chimie / Biochimie

Petit nouveau ! | 4 Messages

11 janv. 2017, 18:25

si je change financier en financiers dans mon var_dump il me retourne que la variable est indéfinie

Mammouth du PHP | 1238 Messages

12 janv. 2017, 09:20

Ok c'est parce que tu ne vas jamais dans la condition qui le crée et le rempli.

Tu n'a qu'un seul codeCaisse pour tes tests, et de toute façon il te manque un remplissage de $financiers avec le dernier $financier
Donc même avec plusieurs codeCaisse tu n'aura jamais le dernier. Si il n'est pas logique d'avoir plus d'un codeCaisse par éxécution, ton code est mal foutu mais restera fonctionnel avec la correction proposé ci dessous

Pour éviter toute erreur, défini $financiers avant la boucle et complète le avec le dernier $financier juste après la boucle
$financiers[] = $financier;
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone de rubik's cube
Ingénieur Industriel Chimie / Biochimie

Petit nouveau ! | 4 Messages

12 janv. 2017, 10:02

Merci spols,
j'ai trouvé mon erreur j'ai qu'un seul tableau et par mon foreach je demande dans parcourir plusieurs, C'est le message renvoyé qui n'est pas très clair.
je te soumet un autre petit problème.
fgetcsv fait bien sont travail et me retourne un tableau complet par rapport à mon fichier par contre après mise en forme il m'e manque toujours le denier
exemple: si je fais un var_dump il me donne que le 1
4,1,4,0,1242.95
4,1,944,09.11.16,07:53:43
4,1,945,09.11.16,18:01:41
4,1,206,1,1.2
4,1,1039,3,74.7
4,1,32,0,1242.95
4,1,138,126,0
4,1,321,98,717.7
4,1,323,26,525.25
4,1,445,0,717.7
4,1,450,0,525.25
4,1,833,336,1242.95
4,1,936,0,0
4,1,301,0,717.7
4,1,303,0,525.25
4,1,81,0,1242.95
4,1,90,0,64.8
4,4,4,0,773.3
4,4,206,1,4.5
4,4,1110,47,0
4,4,32,0,773.3
4,4,1109,0,773.3
4,4,944,09.11.16,11:11:35
4,4,945,09.11.16,18:28:27
4,4,138,47,0
4,4,207,2,8
4,4,321,36,485.85
4,4,323,12,265.35
4,4,324,3,22.1
4,4,445,0,485.85
4,4,450,0,287.45
4,4,834,172,773.3
4,4,843,140,461.1
4,4,936,0,0
4,4,301,0,485.85
4,4,303,0,265.35
4,4,304,0,22.1
4,4,80,0,20.2
4,4,89,0,3.37
4,4,82,0,753.1
4,4,91,0,68.46
je ne sais pas si j'étais clair dans mon explication!!

Mammouth du PHP | 1238 Messages

12 janv. 2017, 10:55

c'est le fonctionnement normal de la fonction, regarde la doc
http://php.net/manual/fr/function.fgetcsv.php
il y a aussi des exemples pour te montrer comment l'utiliser.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone de rubik's cube
Ingénieur Industriel Chimie / Biochimie