4

我只是将我的代码从 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();
4

2 回答 2

11

如果$_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']在构建和执行查询之前通过对照列列表检查它的值来验证它的值。

于 2012-07-06T09:04:38.790 回答
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;
于 2020-05-22T12:38:48.870 回答