2010-04-14 3 views
1

dans mon code php je demandais à l'utilisateur de choisir le jour, le mois et l'année de certains champs de liste déroulante où les valeurs où 1, 2, 3 etc au lieu de 01, 02, 03.dates lors de l'enregistrement de base de données MySQL

ceux-ci ont ensuite été combinés pour former une chaîne comme "AAAA-MM-DD" pour l'insertion dans un db (dans un champ de date). Ayant manqué le 0 initial, je pensais envoyer des chaînes dans le mauvais format, par exemple "YYYY-MD" ou "YYYY-MM-D", mais j'ai remarqué qu'elles apparaissaient dans le bon format dans la base de données de toute façon: même si je soumettais AAAA-MD, il est apparu comme AAAA-MM-JJ

est-ce le comportement normal de MySQL si oui, puis-je éviter tout se soucier de changer le code dans mon application

Répondre

0
.?

Oui, c'est un comportement normal Si votre colonne a le type DATE, MySQL convertira la chaîne en une représentation interne d'une date lors de son insertion MySQL est flexible lors de l'analyse des dates tant que l'ordre est correct (année, mois, jour Lors de l'affichage des dates, il utilisera 'Y YYY-MM-DD 'quel que soit le format utilisé lors du stockage des données.

Voici quelques citations de la page du manual:

MySQL affiche les valeurs DATE dans 'AAAA-MM-JJ' Format

MySQL récupère les valeurs pour une date donnée ou le type de temps en un format de sortie standard, mais il tente d'interpréter une variété de formats pour les valeurs d'entrée que vous fournissez (par exemple, lorsque vous spécifiez une valeur à affecter ou à comparer à un type de date ou d'heure). Seuls les formats décrits dans les sections suivantes sont pris en charge. Il est prévu que vous fournissiez des valeurs légales. Des résultats imprévisibles peuvent se produire si vous utilisez des valeurs dans d'autres formats. Bien que MySQL essaie d'interpréter les valeurs dans plusieurs formats, les dates doivent toujours être données dans l'ordre année-mois-jour (par exemple, '98 -09-04 ') plutôt que dans le mois-jour-année ou le jour ordres de mois-couramment utilisés ailleurs (par exemple, '09 -04-98 ', '04 -09-98').

0

Je recommande passer l'entrée et le format mktime() puis avec date(), de cette façon vous pouvez être sûr d'obtenir toujours le format que vous vouliez. En outre, vous êtes un peu mieux protégé contre les attaques par injection

+0

intéressant - pourquoi cela offrirait une meilleure protection? – Patrick

+0

Je ne connais pas votre scénario exact, mais si vous venez de «regrouper» les numéros sélectionnés et que vous ne les désinfectez pas/ne les validez en aucune façon, vous êtes prêt pour l'injection. solution facile dans votre cas sans utiliser mktime et la date est d'utiliser simplement 'intval()' ou '(int)' – knittl

+0

ah ok. J'utilise les enregistrements actifs de codeigniter pour que les requêtes soient automatiquement échappées, et ça devrait aller. Cependant, puisque j'utilise des menus déroulants pour sélectionner les numéros à «mettre ensemble». Une liste déroulante peut-elle être piratée pour faire une injection SQL? Je pense que seuls les champs de texte pourraient être utilisés, mais il vaut la peine de vérifier. – Patrick

Questions connexes