Veri türü zaman damgası ile postgres alanına tarih giremezsiniz

3 Cevap php

Ben bir postgres veritabanı alanına bir tarih ("Bu bir dizedir") eklemek çalışıyorum. Ben şu hatayı alıyorum

ERROR:  invalid input syntax for type timestamp: ""

İşte benim kod

$date = '2002-03-11';

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

Bunu nasıl hiçbir fikrim yok?

3 Cevap

Sen bir zaman damgası eklemek için çalışıyoruz. Sen tarih ile zaman bağlamak gerekir. Kimden Postgres documentation:

Valid input for the time stamp types consists of a concatenation of a date ve a time, followed by an optional time zone, followed by an optional AD or BC. (Alternatively, AD/BC can appear before the time zone, but this is not the preferred ordering.) Thus

1999-01-08 04:05:06

ve

1999-01-08 04:05:06 -8:00

are valid values, which follow the ISO 8601 stveard.

Yapın:

$date = '2002-03-11 12:01AM';

Ben neden böyle boş tırnak değeri ile, bu hatayı alıyorsanız emin değilim. PostgreSQL kesinlikle gayet damgası alanlarında içine kez olmadan tarihleri ​​kabul eder. Onlar, "00:00:00", o günün başlangıcında bir süre varsayılan.

CREATE TABLE dates("date" timestamp);
INSERT INTO dates (date) VALUES ('2002-03-11');
SELECT * from dates;
        date         
---------------------
2002-03-11 00:00:00

Rağmen oldukça doğru değil, ve bunlardan biri durumunuzu iyileştirmek olabilir burada yapıyoruz bir kaç şey vardır:

  • Yerine gerçek bir uygulamada hazırlanan tabloların 'alıntı' kullanarak koduna SQL injection saldırılarına izin verir doğru bir ilk adım olduğunu, o içine almak için kötü bir alışkanlıktır. Burada bir hata alıyoruz gerçeği PDO burada ortada yanlış bir şey yapıyorsa bana bildirimde hazırlanan ve üzerinden daha doğrudan değer geçtiyseniz gerçekleşmesi için daha az olacağını, meraklandırıyor.
  • Eğer gerçekten damgası yerine burada örtük döküm bağlıdır dize doğrudan bu döküm olmalıdır. Düz SQL Örnek:

    INSERT INTO dates (date) VALUES (cast('2002-03-11' as timestamp));
    
  • 'Tarih', bir SQL olan reserved word. Eğer onları doğru ayrıştırılması için tırnak adı başvuruları sarmak gerek sonunda olabilir, çünkü böyle alanları adlandırmak gerekir.

Sizin hata açıkça sorunun ne olduğunu belirtmek gibi görünüyor:

ERROR:  invalid input syntax for type timestamp: ""

Bu sorgu 'damgası' bir türü olan bir PostgreSQL alana boş bir dize eklemek için çalışıyor görünüyor. Bazı tür geçersiz bir dize ekleyerek olsaydı, bu gibi recieving olan hata görünmelidir:

ERROR:  invalid input syntax for type timestamp: "foobardtimestamp"

Beklenen dize geçirilen olsaydı ya, senin durumunda, hata bu gibi görünebilir:

ERROR:  invalid input syntax for type timestamp: "2002-03-11"

... Ama hata gibi düşünmek bana bir dize aslında sorguya geçirilen almıyor şüpheli kılan demiyor. Aslında daha önce belirttiği gibi şudur: PostgreSQL 2002-03-11 geçerli bir zaman damgası dize olarak taşıma mükemmel yeteneğine sahip olmalıdır.

PostgreSQL timestamp olarak'' (boş dize) ekleme sevmez ve sağlanan hata ile şikayet edecektir.

Eğer boş bir dize sağlamak istiyorsanız, size sütunda bir NOT NULL kısıtlaması yok emin olmak gerekir ve yerine boş bir dize null kullanmanız gerekir. Eğer boş bir dize göndermek anlam değilseniz, ben $pdo->quote($date) Eğer o dönen istediğiniz dize alıyoruz emin olmak için değerini kontrol.

Aslında doğru göründüğünden emin olmak için Sorguyu çalıştırmadan önce de çıkış için oluşturulan SQL deneyebilirsiniz. Ben bunu yaparsanız, bu gibi bir şey olacak, bir duygu var:

INSERT INTO dates(date) VALUES('')

Also, for what it's worth, your example says you're running: $pdo->query($date); when I'm fairly certain you want: $pdo->query($query);