将$ _GET传递给mySQL查询

时间:2012-02-28 01:39:42

标签: 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 . ", " . $gender . ");";

mysql_query($query) or die(mysql_error());

我将网址传递给: http://my.website.com/submit_user_info.php?fullname=myfullname&username=myusername&password=mypassword&gender=m

如果我重写$query以获得VALUES (myfullname,"...etc.这样的硬编码值,它可以正常工作,但我使用$_GET的查询会给出错误:

Unknown column 'myfullname' in 'field list'

为什么会这样?我该如何解决?我通常不会做PHP / MySQL,所以我不太熟悉。

4 个答案:

答案 0 :(得分:5)

您需要围绕所有变量的引号:

// 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');";

由于您使用的是双引号字符串,因此您可以简单地将变量包含在由单引号括起的字符串中,以便正确插值,而不是将它们与.连接起来。并非所有人都同意在双引号字符串中插入变量,但它为这种情况增加了很多可读性,并且可能使调试更容易。

答案 1 :(得分:4)

在变量周围放置单引号。

答案 2 :(得分:1)

您应该查看mysql_real_escape_string。您永远不希望直接插入由GET或POST请求提供的变量,而不首先转义它们以防止SQL错误或SQL injection。你正在做的事情是非常危险的。

答案 3 :(得分:0)

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

$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());
}

这只是一些快速编写的示例,您应该考虑使用mysqli而不是mysql(请参阅Choosing an API­Docs),建议您查看the PHP Data Objects (PDO) extension­Docs