Вставьте NULL в базу данных PostgreSQL через PHP, когда поле даты пусто - PullRequest
5 голосов
/ 02 января 2012

У меня есть набор данных 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!";}

Ответы [ 4 ]

5 голосов
/ 02 января 2012

Ваша проблема в том, что внутри 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 и используйте подготовленные операторы.

4 голосов
/ 02 января 2012

Разум, используя функцию PostgreSQL NULLIF ().

<?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 .

1 голос
/ 02 января 2012

Используйте $data[3] = 'null' - null в качестве строки, чтобы при вставке в запрос он выглядел как null, а не .

(Хотя вы сказали, что пробовали это ... Вы уверены, что получили ту же ошибку для этого?)

РЕДАКТИРОВАТЬ: Ах, внимательно посмотрел на ваше сообщение об ошибке. Вы определили поле даты в базе данных как «возможно нулевое» значение? Заметьте, я привык к MySQL, поэтому могу ошибаться в этом. Но в любом случае попробуйте вставить '0000-00-00 00:00:00' как представление нулевой даты.

0 голосов
/ 09 августа 2012

Синтаксис для NULLIF: NULLIF ('$ emptysstring', '') :: int.ГДЕ ":: int" является целым числом.

Надеюсь, это поможет вам.Удачи.

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