SQL查询INSERT无法在我的数据库中插入值

时间:2011-03-02 18:17:59

标签: php mysql sql insert

我正在尝试将一些值插入到我的数据库中,但它不起作用,我正在试图找出它为什么不起作用,但我是一个业余的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 但它没有出现在数据库或我的新闻页面上。

有人可以帮帮我吗?

5 个答案:

答案 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指出的那样,bydate是特殊关键字。最好的做法是在列(和表名)周围加上刻度。 (这将修复您的查询)

$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());

这会让你知道遇到了什么错误。

尽管如此,还有很多潜在的问题:

  • by is a reserved keyword,你需要反引号来逃避它在MySQL中的使用(参见上面的例子)。另一种方法是将列重命名为不是保留字的内容 - 反写每列和/或表名称隐藏此类问题而不是学习
  • NULL不应该在单引号内,否则它将被解释为字符串;如果列
  • 上有DEFAULT约束,DEFAULT将是另一种选择
  • date列应该是DATE,DATETIME或TIMESTAMP数据类型而不是字符串才能使用MySQL Date/Time functionality,如果值不是,则应使用DATE_FORMAT MySQL标准日期格式