我有一个csv数据集,其中包含一个日期字段,我的空格可能为空(='')
。我已将Postgres设置为在此字段上允许null,并为其指定了Date格式。当我运行我的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!";}
答案 0 :(得分:5)
您的问题是您的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并使用准备好的语句。
答案 1 :(得分:4)
介意使用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 值。
答案 2 :(得分:1)
使用$data[3] = 'null'
- null作为字符串,因此当您在查询中插入它时,它看起来像null
,而不是。
(虽然,你说你试过了......你确定你有同样的错误吗?)
编辑:啊,仔细看看你的错误信息。您是否将数据库中的日期字段定义为“可能为空”值?我已经习惯了MySQL,请注意,所以我可能错了。但无论如何,请尝试插入'0000-00-00 00:00:00'
作为空日期的表示。
答案 3 :(得分:0)
NULLIF的语法:NULLIF('$ empty string',''):: in。 WHERE“:: int”是一个相对整数。
我希望这对你有所帮助。祝你好运。