我相信我的代码中的某些东西会阻止PHP插入到数据库中,这很奇怪,因为我在网站上的其他表单中使用了相同的设置,这些设置都成功解析。
最令我困惑的是,如果只指定了username
和password
,但是当我尝试添加电子邮件时({{1}),表单将成功通过表格失败,并且一个组(1个字符的整数)。我在下面添加了我的代码,希望你能帮助我找出我做错了什么。
PHP:
varchar
HTML:
// Connecting, selecting database
$link = mysql_connect('DOMAIN', 'USERNAME', 'PASSWORD');
if (!$link)
{ die('Could not connect: ' . mysql_error());
}
mysql_select_db('DATABASE') or die('Could not select database');
// Convert form values to variables
$name = $_POST['name'];
$pass = md5($_POST['pass']);
$iemail = $_POST['email'];
$email = addslashes($iemail);
$group = $_POST['group'];
$order = "INSERT INTO `users` (name,pass,email,group)
VALUES ('$name','$pass', '$email', '$group')";
$result = mysql_query($result);
if($result)
{
echo
header("Location: manageusers.php?result=success&name=$name");
die();
}
else
{
mysql_error();
}
mysql_close($link);
答案 0 :(得分:3)
group是保留关键字,您应该避免使用这些单词作为列名。 但是,如果你想使用它将它们包装在反引号中
`group`
在此处查看完整列表http://dev.mysql.com/doc/refman/5.0/en/reserved-words.html
表中的大多数单词都被标准SQL禁止为列 或表名(例如,GROUP)。一些是保留的,因为MySQL 需要它们并使用yacc解析器
答案 1 :(得分:1)
代码中最大的错误是实际的mysql_query
行:
$result = mysql_query($result);
所以正在运行的查询是$result
(甚至没有设置),而$result
是查询$result
的{{1}}?不应该使用$result
而不是这样:
$order
您的代码还有一些其他问题 - 包括使用保留的MySQL名称; $result = mysql_query($order);
- 所以我重构了你的代码以涵盖所有基础。包括重新调整group
调用以使用mysql_*
,因为mysqli_*
在PHP版本5.3到5.4中已经过折旧,并且已从PHP 5.5中完全删除。这里是。以下注释:
mysql_*
以下是我所做的细分:
// 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_query($result);
?我为$result = mysqli_query($order);
改写了这一行,但这是我发现的最大错误。mysqli_*
已被折旧,并且已从PHP 5.5中完全删除。mysql_*
数组,因此所有的帖子键都可以简单地通过&使用$_POST
和isset
进行一些基本验证。将此与mysqli_stmt_bind_param
相结合可以为您提供比以前的脚本更多的基本验证。!empty
,但group
实际上是不应使用的MySQL保留字。如果使用它,它应该放在后面的刻度中,如我的代码所示。mysqli_stmt_bind_param
将参数实际绑定到查询,这是一种防止MySQL注入的简单方法。还使用mysqli_free_result
和mysqli_close
整齐地关闭MySQL进程。GROUP
在一行中没有任何内容,之后是echo
调用,然后是header(…);
。我删除了die();
以及echo
,因为这在技术上并不是错误的,但这并不是真的需要。