【问题标题】:my php script enters blank info into mysql db!我的 php 脚本将空白信息输入 mysql db!
【发布时间】:2010-12-20 22:42:25
【问题描述】:

当我尝试从表单输入数据时,它会添加一个新条目,正如我从 phpmyadmin 看到的那样,但不会传输其他详细信息

我正在使用一个简单的表单,它收集了 9 个文件,post 是 update.php。这是我在 update.php 中的内容

<?php
$realname = $_POST['realname'];
$age = $_POST['age'];
$country = $_POST['country'];
$gamename = $_POST['gamename'];
$gamelevel = $_POST['gamelevel'];
$itemlevel = $_POST['itemlevel'];
$class = $_POST['class'];
$played = $_POST['played'];
$support = $_POST['support'];

mysql_connect ("localhost", "mydb_userid", "MYPASSWORD") or die ('Error: ' . mysql_error());
mysql_select_db ("mydb_recruitment");

$query="INSERT INTO applicants (ID, realname, age, country, gamename, gamelevel, itemlevel, class, played, support)VALUES ('NULL','".$realname."','".$age."','".$country."','".$gamename."','".$gamelevel."','".$itemlevel."','".$class."','".$played."','".$support."')";

mysql_query($query) or die ('Error updating DB');

echo "You have sucessfully sent an application. Your details will be reviewed and someone will get back to you";

?>

希望有人可以提供帮助,在网上搜索似乎暗示了一些关于全局变量的信息 - 但我不知道我是否可以控制它作为一个托管站点。

这是注册表单:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Candidate Registration</title>
</head>

<body>

<form medthod="post" action="update.php">

Real Name:<br />
<input type="text" name="realname" size="50" /><br />

Age:<br />
<input type="text" name="age" size="10" /><br />

Country:<br />
<input type="text" name="country" size="20" /><br />

In Game Name:<br />
<input type="text" name="gamename" size="30" /><br />

In Game Level:<br />
<input type="text" name="gamelevel" size="10" /><br />

In Game Item Level:<br />
<input type="text" name="itemlevel" size="10" /><br />

Class Played:<br />
<input type="text" name="class" size="30" /><br />

How long have you played wow?:<br />
<input type="text" name="played" size="10" /><br />

Please enter a brief statement of why you want to join:<br />
<input type="text" name="support" size="5000" /><br />
<br />
<input type="submit" value="Update DB" />

</form>
</body>
</html>

这是 update.php 表单

<?php
$realname = $_POST['realname'];
$age = $_POST['age'];
$country = $_POST['country'];
$gamename = $_POST['gamename'];
$gamelevel = $_POST['gamelevel'];
$itemlevel = $_POST['itemlevel'];
$class = $_POST['class'];
$played = $_POST['played'];
$support = $_POST['support'];

mysql_connect ("localhost", "mydb_daniel", "mypwd") or die ('Error: ' . mysql_error());
mysql_select_db ("mydb_recruitment");

$query="INSERT INTO applicants (ID, realname, age, country, gamename, gamelevel, itemlevel, class, played, support)VALUES ('NULL','".$realname."','".$age."','".$country."','".$gamename."','".$gamelevel."','".$itemlevel."','".$class."','".$played."','".$support."')";

mysql_query($query) or die ('Error updating DB');

echo "You have sucessfully sent an application. Your details will be reviewed and someone will get back to you";

?>

我理解人们对安全性的担忧,但请理解这只是为了让我搞砸并为我的公会制作一个基本的注册表单,我不会要求信用卡详细信息:)

【问题讨论】:

  • 您是否指定了 html 表单元素的名称属性,例如&lt;input type="text" name="realname" /&gt;
  • 您的方法拼写错误,请更新并重试

标签: php mysql forms


【解决方案1】:

您的表单方法是否设置为 POST? - 除非您已明确添加此变量,否则变量将位于 $_GET 超全局变量中,因此您的变量将如下所示:

$realname = $_GET['realname'];

如果设置为 POST - 请在您的脚本顶部执行 var_dump($_POST) 并查看是否有任何变量进入您的脚本。

当人们在.htaccess 从 domain.com 重定向到 www.domain.com 并且他们将脚本显式地发布到 domain.com/script.php 然后脚本然后重定向到 www.domain.com/script.php 并清空 POST。

编辑

您在表单标签中拼写了 method 错误 - 如果您更新它,那么它应该可以工作,因为您的拼写错误将导致变量作为 GET vars 发送。

您可以通过以下基本方式解决您的安全问题:

$realname = mysql_real_escape_string($_POST['realname']);
$age = mysql_real_escape_string($_POST['age']);
$country = mysql_real_escape_string($_POST['country']);
$gamename = mysql_real_escape_string($_POST['gamename']);
$gamelevel = mysql_real_escape_string($_POST['gamelevel']);
$itemlevel = mysql_real_escape_string($_POST['itemlevel']);
$class = mysql_real_escape_string($_POST['class']);
$played = mysql_real_escape_string($_POST['played']);
$support = mysql_real_escape_string($_POST['support']);

【讨论】:

  • 老天爷,求积分的方法。编辑您的答案以包含答案,编辑以包含我的建议,实际上要求提问者选择您的答案。真的吗?你的正直人在哪里?请注意,出于绝对的挫败感,我在 cmets 中要求我的。
  • @Zenph 哈哈。我编辑了我的答案以包含 i 回答的问题的答案。我添加了 mysql_real_escape_string 来回答他关于安全的进一步问题,我不知道你发明了这种技术!我根本不是想抢分,但当新海报不明白他们需要接受答案时,这很令人沮丧。如果你真的回答了他提出的问题,我会很高兴你得到接受的答案——如果你记得的话——实际上不是关于安全性,而是关于为什么他的表格不起作用
  • @Daniel 将您的 mysql_connectmysql_select_db 移动到您的脚本顶部,在开始的 php 标记之后
  • 我什至不关心谁的答案被选中了。实际上,在选择您的答案后,我对您的答案进行了投票,因为那里有安全信息。在您完全缺乏对安全性的关注变成关于它的编辑答案之后,我只是觉得有点“肮脏”。
  • @Zenph Dude,来吧。完全缺乏对安全性的关注有点过分了。我同意你所说的大部分内容,我会给你一个赞成票,现在继续。
【解决方案2】:

哇,慢点。你甚至没有逃过这些数据!

$realname = mysql_real_escape_string($_POST['realname']);

或者逃避这一切:

$_POST = array_map('mysql_real_escape_string', $_POST);

请注意,第二种解决方案并不完全可靠。会产生一些奇怪的结果。通常最好通过函数/类运行这些输入以进行验证和清理。

在您的幽灵问题上,试试这个并在表单提交后记录响应(放在顶部):

var_dump($_POST);
exit;

您在查询中拼写错误的方法属性,这就是它不起作用的原因。

【讨论】:

  • 是的,但一次只做一件事 :)
  • 一点也不,应该同时做!这种事情应该是需要的。只有当他们倾听的人(比如你)不断向他们重复:安全第一时,开发人员才会改变他们的想法!
  • 我同意你的看法——array_map 建议不是一个好的开始,因为它确实忽略了基本面,只有在你能够理解积极的时才应该考虑> 它会导致的负面问题。
  • array(0) { } 您已成功发送申请。我们会审核您的详细信息,并会有专人回复您
  • @Daniel - 你是否像我在帖子中提到的那样在.htaccess 中进行任何重定向?
猜你喜欢
  • 2020-03-04
  • 2013-08-16
  • 2013-12-18
  • 2019-03-21
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
相关资源
最近更新 更多