首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP PDO + Prepare语句

PHP PDO + Prepare语句
EN

Stack Overflow用户
提问于 2011-12-30 10:55:40
回答 2查看 451关注 0票数 5
代码语言:javascript
复制
$sql='SELECT phrase,english FROM static_site_language WHERE page=?;';
$pds=$database->pdo->prepare($sql); $pds->execute(array($_POST['languagepage']));

上面的代码运行良好。但是,我需要在prepare语句中放入另一个变量。我尝试了以下方法,但似乎不起作用:

代码语言:javascript
复制
$sql='SELECT phrase,? FROM static_site_language WHERE page=?;';
$pds=$database->pdo->prepare($sql); $pds->execute(array($_POST['language'],$_POST['languagepage']));

我知道$_POST'language'只包含“$_POST”这个词。是否可以在select的这一部分中放置一个prepare变量?

thx

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-30 11:06:40

查询参数只能代替常量值,而不能代替列名。

所有列和表必须在准备查询时命名,您不能将选择列推迟到后续的执行步骤。

当您希望用户输入确定列名时,请使用白名单映射将用户输入限制为有效选择。映射数组的键是合法的用户输入。映射数组的值是要在SQL查询中使用的字符串,在本例中为列名。

代码语言:javascript
复制
$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注入的影响。

有关详细信息,请参阅my presentation SQL Injection Myths and Fallacies

票数 7
EN

Stack Overflow用户

发布于 2011-12-30 11:08:33

预准备语句仅支持数据库支持的值的参数。

在你的第二个陈述中,第一个"?“列名的占位符,而不是值。

您必须改用动态SQL语句。为此,您必须防止SQL注入。

代码语言:javascript
复制
$language_authorized = array('english', 'french', 'spanish');
$language = $_POST['language'];
if (in_array($language_authorized, $language)) {
  $sql='SELECT phrase,'.$language.' FROM static_site_language WHERE page=?;';
  $pds = $database->pdo->prepare($sql);
  $pds->execute(array($_POST['languagepage']));
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8675704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档