Как вставить пустое значение из Excel в столбец с уникальным ключом и ввести его как NULL?

#php #mysql #excel #xampp

#php #mysql #excel #xampp

Вопрос:

У меня есть программа инвентаризации, которая принимает файл Excel и преобразует его в базу данных, и у меня есть имя столбца с именем hostname , которое находится в уникальном ключе. Проблема в файле Excel, если есть пустое значение, оно будет вставлено в hostname , но если есть другое пустое значение, база данных будет считать его не уникальным. Я искал, почему это не работает, по-видимому, только NULL можно вставлять снова и снова, поскольку есть разница между пустым и нулевым, я хочу, чтобы пустое значение в Excel было преобразовано в NULL, чтобы я мог правильно вставить его в базу данных hostname .

 $allowedFileType = ['application/vnd.ms- 
excel','text/xls','text/xlsx','application/vnd.openxmlformats- 
officedocument.spreadsheetml.sheet'];

if(in_array($_FILES["file"]["type"],$allowedFileType)){

    $targetPath = 'uploads/'.$_FILES['file']['name'];
    move_uploaded_file($_FILES['file']['tmp_name'], $targetPath);

    $Reader = new SpreadsheetReader($targetPath);

    $sheetCount = count($Reader->sheets());
    for($i=0;$i<$sheetCount;$i  )
    {

        $Reader->ChangeSheet($i);

        foreach ($Reader as $Row)
        {

            $cubicle = "";
            if(isset($Row[0])) {
                $cubicle = mysqli_real_escape_string($con,$Row[0]);
            }
            $hostname = "";
            if(isset($Row[1])) {
                $hostname = mysqli_real_escape_string($con,$Row[1]);
            }
            $groups = "";
            if(isset($Row[2])) {
                $groups = mysqli_real_escape_string($con,$Row[2]);
            }
            $batchfile = "";
            if(isset($Row[3])) {
                $batchfile = mysqli_real_escape_string($con,$Row[3]);
            }
            $macaddress = "";
            if(isset($Row[4])) {
                $macaddress = mysqli_real_escape_string($con,$Row[4]);
            }
            $ipaddress = "";
            if(isset($Row[5])) {
                $ipaddress = mysqli_real_escape_string($con,$Row[5]);
            }
            $operatingsystem = "";
            if(isset($Row[6])) {
                $operatingsystem = mysqli_real_escape_string($con,$Row[6]);
            }
            $build = "";
            if(isset($Row[7])) {
                $build = mysqli_real_escape_string($con,$Row[7]);
            }
            $manufacturer = "";
            if(isset($Row[8])) {
                $manufacturer = mysqli_real_escape_string($con,$Row[8]);
            }
            $physicalmemory = "";
            if(isset($Row[9])) {
                $physicalmemory = mysqli_real_escape_string($con,$Row[9]);
            }
            $model = "";
            if(isset($Row[10])) {
                $model = mysqli_real_escape_string($con,$Row[10]);
            }
            $serialnumber = "";
            if(isset($Row[11])) {
                $serialnumber = mysqli_real_escape_string($con,$Row[11]);
            }
            $assetnumber = "";
            if(isset($Row[12])) {
                $assetnumber = mysqli_real_escape_string($con,$Row[12]);
            }
            $ponumber = "";
            if(isset($Row[13])) {
                $ponumber = mysqli_real_escape_string($con,$Row[13]);
            }
            $deliverydate = "";
            if(isset($Row[14])) {
                $deliverydate = mysqli_real_escape_string($con,$Row[14]);
            }
            $division = "";
            if(isset($Row[15])) {
                $division = mysqli_real_escape_string($con,$Row[15]);
            }
            $warranty = "";
            if(isset($Row[16])) {
                $warranty = mysqli_real_escape_string($con,$Row[16]);
            }
            $lifecycle = "";
            if(isset($Row[17])) {
                $lifecycle = mysqli_real_escape_string($con,$Row[17]);
            }
            if (!empty($cubicle) || !empty($hostname) || !empty($groups) || !empty($batchfile) || !empty($macaddress) || !empty($ipaddress) || !empty($operatingsystem) || !empty($build) || !empty($manufacturer) || !empty($physicalmemory) || !empty($model) || !empty($serialnumber) || !empty($assetnumber) || !empty($ponumber) || !empty($deliverydate) || !empty($division) || !empty($warranty) || !empty($lifecycle)) {
                $query = "insert into computer(cubicle, hostname, groups, batchfile, macaddress, ipaddress, operatingsystem, build, manufacturer, physicalmemory, model, serialnumber, assetnumber, ponumber, deliverydate, division, warranty, lifecycle) values('".$cubicle."','".$hostname."', '".$groups."', '".$batchfile."', '".$macaddress."', '".$ipaddress."', '".$operatingsystem."', '".$build."', '".$manufacturer."', '".$physicalmemory."', '".$model."', '".$serialnumber."', '".$assetnumber."', '".$ponumber."', '".$deliverydate."', '".$division."', '".$warranty."', '".$lifecycle."')";

                $result = mysqli_query($con, $query);
  

Ответ №1:

Escape Заключите строку в кавычки, если доступно. В противном случае установите его в строку "NULL"

 $item = isset($Row[123])
      ? '"' . mysqli_real_escape_string($con,$Row[123]) . '"' 
      : "NULL";
  

И затем, в SQL-запросе: Не заключайте снова в кавычки.

Комментарии:

1. Кажется, я не могу применить тот код, которым вы поделились, можете ли вы, пожалуйста, помочь мне в этом? Я совершенно новичок в такого рода проблемах.

2. Ваш ответ помог мне понять мою проблему и найти решение. Большое вам спасибо! Хорошего дня!

Ответ №2:

Мне удалось это исправить, я просто добавил код $hostname = !empty($hostname) ? "'$hostname'" : "NULL"; и удалил кавычки в запросе.