Bonjour,

je suis entrain d'essayer de récupérer un fichier csv pour mettre a jour une table de ma base de données, j'arrive a lire le fichier mais j'ai un soucis pour faire le test pour savoir si l'enregistrement existe déjà( je fais un SELECT COUNT(*)) mais il me retourne cette erreur et je ne comprends pas pourquoi?

merci de votre aide par avance

Gilles

voici mon code:

<?php
    include './lib/includes.php';
    // définition des variables
    $filename = './immat.csv';
    // fonction lecture du fichier
    function read_csv($filename)
        {
        // ouverture du fichier
        $FILE=fopen($filename,"r");
        // lire ligne par ligne et couper colonne par colonne
        while ($ARRAY]=fgetcsv($FILE,1024,";"));
        // fermer le fichier
        fclose($FILE) ;
        // effacer la dernière ligne
        array_pop($ARRAY);
        // renvoi le tableau
        return $ARRAY ;
        }
    $data = read_csv($filename);
    // requête SQL qui compte le nombre total d'enregistrements dans la table et qui récupère tous les enregistrements
    $limite = sizeof($data) ;
    for($i=0;$i<$limite;$i++){
        if ($i > 1){
                $select = $db->query("SELECT COUNT(*) AS verif_chassis FROM vehic_tmp WHERE chassis='$data$i][1]'");
                var_dump($select);
                die();
                $rows=$select->fetch();
                var_dump($rows);
                die();
                    if(($rows->verif_chassis)>0){
                        setFlash("Le numero de contrat existe déja !!!", 'danger');
                        header('Location:order_edit.php');
                        die();
                    }
          }
}
?>

17 réponses


RedaElkhayat
Réponse acceptée

c'est bon maintenant,

if( $select->fetch()->verif_chassis < 1 ){
    echo "existe pas.";
} else {
    echo "existe déjà!";
}
RedaElkhayat
Réponse acceptée

voilà

foreach ( array_slice( $data, 1 ) as $i => $line )

http://php.net/manual/fr/function.array-slice.php

Quelle est l'erreur ?

Fais un var_dump() d'une des lignes de ton csv, pour voir, aussi ?

gilles40
Auteur

Bonjour Vallyan,

comme un gros bourin j'ai oublié de mettre le message d'erreur!!

le voici:

( ! ) Notice: Array to string conversion in C:\wamp\www\portail\import3.php on line 28
Call Stack

Time Memory Function Location

1 0.0006 260544 {main}( ) ..\import3.php:0

object(PDOStatement)[3]
public 'queryString' => string 'SELECT COUNT(*) AS verif_chassis FROM vehic_tmp WHERE chassis='Array[1]'' (length=72)

je t explique ce que je veux faire:

j ai un fichier csv que je veux parcourir et faire une requete qui va verifier si le chassis de la ligne du csv est deja presente dans ma table vehic_tmp, si l'enregistrement est present je fais une mise a jour de certaine donnees sinon je fait un insert de la ligne.

mais voila pour le moment ou je reste bloqué, merci de votre aide.

Gilles

l'erreur 'Array to string conversion', c'est que tu veux mettre un tableau dans une chaine de caractère. Il semble que dans ton cas ce soit $data$i][1] qui est un array.
Fais un var_dump($data), pour voir ce que ca donne.

gilles40
Auteur

Voila le var_dump($data)

array (size=21)
0 =>
array (size=2)
0 => string 'Immat' (length=5)
1 => string 'Chassis' (length=7)
1 =>
array (size=2)
0 => string 'AE998LV' (length=7)
1 => string 'JTDKG18C00N299517' (length=17)
2 =>
array (size=2)
0 => string 'AE660LT' (length=7)
1 => string 'JTDKG18C00N300746' (length=17)
3 =>
array (size=2)
0 => string 'AE094RY' (length=7)
1 => string 'JTDKG18C00N303114' (length=17)

Bon, c'est bizarre ton truc, je vois pas bien ou est le problème puisque $data a l'air OK.

Je suggère que tu laisses tomber la partie bdd pur le moment, et que tu fasses simplement un echo du chassis, en indiquant l'indice de la ligne de ton fichier csv (enfin de $data plutot).

Quelque chose comme ca:

$data = read_csv($filename); // Ca tu l'as déja, change ce qui est en dessous:
foreach ( $data as $i => $line ) {
    echo ("ligne " . $i . " : chassis # " . $line[1] . "<br>");
}
die();

De cette facon tu verra si c'est une ligne en particulier qui merdouille, et le cas échéant laquelle c'est.

Salut, et si tu fais un

var_dump( $data$i][1] );

qu'est ce que ça donne?

L'exemple que Vallyan a donné, je pense que c'est beaucoup mieux vu que tu veux parcourir tous les éléments de ton tableau. essaies avec le foreach.

gilles40
Auteur

Voila ce que cela donne avec le code de Vallyan:

ligne 0 : chassis # Chassis
ligne 1 : chassis # JTDKG18C00N299517
ligne 2 : chassis # JTDKG18C00N300746
ligne 3 : chassis # JTDKG18C00N303114
ligne 4 : chassis # JTDKG18C00N336534
ligne 5 : chassis # JTDKG18C00N341412
ligne 6 : chassis # JTDKG18C00N344004
ligne 7 : chassis # JTDKG18C10N301324
ligne 8 : chassis # JTDKG18C10N301338
ligne 9 : chassis # JTDKG18C10N301968
ligne 10 : chassis # JTDKG18C10N334064
ligne 11 : chassis # JTDKG18C10N336493
ligne 12 : chassis # JTDKG18C10N337160
ligne 13 : chassis # JTDKG18C20N334803
ligne 14 : chassis # JTDKG18C30N299916
ligne 15 : chassis # JTDKG18C40N299309
ligne 16 : chassis # JTDKG18C40N300295
ligne 17 : chassis # JTDKG18C40N301642
ligne 18 : chassis # JTDKG18C40N302659
ligne 19 : chassis # JTDKG18C40N345690
ligne 20 : chassis # JTDKG18C50N300905

$data = read_csv($filename);
foreach ( $data as $i => $line ) {

    $select = $db->query("SELECT COUNT(*) AS verif_chassis FROM vehic_tmp WHERE chassis='". $line[1] ."'");
    var_dump($select);

}
die();

Qu'est ce ça donne?

gilles40
Auteur

voila le résultat:

object(PDOStatement)[3]
public 'queryString' => string 'SELECT COUNT(*) AS verif_chassis FROM vehic_tmp WHERE chassis='Chassis'' (length=71)

object(PDOStatement)[4]
public 'queryString' => string 'SELECT COUNT(*) AS verif_chassis FROM vehic_tmp WHERE chassis='JTDKG18C00N299517'' (length=81)

object(PDOStatement)[3]
public 'queryString' => string 'SELECT COUNT(*) AS verif_chassis FROM vehic_tmp WHERE chassis='JTDKG18C00N300746'' (length=81)

object(PDOStatement)[4]
public 'queryString' => string 'SELECT COUNT(*) AS verif_chassis FROM vehic_tmp WHERE chassis='JTDKG18C00N303114'' (length=81)

object(PDOStatement)[3]
public 'queryString' => string 'SELECT COUNT(*) AS verif_chassis FROM vehic_tmp WHERE chassis='JTDKG18C00N336534'' (length=81)

Ah, j'ai oublié de récupérer le résultat de la requête

$select = $db->query("SELECT COUNT(*) AS verif_chassis FROM vehic_tmp WHERE chassis='". $line[1] ."'");
var_dump($select->fetch());
gilles40
Auteur

voila avec select->fetch

object(stdClass)[4]
public 'verif_chassis' => string '0' (length=1)

object(stdClass)[3]
public 'verif_chassis' => string '1' (length=1)

object(stdClass)[4]
public 'verif_chassis' => string '1' (length=1)

object(stdClass)[3]
public 'verif_chassis' => string '1' (length=1)

.....

gilles40
Auteur

merci RedaElkhayat et Vallyan,

je vais maintenant gerer la mise à jour ou l'entrée des differentes lignes.

autre petit soucis: je fais comment pour faire sauter la ligne des titres de mon csv?

gilles

gilles40
Auteur

encore merci RedaElkhayat