当日期字段为空时,通过PHP将NULL插入PostgreSQL数据库

Mat*_*t C 5 php postgresql

我有一个包含日期字段的csv数据集,我可能会也可能不会为空(='').我已将Postgres设置为在此字段上允许null,并为其指定了Date格式.当我运行我的PHP导入脚本(下面)时,导入失败,因为空字符串不是日期格式.我的理解是我应该把它设置为NULL,只有当字段实际上是空的时我才想做.所以我想有条件地设置它,我认为它会像:

    <?php if (empty($data[3])){
          $data[3] = NULL;
         // (i've tried "null", 'null', "NULL", null, etc.)
Run Code Online (Sandbox Code Playgroud)

当我通过这种方法执行导入时,只要日期字段为空,我就会得到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!";}
Run Code Online (Sandbox Code Playgroud)

mu *_*ort 5

您的问题是您的SQL中有单引号:

INSERT INTO product (first_field, second_field, third_field, my_date) 
VALUES ('$data[0]', '$data[1]', '$data[2]', '$data[3]')
Run Code Online (Sandbox Code Playgroud)

所以如果$data[0]是字符串"NULL",你最终会得到这个:

INSERT INTO product (first_field, second_field, third_field, my_date) 
VALUES ('NULL', ...
Run Code Online (Sandbox Code Playgroud)

并且您将尝试插入包含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])) . "'";
}
Run Code Online (Sandbox Code Playgroud)

然后是:

pg_query($_db, "INSERT INTO product (first_field, second_field, third_field, my_date) 
    VALUES ($data[0], $data[1], $data[2], $data[3])";
Run Code Online (Sandbox Code Playgroud)

或者更好的是,切换到PDO并使用准备语句.