使用$ _REQUEST和$ _POST将数据插入MySQL无法正常工作

时间:2013-07-11 20:58:28

标签: php mysql

$Con=mysql_connect('localhost', '849326_israel', '123456')
    or die('Problemas al seleccionar la base de datos');
mysql_select_db('pruebastest_zzl_registro', $Con)
    or die('Problemas db');
mysql_query("INSERT INTO RegUsuarios (Nombre, Email, PW) values
    ('$_REQUEST[Nombre]', '$_REQUEST[Email]', '$_REQUEST[PW]')",$Con) or die('Problema insertando datos');

它说...

  

Problemas insertando datos

我尝试使用$_POST但它不起作用!

非常感谢你帮助我,我发现错误是一个错字

在我的数据库中,我写了Emal而不是Email,因此数据无法处理

3 个答案:

答案 0 :(得分:3)

xkcd

现在已经没有了,错误消息告诉您插入查询存在问题。我想建议你试试这个:

$esc = "mysql_real_escape_string"; // for brevity
mysql_query($q="INSERT INTO `RegUsuarios` (`Nombre`,`Email`,`PW`) VALUES
    ('".$esc($_REQUEST['Nombre'])."','".$esc($_REQUEST['Email'])."',
    '".$esc($_REQUEST['PW'])."')");
if( $e = mysql_error()) {
  die("Error running the query:<br />".$q."<br />Error: ".$e);
}

这将转储它尝试运行的确切查询,以及确切的MySQL错误消息。在理想情况下,您可以将其记录到文件中,而不是公开显示,但出于开发目的,这样做会很好。请注意,我在表格和列名称周围添加了反引号` - 许多人会告诉您,只有在您将其命名为保留字时才需要它们,但我个人认为最好继续使用将它们放在所有名称周围的习惯:不仅使它更容易在视觉上识别这些名称(并允许颜色编码更好地工作),而且还有助于避免一些更模糊的关键字。另外,我已将or die更改为实际的if语句。这将允许您执行多项操作,例如记录到我提到的文件。

请注意,您无需始终传递$Con变量 - mysql扩展名的一个主要优点是它将自动采用上次打开的连接。

答案 1 :(得分:1)

您的代码存在一些问题。

首先,你不能简单地在这样的字符串中调用"$_REQUEST[Email]"。它不会获得变量的值,因为包含了括号。您必须改为使用"{$_REQUEST[Email]}"

其次,密钥EmailNombre是字符串,它足以使用"{$_REQUEST['Email']}"正确地声明它们。

此外,获取来自客户端的值并直接将它们放入SQL查询中而不进行过滤非常危险。您将自己的网站公开为SQL injection

来自客户端的所有数据都应使用mysql_real_escape_string()正确转义,然后再将其插入SQL查询中。

话虽如此,您的代码应该是:

$nombre = mysql_real_escape_string($_REQUEST['Nombre']);
$email  = mysql_real_escape_string($_REQUEST['Email']);
$pw     = mysql_real_escape_string($_REQUEST['PW']);
mysql_query("INSERT INTO RegUsuarios (Nombre,Email,PW) values
    ('{$nombre}','{$email}','{$pw}')",$Con) or die('Problema insertando datos');

存储纯文本密码也是一种不好的做法,不推荐使用mysql_ *函数,很快就会从PHP中删除它们。考虑将密码存储为sha1()哈希,并迁移您的代码以使用MySQLi

答案 2 :(得分:0)

您需要$_POST

内的引号
$_REQUEST['Nombre']

"INSERT INTO RegUsuarios (Nombre,Email,PW) values
('".$_REQUEST['Nombre']."','".$_REQUEST['Email']."','".$_REQUEST['PW']."')"

正如人们指出的那样,这段代码对SQL注入是开放的。考虑使用PDO