SQL查询INSERT无法将值插入我的数据库[重复]
Posted
技术标签:
【中文标题】SQL查询INSERT无法将值插入我的数据库[重复]【英文标题】:SQL query INSERT not working inserting values into my DB [duplicate] 【发布时间】:2011-07-07 11:56:37 【问题描述】:我正在尝试将一些值插入到我的数据库中,但它不起作用,我试图弄清楚为什么它不起作用但我是一个业余 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 但它没有出现在数据库或我的新闻页面上。
有人可以帮帮我吗?
【问题讨论】:
您是否收到任何错误消息?另外请注意,如果$title
等来自用户输入,您将不希望直接插入到查询中,否则您将有SQL注入漏洞。见***.com/questions/60174/…
你可能想要 mysql_query($sql) 或 die(mysql_error());获取有关错误的更多信息。还要确保在名为id
的列中允许使用 NULL 值
【参考方案1】:
我希望 id 是您的主键。它不应该允许空值。如果它是自动递增的,你可以试试这个:
$insert = mysql_query
("
INSERT INTO news(title,body,date, by)
VALUES ('".$title."','".$body."','".$date."','".$by."')
");
其他人注意到 by 是保留字,因此您需要引用它。最好避免使用保留字命名数据库对象。考虑将by
列重命名为author
。
您应该考虑将查询更改为准备好的语句。见How can I prevent SQL injection in PHP?。
【讨论】:
NULL 是一种可接受的触发auto_increment
或DEFAULT
约束的方法。但是 OP 在单引号中指定了 NULL,所以它会被解释为一个字符串......
我在将 default 和 auto_increment 约束设置为 null 时遇到了问题,但那是 Oracle 通过 JDBC 准备好的语句。我通常会尽量避免在查询中指定我有或不希望有数据的列。【参考方案2】:
我推荐使用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,如果值不是 MySQL 标准日期格式,则应该使用 DATE_FORMAT李>
【讨论】:
【参考方案3】:首先,不要将单引号放在 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】:尝试调用 mysql_error() 来获取错误信息: http://php.net/manual/en/function.mysql-error.php
【讨论】:
【参考方案5】:by
是一个特殊的关键字。尝试将列名包含在刻度线中:
INSERT INTO news(`id`,`title`,`body`,`date`,`by`)
【讨论】:
啊,非常感谢:), 我不能再接受你的回答 7 分钟,我会回来查看,再次感谢 bud :) 我认为同样适用于日期。好点。以上是关于SQL查询INSERT无法将值插入我的数据库[重复]的主要内容,如果未能解决你的问题,请参考以下文章
无法将值 NULL 插入列 - 如何强制标识增加? [关闭]