$sql='SELECT phrase,english FROM static_site_language WHERE page=?;';
$pds=$database->pdo->prepare($sql); $pds->execute(array($_POST['languagepage']));
上面的代码运行良好。但是我需要将另一个变量放入准备语句中。我已尝试以下方法,但似乎不起作用:
$sql='SELECT phrase,? FROM static_site_language WHERE page=?;';
$pds=$database->pdo->prepare($sql); $pds->execute(array($_POST['language'],$_POST['languagepage']));
我知道 $_POST['language'] (通过打印)仅包含“english”一词。
是否可以在选择的这一部分中放置一个准备变量?
thx
查询参数只能代替常量值——不能代替列名。
所有列和表都必须在您命名时命名prepare查询时,您不能将选择列推迟到后续执行步骤。
当您希望用户输入确定列名称时,请使用白名单地图将用户输入限制为有效选择。映射数组的键是合法的用户输入。映射数组的值是您要在 SQL 查询中使用的字符串,在本例中是列名称。
$lang_col_map = array(
"DEFAULT" => "english",
"en" => "english",
"es" => "spanish"
);
$lang_col = $lang_col_map[ $_POST["language"] ] ?: $lang_col_map[ "DEFAULT" ];
$sql='SELECT phrase,$lang_col FROM static_site_language WHERE page=?;';
$pds=$database->pdo->prepare($sql);
$pds->execute(array($_POST['languagepage']));
这样您就可以确保只有 $lang_col_map 中的值可以成为 SQL 查询的一部分,并且如果用户尝试在 http 请求中发送任何棘手的内容,它会被忽略,因为它与该映射的任何键都不匹配。因此查询是安全的,不会受到 SQL 注入的影响。
看我的演示SQL 注入神话和谬误 http://www.slideshare.net/billkarwin/sql-injection-myths-and-fallacies了解更多信息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)