SQL-запрос INSERT не работает при вставке значения NULL [дубликат]

Для меня эта проблема возникла в следующем упрощенном & lt; пример. И я также смог его решить (надеюсь, с правильным решением):

старый код с предупреждением:

def update_old_dataframe(old_dataframe, new_dataframe):
    for new_index, new_row in new_dataframe.iterrorws():
        old_dataframe.loc[new_index] = update_row(old_dataframe.loc[new_index], new_row)

def update_row(old_row, new_row):
    for field in [list_of_columns]:
        # line with warning because of chain indexing old_dataframe[new_index][field]
        old_row[field] = new_row[field]  
    return old_row

Это напечатало предупреждение для строки old_row[field] = new_row[field]

Поскольку строки в методе update_row на самом деле являются типом Series, я заменил строку:

old_row.at[field] = new_row.at[field]

, т.е. метод для доступа / поиска для Series. Несмотря на то, что оба работают очень хорошо, и результат тот же, таким образом, мне не нужно отключать предупреждения (= держать их для других проблем с индексацией цепочки где-то еще).

Надеюсь, это может кому-то помочь.

9
задан Seer 30 January 2013 в 11:55
поделиться

4 ответа

Это решение PHP, но вы должны использовать mysqli, потому что mysql устарел, пожалуйста, прочитайте больше о mysqli . Кроме того, вы должны рассмотреть SQL injection
function save($gmt, $name, $address, $phone, $remark)
{
  if(empty($phone)){
   $phone = 'NULL';
  }else{
   $phone = "'".$phone."'";
  }
  if(empty($remark)){
   $remark = 'NULL';
  }else{
   $remark = "'".$remark."'";
  }
    $query= "INSERT INTO `user` (`gmt`, `name`, `address`, `phone`, `remark`) VALUES ('$gmt', '$name', '$address', $phone, $remark)";
    mysql_query($query);
}
//tests
save("a", "b", "c", "", "")."<br>";
save("a", "b", "c", "d", "")."<br>";
save("a", "b", "c", "d", "e")."<br>";
/*
INSERT INTO `user` (`gmt`, `name`, `address`, `phone`, `remark`) VALUES ('a', 'b', 'c', NULL, NULL)
INSERT INTO `user` (`gmt`, `name`, `address`, `phone`, `remark`) VALUES ('a', 'b', 'c', 'd', NULL)
INSERT INTO `user` (`gmt`, `name`, `address`, `phone`, `remark`) VALUES ('a', 'b', 'c', 'd', 'e')
*/
?>

DEMO

9
ответ дан user 27 August 2018 в 18:11
поделиться

Попробуйте перейти к подготовленным операциям (которые в качестве бонуса менее склонны к SQL-инъекциям).

function save($gmt, $name, $address, $phone, $remark)
{
    if(!isset($phone) || empty($phone)) { $phone = null; }
    if(!isset($remark) || empty($remark) { $remark = null; }

    $db = new PDO(...);

    $stmt = $db->prepare("INSERT INTO `user` (`gmt`, `name`, `address`, `phone`, `remark`) VALUES (:gmt, :name, :address, :phone, :remark)");
    $stmt->bindValue("gmt", $gmt, PDO::PARAM_STR);
    $stmt->bindValue("name", $name, PDO::PARAM_STR);
    $stmt->bindValue("address", $address, PDO::PARAM_STR);
    $stmt->bindValue("phone", $phone, PDO::PARAM_STR);
    $stmt->bindValue("remark", $remark, PDO::PARAM_STR);
    $stmt->execute();
}

Это верно будет обрабатывать значения null в MySQL

5
ответ дан Gerald Schneider 27 August 2018 в 18:11
поделиться

PHP не печатает NULL - это всего лишь пустая строка. Итак, в вашем примере вы попытаетесь вставить '', который в SQL снова является пустой строкой.

Вы должны использовать NULL (без кавычек).

И наилучшей практикой для этого является использование ORM или фреймворка PHP с уровнем абстракции базы данных, который делает это для вас.

4
ответ дан Karoly Horvath 27 August 2018 в 18:11
поделиться

Используя тернарный оператор, вы также можете использовать

$add = ($address == '' ? NULL : $address);
$phn = ($phone == '' ? NULL : $phone);
$rmk = ($remark == '' ? NULL : $remark);
2
ответ дан SagarPPanchal 27 August 2018 в 18:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: