PDO - 将字段名称作为变量传递

时间:2012-07-06 08:57:03

标签: php mysql pdo migration

我只是将我的代码从mysql_query样式命令迁移到PDO样式,我遇到了一个问题。旧代码看起来像这样:

$query_list_menu = "SELECT ".$_GET['section_name']." from myl_menu_hide_show WHERE id='".$_GET['id']."'";

更新后的代码如下所示。显然它不起作用。我在$_GET['section_name']中存储一个字符串,表示数据库中的字段名称。但是当我将它作为变量传递时,我认为存在问题。以下代码是否有效?感谢。

$query_list_menu = "SELECT :section_name from myl_menu_hide_show WHERE id=:id";
$result_list_menu = $db->prepare($query_list_menu);
$result_list_menu->bindValue(':section_name', $_GET['section_name'] , PDO::PARAM_STR);
$result_list_menu->bindValue(':id', $_GET['id'] , PDO::PARAM_INT);  
$result_list_menu->execute();

2 个答案:

答案 0 :(得分:12)

如果$_GET['section_name']包含列名,则查询应为:

$query_list_menu = "SELECT " . $_GET['section_name'] . " from myl_menu_hide_show WHERE id=:id";

,并提供:

$query_list_menu = "SELECT :section_name from myl_menu_hide_show WHERE id=:id";
$result_list_menu = $db->prepare($query_list_menu);
$result_list_menu->bindValue(':id', $_GET['id'] , PDO::PARAM_INT);  
$result_list_menu->execute();

原因是您希望列的实际名称在查询中 - 您已将其更改为参数,这实际上没有多大意义。

我还要补充说,直接使用$_GET['section_name']这样会带来巨大的安全风险,因为它允许SQL注入。我建议您在构建和执行查询之前通过对列列表进行检查来验证$_GET['section_name']的值。

答案 1 :(得分:0)

没有一种安全可靠的方法可以根据用户的选择仅从记录中选择一个字段。最明智的解决方案是选择整行,然后返回所请求的唯一字段

$sql = "SELECT * from myl_menu_hide_show WHERE id=?";
$stmt = $db->prepare($query_list_menu);
$stmt->execute([$_GET['id']]);
$row = $stmt->fetch();
return $row[$_GET['section_name']] ?? false;