2009-08-21 12 views
4

J'essaie d'insérer une date ("Ceci est une chaîne") dans un champ de base de données postgres. Je reçois l'erreur suivanteImpossible d'entrer la date dans le champ postgres avec l'horodatage du type de données

ERROR: invalid input syntax for type timestamp: "" 

Voici mon code

$date = '2002-03-11'; 

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

Je n'ai absolument aucune idée sur la façon de le faire?

+0

Est-ce que $ pdo pointe vers un objet PDO? Quelle est la valeur de retour du devis d'appel? – Zed

+0

Oui, j'ai oublié de mentionner. $ pdo pointe vers l'objet pdo – Roland

Répondre

9

Vous essayez d'insérer dans un horodatage. Vous devez concaténer l'heure avec la date. De l'Postgres documentation:

entrée valide pour les types d'horodatage est constitué d'une concaténation d'une date et un temps, suivi d'un fuseau horaire en option, suivi d'un AD en option ou en Colombie-Britannique. (Sinon, AD/BC peut apparaître avant le fuseau horaire mais ce est pas l'ordre préféré.) Ainsi

1999-01-08 04:05:06

et

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

sont valides valeurs, suivre la norme ISO 8601 .

Do:

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

Je ne sais pas pourquoi vous obtenez cette erreur, avec la valeur dans les guillemets vides comme ça. PostgreSQL accepte certainement les dates sans les temps dans les champs d'horodatage. Ils par défaut à une heure de "00:00:00", le début de ce jour.

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

Il y a un certain nombre de choses que vous faites ici qui ne sont pas tout à fait raison cependant, et l'un d'entre eux pourrait améliorer votre situation:

  • En utilisant « citation » au lieu des déclarations préparées en une application réelle est une première étape vers l'autorisation d'attaques par injection SQL dans votre code, c'est une mauvaise habitude à prendre. Le fait que vous obteniez une erreur ici me pousse à me demander si PDO fait quelque chose de mal au milieu ici, ce qui serait moins susceptible de se produire si vous prépariez la déclaration et transmettiez la valeur plus directement.
  • Vous devriez vraiment lancer ceci directement de la chaîne à l'horodateur plutôt que de dépendre de la distribution implicite ici. Exemple dans SQL droite:

    INSERT INTO dates (date) VALUES (cast('2002-03-11' as timestamp)); 
    
  • 'date' est un SQL reserved word. Vous ne devriez pas nommer de tels champs, car vous pourriez avoir besoin de renvoyer des références au nom entre guillemets pour qu'ils soient analysés correctement.

5

Votre erreur semble indiquer clairement quel est le problème:

ERROR: invalid input syntax for type timestamp: "" 

Il semble que votre requête tente d'insérer une chaîne vide dans un champ PostgreSQL qui a un type de « horodatage ». Si vous insérez une chaîne non valide d'une sorte, il devrait apparaître dans l'erreur que vous RECEVOIR comme:

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

Ou, dans votre cas, si votre chaîne attendue était passée, votre erreur peut ressembler à ceci :

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

... mais l'erreur ne dit pas ce qui me fait soupçonner votre chaîne n'est pas réellement se passer à la requête comme vous le pensez. Le fait est, comme indiqué précédemment: PostgreSQL devrait être parfaitement capable de gérer 2002-03-11 comme une chaîne d'horodatage valide.

PostgreSQL n'aime pas insérer '' (chaîne vide) comme horodateur et va se plaindre de l'erreur que vous avez fournie.

Si vous souhaitez fournir une chaîne vide, vous devez vous assurer que vous n'avez pas de contrainte NOT NULL sur la colonne, et vous devez utiliser null au lieu d'une chaîne vide. Si vous n'avez pas l'intention d'envoyer une chaîne vide, je vérifierais la valeur de $pdo->quote($date) pour m'assurer que vous obtenez la chaîne que vous voulez renvoyer de cette chaîne.

Vous pouvez également essayer de générer votre code SQL généré avant d'exécuter la requête pour vous assurer qu'elle est correcte. J'ai le sentiment, si vous le faites, il ressemblera à quelque chose comme ceci:

INSERT INTO dates(date) VALUES('') 

En outre, pour ce que ça vaut, votre exemple dit que vous êtes en cours d'exécution: $pdo->query($date); quand je suis assez certain que vous voulez: $pdo->query($query);

Questions connexes