Вставка нулевых значений для массива динамических входов - PullRequest
0 голосов
/ 10 октября 2018

Использование PHP версии 7.1.9, MariaDB 10.1.26.

Я отправляю массив данных формы в базу данных MySQL.Форма позволяет добавлять динамические входы, при добавлении динамических входов они выглядят так:

// I have removed additional html form code for brevity
<input type="text" name="mac[]">
<input type="text" name="mac[]">
<input type="text" name="mac[]">
etc...

Иногда эти входы будут пустыми, это разрешено.Когда входные данные пусты, я хочу вставить значение NULL в мою базу данных.Вот где у меня проблемы.

Я убедился, что для моей таблицы базы данных установлено значение:

  • allow null = yes
  • default - null

Мой PHP-код для обработки отправки формы ниже (пожалуйста, не обращайте внимания на любые уязвимости безопасности, это упрощенный код) ;

// I have removed additional php code for brevity
$arr_mac = $_POST['mac'] ? "'".$_POST['mac']."'" : 'NULL';
for ($i = 0; $i < count($arr_mac); $i++) {
    $sql = "INSERT INTO staff (mac) VALUES ( ".$arr_mac[$i]." )
}

Я получаю ошибку;

SQLSTATE [42000]: синтаксическая ошибка или нарушение доступа: 1064 В синтаксисе SQL имеется ошибка;проверьте правильность синтаксиса в руководстве, соответствующем версии вашего сервера MySQL .. ..

Когда я var_dump(mac) получаю;

[mac] => Array
  (
    [0] =>
    [1] => 
    [2] =>  
  )

Если я изменю PHP наследующее (обратите внимание на дополнительные ' ') во вставке, запрос выполняется успешно, , но вместо null значений, empty значения вставляются в базу данных.

$arr_mac = $_POST['mac'] ;
for ($i = 0; $i < count($arr_mac); $i++) {
    $sql = "INSERT INTO staff (mac) VALUES (' ".$arr_mac[$i]." ')
}

Любой совет приветствуется.

Ответы [ 2 ]

0 голосов
/ 10 октября 2018
$arr_mac = $_POST['mac'] ;
$batchInsert = array();
for ($i = 0; $i < count($arr_mac); $i++) {
    if( "" == trim($arr_mac[$i])) {
        $arr_mac[$i] = 'NULL';
    }
       $batchInsert = array_push($arr_mac[$i]);
}
$insertValues = implode("','", $batchInsert)
$sql = "INSERT INTO staff (mac) VALUES ('$batchInsert')";

*** check 'и, формирование с использованием функции взрыва

Это вставит N нет.значений в одном операторе INSERT, будет выполняться намного быстрее!

0 голосов
/ 10 октября 2018

Я предполагаю, что вы строите свой запрос в неправильном синтаксисе.Используя данный код, ваш INSERT может выглядеть так:

INSERT INTO staff (mac) VALUES ()

Ваш код не обрабатывает регистр NULL должным образом - переменная, установленная в NULL, не приводит к использованию литералаNULL для построения запроса.

Это может помочь:

$arr_mac = $_POST['mac'] ? "'".$_POST['mac']."'" : 'NULL';
for ($i = 0; $i < count($arr_mac); $i++) {
    $value = $arr_mac[$i];
    if(!$value) {
        $value = 'NULL';
    } else {
        $value = your_favorite_escaping_algorithm($value);
    }
    $sql = "INSERT INTO staff (mac) VALUES ( ". $value ." )";
}

Это помогает выписать конкретное значение NULL, необходимое для синтаксически правильного запроса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...