所以我有这个
$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,所以我不太熟悉。
答案 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 APIDocs),建议您查看the PHP Data Objects (PDO) extensionDocs。