php mysql_查询在插入后不返回任何内容(也不插入任何内容)
我有以下代码:php mysql_查询在插入后不返回任何内容(也不插入任何内容),php,mysql,Php,Mysql,我有以下代码: <?php if(!empty($error_msg)) print("$error_msg"); else { require_once("../include/db.php"); $link = mysql_connect($host,$user,$pass); if (!$link) print('Could not connect: ' . mysql_error()); else {
<?php
if(!empty($error_msg))
print("$error_msg");
else
{
require_once("../include/db.php");
$link = mysql_connect($host,$user,$pass);
if (!$link)
print('Could not connect: ' . mysql_error());
else
{
$sql = "insert into languages values(NULL,'$_POST[language]','$_POST[country_code]');";
$res = mysql_query($sql);
print("$sql<br>\n");
print_r("RES: $res");
mysql_close($link);
}
}
?>
mysql\u查询
将为插入查询返回一个布尔值。如果您var\u dump
$res
,您应该会看到正在打印一个布尔值。如果查询成功,它将返回TRUE;如果查询出错,它将返回FALSE。在任何情况下,它都不会返回NULL
此外,永远不要将输入数据(例如:$\u POST)直接传递到SQL查询。这是SQL注入的一个配方。首先对其使用mysql\u real\u escape\u string
:
$language = mysql_real_escape_string($_POST['language']);
$sql = "INSERT INTO language SET language='$language'";
不要忘记引用数组索引(例如:$\u POST['language']
,而不是$\u POST[language]
),以防止e\u注意到错误。--我收回了引用注释,但直接插入$\u POST值仍然不好--
第二,我不认为我见过像那样使用打印,试着使用回音
而mysql\u查询只需要在INSERT上返回一个布尔值,您需要什么?您需要指定一个数据库,以便系统知道在哪个数据库上运行查询
如果不选择数据库,您的数据将不会通过INSERT
查询插入,mysql\u查询将根据查询成功与否返回true或false。在这里,它很可能返回false。更改行print_r(“RES:$RES”)代码>到<代码>打印(“RES:”(int)$RES)
并且您很可能会看到它打印RES:0
问题可能是MySQL希望在value
关键字之前有一个列名列表
此外,您似乎正在将POST变量直接插入到SQL中—您应该仔细阅读SQL注入,看看为什么这是一个坏主意。mysql\u查询为插入查询返回一个布尔值。如果在字符串上下文中使用,例如echo“$res”
,true
将显示为1
,false
为空字符串。可能发生了查询错误。用于查找查询失败的原因
$sql = "insert into languages values(NULL,'$_POST[language]','$_POST[country_code]');";
这是非常糟糕的做法,因为恶意用户可以向服务器发送精心编制的消息(请参阅)
您至少应该转义输入。假设您的列名命名为“language”和“country_code”,这是对上述代码的更好替代:
$sql = sprintf('INSERT INTO LANGUAGES (language, country_code) VALUES ("%s","%s")',
mysql_real_escape_string($_POST['language']),
mysql_real_escape_string($_POST['country_code'])
);
有关mysql\u real\u escape\u string函数的说明,请参阅。对于初学者和有经验的程序员来说,这仍然是获取PHP函数信息的最佳资源
我建议不要直接使用$\u POST
,而是使用函数。从PHP 5.2开始就可以使用它。现在我有了这个:
$language=mysql\u real\u escape\u字符串($\u POST['language']);
$country\u code=mysql\u real\u escape\u字符串($\u POST['country\u code'])
$sql=“插入共享的内容语言(id、语言、国家代码)值(NULL、$language、$country代码);”;
$res=mysql\u查询($sql);
打印(“$sql
\n”);
var_dump($res);
打印(mysql_error());
mysql_close($link);
以及输出:
插入共享的内容语言(id、语言、国家代码)值(NULL、荷兰、NL);
bool(false)“字段列表”中的未知列“荷兰”echo$sql,并在此处发布结果。始终定义要插入的列。现在的设置方式如果结构发生更改,查询将中断。以后不要为自己做更多的工作。您的查询中可能有一些错误。.插入到语言值中(NULL,'nerlands','NL');数据类型是char(30)和char(5)+1,尽管我更喜欢var_dump而不是(int)cast,因为var_dump可以准确地显示它是什么。整个字符串是一个双引号字符串,所以这不会有问题。单引号是PHP的文字字符?选择返回什么吗?+1我想我们都错过了那个。好电话。只是一张便条,不是强制性的。类似于INSERT-INTO-database.languages
的查询也可以使用(不过OP没有这样做)。如果未指定链接标识符,则mysql\u connect()打开的最后一个链接是assumed@mooizo:数据库链接由mysql\u connect
生成,而不是mysql\u select\u db
。您必须以某种方式定义要使用的数据库。字符串中的无引号数组索引将不会出现警告@安德烈:你说得对。我之所以提到它,是因为我用它来引述。然而,我认为你最好还是引用它来保持一致性;$country\u code=mysql\u real\u escape\u字符串($\u POST['country\u code']);$sql=“插入到共享的_content.languages值中(空,$language',$country_code”);”;$res=mysql\u查询($sql);
$sql = "insert into shared_content.languages (id,language,country_code) values(NULL,$language,$country_code);";
$res = mysql_query($sql);
print("$sql<br>\n");
var_dump($res);
print(mysql_error());
mysql_close($link);