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

标签 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();

最佳答案

如果 $_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 注入(inject)。我建议您在构建和执行查询之前,通过对照列列表检查 $_GET['section_name'] 的值来验证它。

关于php - PDO - 将字段名称作为变量传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11365357/

相关文章:

MySql 创建事件错误

php - 知道 youtube 使用的是什么视频编码技术吗?

MySQL 选择查找具有匹配名称列的类似纬度/经度

php - 如何在 Symfony 中设置 ORM 两个实体 ID

c# - 从文本框值运行 SQL 命令

php - fatal error : Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: no parameters were bound

php - PDO::commit() 成功或失败

php - 如何为我的类/函数获取 DB-Connection

php - 如何在 PHP7 中使用 pThreads 进行多线程? worker 、游泳池等

php - 未找到类 'JFactory'