Как проверить данные каждого столбца в файле CSV, прежде чем импортировать в базу данных MySQL в PHP? - PullRequest
0 голосов
/ 30 марта 2019

Заголовки моих столбцов: id, name, phone.Если я дал имя в столбце id, данные не вставляются, но сообщение отображается как «успешный импорт».Я хочу показать сообщение типа «данные определены неправильно».Как проверить код перед импортом в mysql?

Я пытался проверить условия if и else, но не получил фактический результат, который мне нужен.

$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>";
}

Я ожидаю, что сообщение с предупреждением будет "неправильными данными", но получит "успешный импорт".

Ответы [ 3 ]

0 голосов
/ 30 марта 2019

Проверка должна быть сделана перед любой вставкой, таким образом, вы можете сделать это:

<?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;

}

код выше использует набор текста, если вы используете изменение старой версии php

function validateCsvRow(array $data) : bool

до:

function validateCsvRow($data)
0 голосов
/ 30 марта 2019

Порядок полей в CSV может варьироваться, например. столбец 0 не всегда должен быть «id».

Рассмотрим этот CSV:

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

и этот код:

$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'] ]);
}
0 голосов
/ 30 марта 2019

вы можете использовать is_int (), чтобы проверить, является ли значение (в вашем случае $ getData [0]) целочисленным или нет.

перед добавлением значения в запросе

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

}
else
{
    // insert query code here
}
...