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_incrementDEFAULT 约束的方法。但是 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 指出的,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】:

尝试调用 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 插入列 - 如何强制标识增加? [关闭]

如何通知我的 WPF 应用程序我的 SQL 查询在插入数据库时​​跳过了重复的行?

PHP MySQLi不执行插入查询[重复]

pymssql INSERT 不会自动增加 ID

是否可以在sql中使用insert插入多个值

无法准备 SQL 语句 [重复]