Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Can';t在带有数据类型时间戳的postgres字段中输入日期_Php_Postgresql - Fatal编程技术网

Php Can';t在带有数据类型时间戳的postgres字段中输入日期

Php Can';t在带有数据类型时间戳的postgres字段中输入日期,php,postgresql,Php,Postgresql,我试图在postgres数据库字段中插入一个日期(“这是一个字符串”)。我得到以下错误 ERROR: invalid input syntax for type timestamp: "" 这是我的密码 $date = '2002-03-11'; $query = 'INSERT INTO dates(date) VALUES('.$pdo->quote($date).')'; $pdo->query($date); 我完全不知道怎么做?您正试图插入时间戳。您需要将时间与日期

我试图在postgres数据库字段中插入一个日期(“这是一个字符串”)。我得到以下错误

ERROR:  invalid input syntax for type timestamp: ""
这是我的密码

$date = '2002-03-11';

$query = 'INSERT INTO dates(date) VALUES('.$pdo->quote($date).')';
$pdo->query($date);

我完全不知道怎么做?

您正试图插入时间戳。您需要将时间与日期连接起来。从:

时间戳类型的有效输入 由日期的串联组成 和一个时间,然后是一个可选的 时区,后跟可选广告 或公元前。(或者,AD/BC可以 显示在时区之前,但此 不是首选顺序。)因此

1999-01-0804:05:06

1999-01-0804:05:06-8:00

有效 值,遵循ISO 8601 标准

做:


我不知道为什么会出现这样的错误,引号中的值是空的。PostgreSQL当然可以将没有时间的日期输入时间戳字段。它们的默认时间为“00:00:00”,即当天的开始

CREATE TABLE dates("date" timestamp);
INSERT INTO dates (date) VALUES ('2002-03-11');
SELECT * from dates;
        date         
---------------------
2002-03-11 00:00:00
不过,您在这里做的一些事情并不完全正确,其中之一可能会改善您的情况:

  • 在实际应用程序中使用“quote”而不是准备好的语句是允许SQL注入攻击进入代码的第一步,这是一个不好的习惯。事实上,你在这里得到一个错误,让我怀疑PDO是否在中间做了一些错误的事情,如果你准备好了这个语句,并且通过更直接地传递这个值,这将不太可能发生。
  • 您真的应该直接从字符串转换到时间戳,而不是依赖于这里的隐式转换。直接SQL中的示例:

    INSERT INTO dates (date) VALUES (cast('2002-03-11' as timestamp));
    
  • “date”是一个SQL语句。您不应该这样命名字段,因为最终可能需要将对名称的引用用引号括起来,以便正确解析它们


您的错误似乎清楚地说明了问题所在:

ERROR:  invalid input syntax for type timestamp: ""
您的查询似乎试图将空字符串插入到具有“timestamp”类型的PostgreSQL字段中。如果您插入了某种类型的无效字符串,则您收到的错误中应显示如下:

ERROR:  invalid input syntax for type timestamp: "foobardtimestamp"
或者,在您的情况下,如果传递了预期的字符串,则错误可能如下所示:

ERROR:  invalid input syntax for type timestamp: "2002-03-11"
INSERT INTO dates(date) VALUES('')
…但错误并没有说明这一点,这让我怀疑字符串实际上没有像您所想的那样传递到查询。事实是,正如前面所指出的:PostgreSQL应该完全能够将
2002-03-11
作为有效的时间戳字符串处理

PostgreSQL不喜欢插入“”(空字符串)作为时间戳,并且会抱怨您提供的错误

如果要提供空字符串,需要确保列上没有
notnull
约束,并且需要使用
NULL
而不是空字符串。如果你不想发送一个空字符串,我会检查
$pdo->quote($date)
的值,以确保你得到了想要从中返回的字符串

您还可以尝试在实际运行查询之前输出生成的SQL,以确保它看起来正确。我有一种感觉,如果你这样做,它会像这样:

ERROR:  invalid input syntax for type timestamp: "2002-03-11"
INSERT INTO dates(date) VALUES('')
另外,为了说明它的价值,您的示例说您正在运行:
$pdo->query($date)当我相当确定您需要时:
$pdo->query($query)

$pdo是否指向pdo对象?调用报价的返回值是多少?是的,忘记提及$pdo指向pdo对象