Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php PDO-将字段名作为变量传递_Php_Mysql_Pdo_Migration - Fatal编程技术网

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

Php PDO-将字段名作为变量传递,php,mysql,pdo,migration,Php,Mysql,Pdo,Migration,我刚刚将我的代码从mysql_查询风格的命令迁移到PDO风格,我遇到了一个问题。旧代码如下所示: $query_list_menu = "SELECT ".$_GET['section_name']." from myl_menu_hide_show WHERE id='".$_GET['id']."'"; 更新后的代码如下所示。显然它不起作用了。我在$\u GET['section\u name']中存储一个表示数据库中字段名的字符串。但我认为当我把它作为变量传递时,会有一个问题。下面的代码

我刚刚将我的代码从mysql_查询风格的命令迁移到PDO风格,我遇到了一个问题。旧代码如下所示:

$query_list_menu = "SELECT ".$_GET['section_name']." from myl_menu_hide_show WHERE id='".$_GET['id']."'";
更新后的代码如下所示。显然它不起作用了。我在
$\u GET['section\u 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();

如果
$\u GET['section\u 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();
原因是您希望列的实际名称出现在查询中—您将其更改为一个参数,这实际上没有多大意义


我还要补充一点,像这样直接使用
$\u GET['section\u name']
是一个巨大的安全风险,因为它允许SQL注入。我建议您在构建和执行查询之前,通过检查列列表来验证
$\u GET['section\u name']
的值。

根据用户的选择,从记录中只选择一个字段是不安全的。最明智的解决方案是选择整行,然后返回请求的唯一字段

$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;

另外一个+1用于建议检查。非常感谢Phil…..我做了您所指出的,并且仅当$\u GET['section\u name']变量将检查我在该表中使用的12个列名时才执行db UPDATE和basic SELECT代码….确保没有发生SQL注入:)再次感谢您指出我的错误。祝你有美好的一天