Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php SQL查询插入不起作用将值插入my DB_Php_Mysql_Sql_Insert - Fatal编程技术网

Php SQL查询插入不起作用将值插入my DB

Php SQL查询插入不起作用将值插入my DB,php,mysql,sql,insert,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、t

我试图在数据库中插入一些值,但它不起作用,我试图找出它不起作用的原因,但我是一名业余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
但它并没有出现在数据库或我的新闻页面上


有人能帮我吗?

by
是一个特殊的关键字。尝试将列名用记号标记:

INSERT INTO news(`id`,`title`,`body`,`date`,`by`)
尝试调用mysql_error()以获取错误消息:

首先,不要将单引号括在NULL周围,否则它将作为字符串输入

另外,我假设您正在使用来清理$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);
正如梅拉莫克指出的那样,
by
date
是特殊的关键词。最好在列(和表名)周围加上记号。(这将修复您的查询)


我希望id是你的主键。它不应该允许空值。如果它是自动递增的,您可以尝试以下方法:

$insert = mysql_query
    ("
    INSERT INTO news(title,body,date, by)
    VALUES ('".$title."','".$body."','".$date."','".$by."')
    ");
其他人注意到是一个保留字,所以你需要引用它。最好避免使用保留字命名数据库对象。考虑将<代码>改名为<代码> >栏> <代码>作者<代码> < /P> 你应该考虑把查询更改成事先准备好的语句。请参阅。

我建议使用&来处理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());
这也会让您知道遇到了什么错误

尽管如此,仍存在许多潜在问题:

  • ,您需要反勾号来避免在MySQL中使用它(参见上面的示例)。另一种方法是将列重命名为非保留字的名称——在每个列和/或表名上打勾会隐藏此类问题,而不是学习
  • NULL不应位于单引号内,否则将被解释为字符串<如果列上有默认约束,则代码>默认值将是另一个选项
  • date
    列应该是日期、日期时间或时间戳数据类型,而不是字符串才能使用,如果该值不是MySQL标准日期格式,则应该使用该列

您是否收到任何错误消息?另外,请注意,如果
$title
等来自用户输入,则不希望直接插入到查询中,否则将存在SQL注入漏洞。请看,您可能想要mysql_查询($sql)或死亡(mysql_error());以获取有关错误的更多信息。还要确保名为
id
Ah非常感谢:)的列中允许有空值,我不能再接受你的回答7分钟,我会再检查,再次感谢巴德:)我想这同样适用于日期。good point.NULL是触发
自动增量
默认
约束的公认方法。但是OP在单引号中指定了NULL,所以它会被解释为一个字符串……我在将它们设置为NULL时遇到了默认和自动增量约束的问题,但是Oracle通过JDBC准备的语句实现了这一点。通常,我会尽量避免指定查询中没有数据或不需要数据的列。
$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());