MySQL在特定字段中插入失败

时间:2014-06-08 16:24:09

标签: php mysql

我相信我的代码中的某些东西会阻止PHP插入到数据库中,这很奇怪,因为我在网站上的其他表单中使用了相同的设置,这些设置都成功解析。

最令我困惑的是,如果只指定了usernamepassword,但是当我尝试添加电子邮件时({{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);

2 个答案:

答案 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.3到5.4中的mysqli_*已被折旧,并且已从PHP 5.5中完全删除。
  • 我还设置了一个mysql_*数组,因此所有的帖子键都可以简单地通过&使用$_POSTisset进行一些基本验证。将此与mysqli_stmt_bind_param相结合可以为您提供比以前的脚本更多的基本验证。
  • 您正在尝试插入表名!empty,但group实际上是不应使用的MySQL保留字。如果使用它,它应该放在后面的刻度中,如我的代码所示。
  • 我还使用命令mysqli_stmt_bind_param将参数实际绑定到查询,这是一种防止MySQL注入的简单方法。还使用mysqli_free_resultmysqli_close整齐地关闭MySQL进程。
  • 您的“成功”代码毫无意义。您有一个GROUP在一行中没有任何内容,之后是echo调用,然后是header(…);。我删除了die();以及echo,因为这在技术上并不是错误的,但这并不是真的需要。