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 :

Pourquoi je n'ai que la dernière ligne d'un array?


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Homme Profil pro
    Infographiste, Webdesigner
    Inscrit en
    Juillet 2012
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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
    Points : 70
    Points
    70
    Par défaut Pourquoi je n'ai que la dernière ligne d'un array?
    Bonjour à tous et à toutes,

    Avant de commencer, je précise que je suis débutant en PHP, donc merci par avance pour votre indulgence dans vos réponses.

    J'ai un site sous Prestashop et je voudrais, à partir d'un élément fourni par Payzen (en l'occurrence l'id de transaction) obtenir le numéro de la facture correspondante.

    A l'aide d'un script PHP que j'ai bidouillé à partir de 2 autres scripts, j'injecte un fichier csv qui a 2 colonnes :

    id_transaction
    client (avec le nom et prénom du client)

    Ce fichier CSV comporte 4 lignes (hors entêtes) et est converti en array.

    J'ai réussi à obtenir un résultat, mais le problème c'est que je n'en obtiens qu'un seul, celui correspondant à la dernière ligne de mon array/fichier CSV.

    Sauriez-vous pourquoi SVP ?

    Voici mon code :
    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
    $fileName = 'transactions.csv';
    $lineHandler = 1; 
    $arrayQuery = array();
    $fieldSeparator = ";";
    $row = 0;
    $arrayKeys = array();
    $arrayTransaction = array();
     
    // IMPORTANT : Customizable vars
    $id_transaction = 'id_transaction';
    $client = 'client';
     
    /**
     * 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($arrayTransaction, $arrayCursor);
    		}
        }
        fclose($handle);
    	/**
    	 * Part 2 : array treatment.
    	 *
    	*/
    	foreach ($arrayTransaction as $id_transaction)
    	{
    		$sql = "
    	SELECT op.order_reference
    	FROM " . pSQL(_DB_PREFIX_) . "order_payment op
    	WHERE op.transaction_id LIKE '%". $id_transaction['id_transaction'] ."'";
    	$result = Db::getInstance()->executeS($sql);
    	}	
    }
    foreach($result as $res)
    	{
    	$sql2 = "
    	SELECT o.invoice_number
    	FROM " . pSQL(_DB_PREFIX_) . "orders o
    	WHERE o.reference = '". $res['order_reference'] ."'";
    	$result2 = Db::getInstance()->executeS($sql2);
    	}
    echo "<ul>";
    foreach($result2 as $res2) {
      echo "<li>FC-".$res2['invoice_number']."</li>";
    }
    echo "</ul>";
    D'avance merci pour vos réponses.

    Bonne journée

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    regarde la position du premier foreach...
    Tu boucles sur le tableau $arrayTransaction et ton SELECT écrase à chaque fois la résultat de la requête précédente $result.
    Pour la partie transformation en tableau je ferais plutôt comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $data = [];
    if (is_file($fileName)) {
        $rows = str_getcsv(file_get_contents($fileName), "\n");
        if ( ! empty($rows)) {
            $keys = str_getcsv($rows[0], $fieldSeparator);
            array_shift($rows);
            foreach ($rows as $row) {
                $data[] = array_combine($keys, str_getcsv($row, $fieldSeparator));
            }       
        }
    }

  3. #3
    Membre régulier
    Homme Profil pro
    Infographiste, Webdesigner
    Inscrit en
    Juillet 2012
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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
    Points : 70
    Points
    70
    Par défaut
    Merci de ta réponse rawsrc. Cependant, je ne comprends pas bien. Tu écris :
    Tu boucles sur le tableau $arrayTransaction et ton SELECT écrase à chaque fois la résultat de la requête précédente $result.
    Qu'est-ce qu'il faudrait que je fasse ? Que je sorte la requête $result de la boucle foreach ?
    Ce qui donnerait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    foreach ($arrayTransaction as $id_transaction)
    	{
    		$sql = "
    	SELECT op.order_reference
    	FROM " . pSQL(_DB_PREFIX_) . "order_payment op
    	WHERE op.transaction_id LIKE '%". $id_transaction['id_transaction'] ."'";
    		}
    $result = Db::getInstance()->executeS($sql);
    Parce que là, en gros je lui dit
    "Pour chaque ligne du tableau arrayTransaction, colonne id_transaction
    Voici la requête sql
    Sélectionne order_reference
    dans la table order_payment
    où transaction_id ressemble à '%id_transaction['id_transaction']'
    Résultat = exécution de la requête sql"

    Où est-ce que ça coince ?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    1- améliore l'INDENTATION du code.
    Tu verras mieux les imbrications.

    2- Ajoute des commentaires/explications dans le code.
    Tu sauras ce qui fait quoi, et quand.

Discussions similaires

  1. Ma JTable n'affiche que la dernière ligne
    Par sam14 dans le forum Débuter
    Réponses: 3
    Dernier message: 19/04/2012, 11h29
  2. [Oracle] PHP ne retourne que la dernière ligne d'un resultat d'une procedure stockée ORACLE
    Par tytous dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 08/06/2010, 07h57
  3. [MySQL] Boucle qui ne lit que la dernière ligne
    Par YaNnTeB dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 21/08/2009, 10h56
  4. Réponses: 9
    Dernier message: 20/08/2009, 14h33
  5. Textarea et blob : je n'ai que la dernière ligne
    Par rems033 dans le forum Langage
    Réponses: 2
    Dernier message: 18/03/2008, 20h09

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