我正在尝试将一些值插入到我的数据库中,但它不起作用,我正在试图找出它为什么不起作用,但我是一个业余的php编码器,
这是我正在使用的代码:
$insert = mysql_query
("
INSERT INTO news(id,title,body,date,by)
VALUES ('NULL','".$title."','".$body."','".$date."','".$by."')
");
mysql_close($connect);
我想插入的行是:id,title,body,date,by 但它没有出现在数据库或我的新闻页面上。
有人可以帮帮我吗?
答案 0 :(得分:5)
by
是一个特殊关键字。尝试用刻度线包装列名:
INSERT INTO news(`id`,`title`,`body`,`date`,`by`)
答案 1 :(得分:2)
我希望id是你的主键。它不应该允许空值。如果是自动递增,您可以尝试:
$insert = mysql_query
("
INSERT INTO news(title,body,date, by)
VALUES ('".$title."','".$body."','".$date."','".$by."')
");
其他人注意到这是一个保留字,所以你需要引用它。最好避免使用保留字命名数据库对象。考虑将by
列重命名为author
。
您应该考虑将查询更改为预准备语句。请参阅How can I prevent SQL injection in PHP?。
答案 2 :(得分:1)
尝试调用mysql_error()来获取错误消息: http://php.net/manual/en/function.mysql-error.php
答案 3 :(得分:1)
首先,不要将单引号括在NULL之外,否则它将作为字符串输入。
另外,我假设您正在使用mysql_real_escape_string来清理$ title,$ body等。
$title = mysql_real_escape_string($title);
$body = mysql_real_escape_string($body);
$date = mysql_real_escape_string($date);
$by = mysql_real_escape_string($by);
正如mellamokb指出的那样,by
和date
是特殊关键字。最好的做法是在列(和表名)周围加上刻度。 (这将修复您的查询)
$query = "INSERT INTO `news` (`id`, `title`, `body`, `date`, `by`) VALUES
(NULL, '" . $title . "', '" . $body . "', '" . $date . "', '" . $by . "');";
if ($insert = mysql_query($query, $connect)) {
// Success!
} else {
echo 'MySQL Error: ' . mysql_error($connect); // this will tell you whats wrong
}
mysql_close($connect);
答案 4 :(得分:1)
我建议使用sprintf& mysql_real_escape_string处理SQL注入攻击的可能性:
$insert = sprintf("INSERT INTO news
(id, title, body, date, `by`)
VALUES
(NULL,'%s','%s','%s','%s')",
mysql_real_escape_string($title),
mysql_real_escape_string($body),
mysql_real_escape_string($date),
mysql_real_escape_string($by));
$result = mysql_query($insert) or die(mysql_error());
这会让你知道遇到了什么错误。
尽管如此,还有很多潜在的问题:
DEFAULT
将是另一种选择
date
列应该是DATE,DATETIME或TIMESTAMP数据类型而不是字符串才能使用MySQL Date/Time functionality,如果值不是,则应使用DATE_FORMAT MySQL标准日期格式