У меня есть набор данных csv, содержащий поле даты, которое может быть или не быть пустым (='')
. Я установил Postgres, чтобы разрешить null в этом поле, и дал ему формат даты. Когда я запускаю свой импорт PHP скрипт (ниже), импорт невозможен, потому что пустая строка не находится в формате даты. Я понимаю, что я должен установить его на NULL
, который я хочу сделать, только если поле действительно пустое. Поэтому я хочу условно установить его, который, как я думал, будет работать следующим образом:
<?php if (empty($data[3])){
$data[3] = NULL;
// (i've tried "null", 'null', "NULL", null, etc.)
Когда я выполняю импорт с помощью этого метода, всякий раз, когда поле даты пуст, я получаю PHP Warning: pg_query(): Query failed: ERROR: invalid input syntax for type date: "NULL"
. Может ли PHP не передавать NULL в pg_query
? Должен ли я помещать условную логику в запрос? Мой код ниже. Большое спасибо за любые советы.
<?php
$conn_string = "host=localhost port=5432 dbname=mydb user=myusername password=mypassword";
$_db = pg_connect($conn_string);
$fileName = "../feeds/stale_prod_report.20111215.csv";
$row = 0;
if ($_db->connect_error) {
die('Connection Error (' . $_db->connect_errno . ') ' . $_db->connect_error);
}
if (($handle = fopen($fileName, "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$num = count($data);
$row++;
for ($c=0; $c < $num; $c++) {
$data[$c] = pg_escape_string(utf8_encode($data[$c]));
}
//if date is empty, insert a dummy - not accepting null
if (empty($data[16])){
$data[16] = NULL;
}
if($row !== 1){
pg_query($_db, "INSERT INTO product (first_field, second_field,
third_field, my_date)
VALUES ('$data[0]', '$data[1]', '$data[2]', '$data[3]')";
}
fclose($handle);
} else {echo "Could not find the file!";}
Ваша проблема в том, что у вас есть одиночные кавычки внутри вашего SQL:
INSERT INTO product (first_field, second_field, third_field, my_date)
VALUES ('$data[0]', '$data[1]', '$data[2]', '$data[3]')
поэтому, если $data[0]
- это строка "NULL"
, вы получите следующее:
INSERT INTO product (first_field, second_field, third_field, my_date)
VALUES ('NULL', ...
и вы попытаетесь вставить строку, содержащую NULL, а не литерал NULL. Вы должны будете делать свои цитаты внутри значений $data
, а не внутри вашего SQL:
# Warning: my PHP is a bit rusty but I think this is right
if(empty($data[0])) {
$data[0] = "NULL";
}
else {
$data[0] = "'" . pg_escape_string(utf8_encode($data[$c])) . "'";
}
И потом:
pg_query($_db, "INSERT INTO product (first_field, second_field, third_field, my_date)
VALUES ($data[0], $data[1], $data[2], $data[3])";
Или лучше, переключитесь на PDO и используйте подготовленные инструкции.
Обратите внимание на функцию NULLIF() PostgreSQL.
<?php
pg_query($_db, "INSERT INTO product (first_field, second_field, third_field, my_date)
VALUES ('$data[0]', '$data[1]', '$data[2]', NULLIF('$data[3]', ''))";
?>
Когда аргументы равны, то есть когда '$ data [3]' == '', тогда возвращается значение NULL.
Используйте $data[3] = 'null'
- null как строку, так что, когда вы вставляете ее в запрос, она выглядит как null
, а не .
(Хотя, вы сказали, что попробовали это... Уверены ли вы, что у вас такая же ошибка?)
ИЗМЕНИТЬ: Ах, поближе посмотрим на ваше сообщение об ошибке. Вы определили поле даты в базе данных как "возможно нулевое" значение? Я привык к MySQL, заметьте, поэтому я мог ошибаться в этой части. Но в любом случае попробуйте вставить '0000-00-00 00:00:00'
в качестве представления нулевой даты.
Синтаксис для NULLIF: NULLIF ('$ emptysstring', ''):: int. WHERE ":: int" относительное целое число.
Надеюсь, это поможет вам. Удачи.