一个脚本中有很多$ _GET

时间:2011-01-04 22:07:04

标签: php variables get

我想使用PHP脚本将大约20个变量传递给mysql表。有没有比做更好的方式:

$var1= preg_replace('/[^\w\.\-\& ]/', '', $_GET["var1"]);
$var2= preg_replace('/[^\w\.\-\& ]/', '',($_GET["var2"]));
$var3= preg_replace('/[^\w\.\-\& ]/', '',($_GET["var3"]));

然后有一大堆代码:

$query = "INSERT INTO tbl_users (var1, var2, var3 etc.) VALUES('$var1', '$var2', '$var3' etc.)"

提前致谢, Sondar

5 个答案:

答案 0 :(得分:1)

不要担心字段数量,20不大。

但是,您应该使用数据库提供的转义函数。如果您使用的是mysql_ *函数,则可以使用mysql_real_escape_string

如果您使用PDO(推荐),请使用绑定参数。

答案 1 :(得分:0)

$a = $_GET;
foreach($i = 0;$i<count($a); $i++) {
    $b[] = preg_replace('/[^\w.-\& ]/', '', $a[$i]);
}

这应循环遍历所有post变量,使用表达式验证它们并将其转储到$ b。但我不知道如何缩短$query = "INSERT INTO tbl_users (var1, var2, var3 etc.) VALUES('$var1', '$var2', '$var3' etc.)"

答案 2 :(得分:0)

$get_values = array();
foreach($_GET as $name=>$val) {
    $get_values[$name] = preg_replace('/[^\w\.\-\& ]/', '', $val);
}

$query = 'INSERT INTO tbl_users ('.implode(', ', array_keys($get_values)).') VALUES('.implode(', ', $get_values).')';

答案 3 :(得分:0)

可能有很多方法。这个将假设您的$_GET变量名称和表字段名称完全匹配。

$var_list = array('var1', 'var2', 'var3'); // as many as you want

// this filters GET to be just your variables
$params = array_intersect_key($_GET, array_fill_keys($var_list, ''));

$query = "INSERT INTO tbl_users (" . implode(',', array_keys($params)) . ") VALUES (";

foreach ($params as $val) {
    $query .= mysql_real_escape_string($val);
}
$query .= ")";

编辑:

如评论中所述,您需要注意这里的密钥。将密钥粘贴到查询中的一般方法就像这样非常糟糕,如果你不像我在这里那样过滤它们。如果不是array_keys($params)而是类似array_keys($_GET),那么你就可以大张旗鼓地注入SQL了。确保您正在清理输入,键和值。

答案 4 :(得分:0)

正如大家所述,简化它的显而易见的方法是使用帮助程序代码。我用for example解决了这两个问题:

foreach ($_GET->keys() as $id) {
    $var[$id] = $_GET->text[$id];
}

$_GET->text["var12"]自动应用正则表达式过滤器。

或者为了插入而不用担心手动SQL转义,建议使用预准备语句。但是你仍然需要特殊的支持来插入行:

db("INSERT INTO users (:?) VALUES (??)", array_keys($var),
                                         array_values($var));

使用简单的ORM来避免手动SQL手工制作。 Idiorm很不错。