Php MySQL插入到特定字段失败
我相信我的代码中有什么东西阻止了PHP被插入到数据库中,这很奇怪,因为我在站点上的其他表单中使用了相同的设置,所有这些表单都成功地解析了PHP 最让我困惑的是,如果只指定了Php MySQL插入到特定字段失败,php,mysql,Php,Mysql,我相信我的代码中有什么东西阻止了PHP被插入到数据库中,这很奇怪,因为我在站点上的其他表单中使用了相同的设置,所有这些表单都成功地解析了PHP 最让我困惑的是,如果只指定了用户名和密码,表单将成功通过,但当我尝试添加电子邮件(也是varchar)和组(1个字符的整数)时,表单失败。我在下面添加了我的代码,希望你能帮我找出我做错了什么 PHP: HTML: 添加用户 用户名 暗语 电子邮件 '; ?> 组 大学生 教师 管理 提交 组是一个保留关键字,您应该避免将这些单词作为列名。 但是,如果您
用户名
和密码
,表单将成功通过,但当我尝试添加电子邮件(也是varchar
)和组(1个字符的整数)时,表单失败。我在下面添加了我的代码,希望你能帮我找出我做错了什么
PHP:
HTML:
添加用户
用户名
暗语
电子邮件
'; ?>
组
大学生
教师
管理
提交
组是一个保留关键字,您应该避免将这些单词作为列名。
但是,如果您想使用它,请将它们包装成反勾号
`group`
在这里签出完整的列表
标准SQL as列禁止表中的大多数单词
或表名(例如,组)。一些是保留的,因为MySQL
需要它们并使用yacc解析器
group是一个保留关键字,您应该避免将这些单词作为列名。 但是,如果您想使用它,请将它们包装成反勾号
`group`
在这里签出完整的列表
标准SQL as列禁止表中的大多数单词
或表名(例如,组)。一些是保留的,因为MySQL
需要它们并使用yacc解析器
代码中最大的错误是实际的
mysql\u查询
行:
$result = mysql_query($result);
因此,正在运行的查询是$result
(甚至没有设置),而$result
是查询$result
的$result
?这不应该像这样使用$order
:
$result = mysql_query($order);
您的代码还存在一些其他问题,包括使用保留的MySQL名称<代码>组-因此我重构了您的代码,以覆盖所有基础。包括修改您的mysql\u*
调用以使用mysqli\u*
,因为mysql\u*
在PHP版本5.3到5.4中被贬值,并且完全从PHP 5.5中删除。给你。附注如下:
// Connecting, selecting database
$link = mysqli_connect('DOMAIN', 'USERNAME', 'PASSWORD', 'DATABASE') or die(mysqli_connect_errno());
// Set a '$_POST' array and roll through each value.
$post_array = array('name', 'pass', 'email', 'group');
foreach ($post_array as $post_key => $post_value) {
$$post_value = isset($_POST[$post_value]) && !empty($_POST[$post_value]) ? $_POST[$post_value] : null;
}
// MD5 the password.
$pass = md5($pass);
// Unsure if you need to add slashes if you are using mysqli_stmt_bind_param.
// So including here if you need it. Just change the mysqli_stmt_bind_param to use $email_md5
$email_md5 = addslashes($email);
// Set the query.
$order = "INSERT INTO `users` (`name`, `pass`, `email`, `group`)"
. " VALUES (?, ?, ?, ?)"
;
// Bind the params.
mysqli_stmt_bind_param($order, 'ssss', $name, $pass, $email, $group);
// Run the query.
$result = mysqli_query($link, $order) or die(mysqli_error());
if ($result) {
header("Location: manageusers.php?result=success&name=$name");
}
// Free the result set.
mysqli_free_result($result);
// Close the connection.
mysqli_close($link);
以下是我所做工作的细目:
- 您的查询行是:
但不应该是$result=mysql\u query($result)
$result=mysqli\u query($order)代码>?我为mysqli重写了那一行,但这是我发现的最大错误
- 我将您的代码改为使用MySQLi扩展,这是现在做事情的首选方式,因为在PHP版本5.3到5.4中,
被贬低,并且完全从PHP5.5中删除mysql.*
- 我还设置了一个
数组,这样所有的POST键都可以简单地滚动&使用$\u POST
和isset
。与以前的脚本相比,将此与相结合可以提供更多的基本验证进行一些基本验证!空的
- 您正试图在表名
中插入,但group
实际上是一个不应使用的MySQL保留字。如果使用了它,它应该像我的代码中所示那样放在后面的记号中group
- 我还使用命令将参数实际绑定到查询,这是一种防止再次注入MySQL的简单方法。还可以使用和整洁地关闭MySQL进程
- 你的“成功”代码毫无意义。您有一个
,在一行上没有任何内容,后跟echo
标题(…)代码>调用,然后后跟
die()代码>。我删除了
以及echo
die()
- 代码中最大的错误是实际的
mysql\u查询
行:
$result = mysql_query($result);
因此,正在运行的查询是$result
(甚至没有设置),而$result
是查询$result
的$result
?这不应该像这样使用$order
:
$result = mysql_query($order);
您的代码还存在一些其他问题,包括使用保留的MySQL名称<代码>组-因此我重构了您的代码,以覆盖所有基础。包括修改您的mysql\u*
调用以使用mysqli\u*
,因为mysql\u*
在PHP版本5.3到5.4中被贬值,并且完全从PHP 5.5中删除。给你。附注如下:
// Connecting, selecting database
$link = mysqli_connect('DOMAIN', 'USERNAME', 'PASSWORD', 'DATABASE') or die(mysqli_connect_errno());
// Set a '$_POST' array and roll through each value.
$post_array = array('name', 'pass', 'email', 'group');
foreach ($post_array as $post_key => $post_value) {
$$post_value = isset($_POST[$post_value]) && !empty($_POST[$post_value]) ? $_POST[$post_value] : null;
}
// MD5 the password.
$pass = md5($pass);
// Unsure if you need to add slashes if you are using mysqli_stmt_bind_param.
// So including here if you need it. Just change the mysqli_stmt_bind_param to use $email_md5
$email_md5 = addslashes($email);
// Set the query.
$order = "INSERT INTO `users` (`name`, `pass`, `email`, `group`)"
. " VALUES (?, ?, ?, ?)"
;
// Bind the params.
mysqli_stmt_bind_param($order, 'ssss', $name, $pass, $email, $group);
// Run the query.
$result = mysqli_query($link, $order) or die(mysqli_error());
if ($result) {
header("Location: manageusers.php?result=success&name=$name");
}
// Free the result set.
mysqli_free_result($result);
// Close the connection.
mysqli_close($link);
以下是我所做工作的细目:
- 您的查询行是:
但不应该是$result=mysql\u query($result)
$result=mysqli\u query($order)代码>?我为mysqli重写了那一行,但这是我发现的最大错误
- 我将您的代码改为使用MySQLi扩展,这是现在做事情的首选方式,因为在PHP版本5.3到5.4中,
被贬低,并且完全从PHP5.5中删除mysql.*
- 我还设置了一个
数组,这样所有的POST键都可以简单地滚动&使用$\u POST
和isset
。与以前的脚本相比,将此与相结合可以提供更多的基本验证进行一些基本验证!空的
- 您正试图在表名
中插入,但group
实际上是一个不应使用的MySQL保留字。如果使用了它,它应该像我的代码中所示那样放在后面的记号中group
- 我还使用命令将参数实际绑定到查询,这是一种防止再次注入MySQL的简单方法。还可以使用和整洁地关闭MySQL进程
- 您的“成功”代码