mysql - 有没有办法使用准备好的语句来选择变量列?

标签 mysql mysql-workbench mysql-error-1064

以下代码使用准备好的语句,似乎无法选择表 studentshome_address:

SET @mycolumn = 'home_address' ;
SET @s = 'SELECT ? FROM students' ;
PREPARE statement FROM @s;
EXECUTE statement USING @mycolumn ;

事实上,这些指令将简单地返回一个名为“?”的列,其中填充了字符串“home_address”,并且包含与表 students 一样多的行。

我怎样才能使这项工作?我知道这种语法是可行的,因为以下示例(取自 Is it possible to execute a string in MySQL?)有效:

SET @username = 'test';
SET @password = 'asdf';
SET @Expression = 'SELECT id FROM Users WHERE name = ? AND pass = ?;' ;
PREPARE myquery FROM @Expression;
EXECUTE myquery USING @username, @password;

最佳答案

这是不可能的。不同之处在于您动态引用数据库的对象,而不是仅仅传递一个字符串。

准备好的语句通过使用您传入的字符串/值的占位符完整指定 SQL 语句来工作。然后,您的 RDBMS 可以解析查询并在您传入参数之前确定它的完整执行路径。一旦该步骤完成,它就会接收参数并获取数据。这就是准备好的语句如此安全的原因。执行路径是预先确定的,所以不可能传入更多 SQL 并更改它。

所以如果你不知道列或表,那么它就无法解析和构建执行路径。相反,您必须通过串联动态构建 SQL 并执行。如果您从用户输入中获取列名或表名,那么您必须尽可能地对其进行清理,并祈祷您的清理工作比您偷偷摸摸的用户注入(inject) sql 的能力更好。

关于mysql - 有没有办法使用准备好的语句来选择变量列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48192468/

相关文章:

php - 使用 php 脚本显示 mySQL 的结果时如何制作计数器

php 在 null 上调用成员函数 query()

mysql - SQL 不同的分组查询

mysql - 如何在 MySql 工作台中连接表?

mysql - 如何修复MySQL错误#1064?

php - 从Mysql在Sqlite中存储多个数据

mysql - 如何在现有行的另一列中添加具有默认值的MySQL表列

mysql - 无法在 MySQL 语法错误中运行查询意外

mysql - 尝试创建一个触发器来更新一个表中另一个表的数量

MySQL 服务器应用程序运行,但 MySQL 服务器未加载