Для меня эта проблема возникла в следующем упрощенном & 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
. Несмотря на то, что оба работают очень хорошо, и результат тот же, таким образом, мне не нужно отключать предупреждения (= держать их для других проблем с индексацией цепочки где-то еще).
Надеюсь, это может кому-то помочь.
Это решение 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')
*/
?>
Попробуйте перейти к подготовленным операциям (которые в качестве бонуса менее склонны к 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
PHP не печатает NULL - это всего лишь пустая строка. Итак, в вашем примере вы попытаетесь вставить ''
, который в SQL снова является пустой строкой.
Вы должны использовать NULL
(без кавычек).
И наилучшей практикой для этого является использование ORM или фреймворка PHP с уровнем абстракции базы данных, который делает это для вас.
Используя тернарный оператор, вы также можете использовать
$add = ($address == '' ? NULL : $address);
$phn = ($phone == '' ? NULL : $phone);
$rmk = ($remark == '' ? NULL : $remark);