Php 将$\u GET传递到mySQL查询中

Php 将$\u GET传递到mySQL查询中,php,mysql,Php,Mysql,所以我有这个 $name = $_GET['fullname']; $username = $_GET['username']; $password = $_GET['password']; $gender = $_GET['gender']; $query = "INSERT INTO main (name, username, password,gender) VALUES (" . $name . "," . $username . "," . $password . ", " . $

所以我有这个

$name = $_GET['fullname'];
$username = $_GET['username'];
$password = $_GET['password'];
$gender = $_GET['gender'];

$query = "INSERT INTO main (name, username, password,gender) VALUES (" . $name . "," .  $username . "," . $password . ", " . $gender . ");";

mysql_query($query) or die(mysql_error());
我将url传递为:
http://my.website.com/submit_user_info.php?fullname=myfullname&username=myusername&password=mypassword&gender=m

如果我将
$query
重写为具有硬编码的值,例如
值(myfullname,“…等)
它可以正常工作,但使用
$\u GET
s进行查询时会出现错误:

Unknown column 'myfullname' in 'field list'

为什么会发生这种情况?我如何解决这个问题?我通常不使用PHP/MySQL,所以我不太熟悉。

在变量周围加上单引号。

您需要在所有变量周围加引号:

// Sanitize with mysql_real_escape_string()
$name = mysql_reaL_escape_string($_GET['fullname']);
$username = mysql_reaL_escape_string($_GET['username']);
$password = mysql_reaL_escape_string($_GET['password']);
$gender = mysql_reaL_escape_string($_GET['gender']);

// Escaped values can be interpolated in the double-quoted string.
$query = "INSERT INTO main (name, username, password,gender) VALUES ('$name','$username','$password','$gender');";

因为您使用的是双引号字符串,所以您可以简单地将变量包含在由单引号包围的字符串中,以便正确插入,而不是将它们与
串联在一起。并非所有人都同意在双引号字符串中插入变量的做法,但它为类似的情况增加了很多可读性这可能会使调试更容易。

您应该查看。您永远不希望允许直接插入GET或POST请求提供的变量,而不首先转义它们以防止SQL错误或错误。您所做的操作风险极大。

在清理输入的旁边,您还可以参数化查询:

$vars = array('fullname', 'username', 'password', 'gender');
$query = "INSERT INTO main (name, username, password, gender) VALUES ('%s', '%s', '%s', '%s');";
$source = $_GET;

$vals = array_intersect_key($source, array_flip($vars));
if (count($vals) !== count($vars)) {
    throw new RuntimeException('Invalid Request, missing variables: '.implode(', ', array_keys(array_diff_key(array_flip($vars), $source))));
}

if (!mysql_query(vsprintf($query, array_map('mysql_reaL_escape_string', $vals)))) {
    throw new RuntimeException('Database Error: '.mysql_error());
}

这只是一些快速的书面示例,您应该考虑使用mySQL而不是mysql(参见)建议大家看一看。

别忘了清理用户输入!!!小心sql注入-而且,永远不要使用
$\u GET
插入数据库。始终使用
$\u POST
。你最不需要的是webcrawler机器人篡改你的数据库。我使用$\u GET的原因是我可以通过iPhone应用程序传入url字符串“嗯developing@Chris:你不能从你的应用程序中手工制作标题吗?请参阅:有关基本的帖子示例。如果代码示例不适用,请忽略代码示例,集中在标题示例上。该死的,你以某种方式在几秒钟内就找到了答案。握手:pWorks非常好,谢谢。单引号和双引号让我很失望