-1

我在将 $date 变量存储在称为数据类型的数据库列中时遇到问题 varchar(50)

这是日期变量的代码

$date = date("Y-m-d");
echo $date;

这是将其存储到数据库中的代码(注意日期是相同的)

我的代码有什么问题

 $sql="INSERT INTO 
    Students(FirstName, LastName,gender,Major,Favorite_courses,GPA,date)
 VALUES 
    ('$_POST[firstname]','$_POST[lastname]','$_POST[sex]','$_POST[major]',
     '$_POST[favorite]','$_POST[GPA]','$date')";
4

4 回答 4

4

将列类型更改为DATE,然后SYSDATE用作在 SQL 服务器上输入当前日期/时间的值。

另外,请阅读 SQL 注入!

于 2013-06-03T20:04:19.347 回答
2

从技术上讲,您的代码应该可以工作,但实际上它无疑会失败。

对于初学者,您永远不应该将 POST 数据直接放入数据库中。根据该数据中的内容,它至少会破坏您的 SQL 语句。如果有人在 POST 变量中输入了一些 SQL,它也可能会破坏您的数据库。

不要那样做。在将来自外部世界的任何数据插入数据库之前,您需要对其进行清理。有几个 PHP 数据库类可以为您执行此操作。我喜欢PDO

此外,使用 $_POST['favorite'] 而不是 $_POST[favorite] 来编写更好的 PHP。如果您在某处的代码中执行此操作会发生什么define('favorite', 'foobar')

发生的情况是,您的代码将寻找 $_POST['foobar'] 而不是 $_POST['favorite']。

在将任何东西推广到野外之前,您确实需要掌握 PHP 和 SQL 的知识,否则您将遇到问题。但是坚持下去,你会明白的。

于 2013-06-03T20:13:31.597 回答
1

除了已经多次提到的SQL 注入:使用date('c')(或更具体地说:ISO8601 表示法)。这将导致如下代码:

$query = "insert into mytable (myfield) values ('" . date('c') . "')";

这将导致如下查询:

insert into mytable (myfield) values ('2013-06-03T22:20:32+02:00')

这是一个明确的符号,应该始终有效(Y-m-d也可以正常工作,根据您的问题,它只存储一个没有任何时间的日期)。当使用任何其他符号时,RDBMS 总是存在问题,它必须知道它是否必须解释02/12/1977为 1977 年 2 月 12 日或 1977 年 12 月 2 日。此外,请确保myfield(在我的示例中)是否属于类型DateTimeDate并且您正确转义查询字符串中的保留字 varchardate

select foo, bar, `date`, foobar from mytable....

但是,MySQL 似乎“允许” date(因为“ MySQL 允许将某些关键字用作不带引号的标识符,因为许多人以前使用过它们。”这是一个愚蠢的理由)。最好始终坚持转义:

select `foo`, `bar`, `date`, `foobar` from `mytable` ....

请注意,在此示例中,我没有使用任何类型的MySQLiPDO 准备语句;您应该阅读SQL 注入,然后阅读这些主题,然后返回您的代码。

于 2013-06-03T20:26:31.823 回答
-1

您可以使用 php 类 Date 并使用他的格式功能

于 2013-06-03T20:38:55.377 回答