Problème code PHP

Résolu
Bonjour à tous,
J'au un petit souci avec un code en PHP. Je dois faire une petite appli qui importe des données à partir d'un fichier excel dans une base de données. J'ai donc commencer à faire ce bout de code :

<?php
// Test si le fichier a bien été envoyé et s'il n'y a pas d'erreur
if (isset($_FILES['fichiercsv']) AND $_FILES['fichiercsv']['error'] == 0)
{
// Test taille du fichier
if ($_FILES['fichiercsv']['size'] <= 2000000)
{
// Test extension autorisée
$infosfichier = pathinfo($_FILES['fichiercsv']['name']);
$extension_upload = $infosfichier['extension'];
$extensions_autorisees = array('csv');
if (in_array($extension_upload, $extensions_autorisees))
{
$fichiercsv = $_FILES['fichiercsv']['tmp_name'] ;

$i=0;
$fichier = fopen($fichiercsv, "r"); //Ouverture du fichier en mode lecture

//lecture ligne par ligne tant qu'on est pas à la fin du fichier
while (!feof($fichier))
{
$ligne = fgets($fichier, 1024); //Récupération de la ligne
$tableau[$i] = explode(';', $ligne); //Récupération des différentes valeurs trouvées dans une ligne
$i++;
}
fclose($fichier); // Fermeture du fichier
$nblignes=$i;

//print_r($tableau) ;

//Connexion à la base de données
try
{
$bdd = new PDO('mysql:host=localhost;dbname=donneesreporting', 'root', 'root');
}
catch (Exception $e)
{
die('Erreur : ' . $e->getMessage());
}

// print_r($tableau[1][5]);

// Les valeurs lues dans le fichier sont insérées dans la BD ligne par ligne
for ($i=1;$i<=$nblignes;$i++)
{
$v1=$tableau[$i][0];
$v2=$tableau[$i][1];
$v3=$tableau[$i][2];
$v4=$tableau[$i][3];
$v5=$tableau[$i][4];
$v6=$tableau[$i][5];
$v7=$tableau[$i][6];
$v8=$tableau[$i][7];
$v9=$tableau[$i][8];
$v10=$tableau[$i][9];
$v11=$tableau[$i][10];
$v12=$tableau[$i][11];
$v13=$tableau[$i][12];
$v14=$tableau[$i][13];
$v15=$tableau[$i][14];
$v16=$tableau[$i][15];
$v17=$tableau[$i][16];
$v18=$tableau[$i][17];
$v19=$tableau[$i][18];
$v20=$tableau[$i][19];
$v21=$tableau[$i][20];

$req = mysql_query("INSERT INTO piq VALUES ('$v1', '$v2', '$v3', '$v4', '$v5', '$v6', '$v7', '$v8', '$v9', '$v10', '$v11', '$v12', '$v13', '$v14', '$v15', '$v16', '$v17', '$v18', '$v19', '$v20', '$v21')");
}

// fermeture de la base de données
mysql_close("donneesreporting");

// Test requete
if ($req)
{ echo "Transfert effectué avec succes"; }
else
{ echo "Echec du transfert"; }
//echo "Importation effectuee avec succes" ;
}
else { echo "Mauvaise extension de fichier" ;}
}
else { echo "Fichier trop lourd" ;}
}
else
{
echo "Echec ouverture du fichier";
}

?>

Et lorsque je lance mon appli, après que l'utilisateur est choisis son fchier csv à import ca me dit : Notice: Undefined offset: 1 in C:\wamp\www\Reporting\cible_envoi.php on line 45
Et ca pour toutes mes lignes de 46 à 66 ...
je sais pas pourquoi, j'ai vérifié mon tableau se rempli bien je crois
Help me please !

1 réponse

  1. voir commentaires
    <?php
    // Test si le fichier a bien été envoyé et s'il n'y a pas d'erreur
    if (isset($_FILES['fichiercsv']) AND $_FILES['fichiercsv']['error'] == 0)
    {
    // Test taille du fichier
    if ($_FILES['fichiercsv']['size'] <= 2000000)
    {
    // Test extension autorisée
    $infosfichier = pathinfo($_FILES['fichiercsv']['name']);
    $extension_upload = $infosfichier['extension'];
    $extensions_autorisees = array('csv');
    if (in_array($extension_upload, $extensions_autorisees))
    {
    $fichiercsv = $_FILES['fichiercsv']['tmp_name'] ;
    
    $i=0;
    $fichier = fopen($fichiercsv, "r"); //Ouverture du fichier en mode lecture
    
    //lecture ligne par ligne tant qu'on est pas à la fin du fichier
    while (!feof($fichier))
    {
    $ligne = fgets($fichier, 1024); //Récupération de la ligne
    $tableau[$i] = explode(';', $ligne); //Récupération des différentes valeurs trouvées dans une ligne
    $i++;
    }
    fclose($fichier); // Fermeture du fichier
    $nblignes=$i;
    
    //print_r($tableau) ;
    
    //Connexion à la base de données
    try
    {
    $bdd = new PDO('mysql:host=localhost;dbname=donneesreporting', 'root', 'root');
    }
    catch (Exception $e)
    {
    die('Erreur : ' . $e->getMessage());
    }
    
    // print_r($tableau[1][5]);
    
    // Les valeurs lues dans le fichier sont insérées dans la BD ligne par ligne
    
    //$i commence à zéro dans ta boucle while de lecture du fichier et a la fin de boucle while $i vaut 1 de plus que le nombre de lignes donc il faut mieux boucler sur la taille réelle de $tableau
    for ($i=0;$i<sizeof($tableau);$i++)
    {
    $v1=$tableau[$i][0];
    $v2=$tableau[$i][1];
    $v3=$tableau[$i][2];
    $v4=$tableau[$i][3];
    $v5=$tableau[$i][4];
    $v6=$tableau[$i][5];
    $v7=$tableau[$i][6];
    $v8=$tableau[$i][7];
    $v9=$tableau[$i][8];
    $v10=$tableau[$i][9];
    $v11=$tableau[$i][10];
    $v12=$tableau[$i][11];
    $v13=$tableau[$i][12];
    $v14=$tableau[$i][13];
    $v15=$tableau[$i][14];
    $v16=$tableau[$i][15];
    $v17=$tableau[$i][16];
    $v18=$tableau[$i][17];
    $v19=$tableau[$i][18];
    $v20=$tableau[$i][19];
    $v21=$tableau[$i][20];
    
    $req = mysql_query("INSERT INTO piq VALUES ('$v1', '$v2', '$v3', '$v4', '$v5', '$v6', '$v7', '$v8', '$v9', '$v10', '$v11', '$v12', '$v13', '$v14', '$v15', '$v16', '$v17', '$v18', '$v19', '$v20', '$v21')");
    }
    // fermeture de la base de données
    mysql_close("donneesreporting");
    // Test requete
    if ($req)
    { echo "Transfert effectué avec succes"; }
    else
    { echo "Echec du transfert"; }
    
    //echo "Importation effectuee avec succes" ;
    }
    else { echo "Mauvaise extension de fichier" ;}
    }
    else { echo "Fichier trop lourd" ;}
    }
    else
    {
    echo "Echec ouverture du fichier";
    }
    
    ?> 
    1. J'ai testé votre méthode, cela ne marche pas non plus, ou alors j'ai mal compris.
      Mais j'ai trouvé une solution j'ai changé ma solution de comptage de ligne par :
      $nblignes=$i-1;
      Cela fonctionne.
      Merci pour votre aide !
      Bonne soirée