1
votes

Comment vérifier les données de chaque colonne dans un fichier csv, avant de les importer dans la base de données mysql en php?

Les en-têtes de mes colonnes sont id, nom, téléphone. Si j'ai donné le nom dans la colonne id, les données ne sont pas insérées mais le message s'affiche comme "importation réussie". Je veux afficher le message comme "les données ne sont pas correctement définies". Comment valider le code avant d'importer dans mysql?

J'ai essayé de vérifier avec les conditions if et else mais je n'ai pas obtenu le résultat réel dont j'ai besoin.

$sql = "INSERT IGNORE INTO `all`(`id`, `name`,`phone`)   VALUES ('".$getData[0]."','".$getData[1]."','".$getData[2]."')";
$result = mysqli_query($conn, $sql);
if($result)
 {
echo  "<script type=\"text/javascript\">alert(\"CSV File has been successfully Imported.\");                    
  }</script>";
else {
echo "<script type=\"text/javascript\"> alert(\"Invalid File Format/ Data Please check file is csv and data as per headings.\");      
}</script>";
}

J'attends le message d'alerte comme "données incorrectes" mais obtenant une "importation réussie".


0 commentaires

3 Réponses :


0
votes

vous pouvez utiliser is_int (), pour vérifier si la valeur (dans votre cas $ getData [0]) est un entier ou non.

avant d'ajouter une valeur dans la requête

if(!is_int($getData[0])
{ 
    echo "<script type=\"text/javascript\"> alert(\"Improper Data.\");      
    }</script>";

}
else
{
    // insert query code here
}


0 commentaires

0
votes

La validation doit être faite avant tout INSERT, de cette façon vous pouvez le faire:

function validateCsvRow($data)

le code ci-dessus utilise le typage, si vous utilisez un ancien changement de version de php

function validateCsvRow(array $data) : bool

à:

<?php

//validation of csv

if (false === validateCsvRow($getData)) {
    echo "data is not properly defined";

    // or better to throw an exception - uncomment to see difference
    // throw new \InvalidArgumentException("data is not properly defined");

    die; //end script execution
}

// if validation is okay script continues.

$sql = "INSERT IGNORE INTO `all`(`id`, `name`,`phone`)   VALUES ('".$getData[0]."','".$getData[1]."','".$getData[2]."')";

$result = mysqli_query($conn, $sql);
if($result)
 {
echo  "<script type=\"text/javascript\">alert(\"CSV File has been successfully Imported.\");                    
  }</script>";
else {
echo "<script type=\"text/javascript\"> alert(\"Invalid File Format/ Data Please check file is csv and data as per headings.\");      
}</script>";
}


function validateCsvRow(array $data) : bool
{
    $result = 1;

    //check if id is not set
    if (!isset($data[0]) {
        $result *= 0;
    }

    //check if id is not integer
    if (!is_int($data[0]) {
        $result *= 0;
    }

    //check if name is not set
    if (!isset($data[1]) {
        $result *= 0;
    }

    //check if name is not string
    if (!is_string($data[1]) {
        $result *= 0;
    }

    $minimumNameLength = 1; //number of characters

    //check if name has at least n characters
    if (!strlen($data[1]) < $minimumNameLength) {
        $result *= 0;
    }

    //return 1 => true if all was ok
    //or 0 => false if at least one check was not ok.
    return (bool) $result;

}


0 commentaires

0
votes

L'ordre des champs dans CSV peut varier, par exemple. la colonne 0 ne doit pas toujours être "id".

Considérez ce CSV:

$sql = "INSERT IGNORE INTO `all`(`id`, `name`,`phone`) VALUES (?, ?, ?)";
$stmt = $db->prepare($sql);
$header = null;
while($row = fgetcsv($handle)) {
    if ($header == null) {
        $header = $row;
        continue;
    }
    $data = array_combine($header, $row);
    // $data is now an assoziative array, eg. you can grab "id" by name

    $stmt->execute([ $data['id'], $data['name'], $data['phone'] ]);
}

et ce code:

name, id, phone
'Alice', 1, 1234
'Bob', 2, 5678

p>


0 commentaires