我正在编写PHP脚本以便与mySQL数据库一起使用。我唯一的问题是drop table / create table的绑定变量等等。
$stmt = $link->prepare("DROP TABLE ?");
$stmt->bind_param('s','testing');
$stmt->execute();
无效。我也试过了:
SELECT * FROM (SELECT MAX(name) from profiles where name='testing') <- is working
DROP TABLE (SELECT MAX(name) from profiles where name='testing') <- dont work
答案 0 :(得分:2)
绑定参数与替换字符串的一部分不同:你不能只绑定任何你想要的东西。
在这种情况下:您不能对表名使用绑定参数 - 您必须使用字符串连接来构建查询,而不是使用预准备语句。
作为参考,引用PREPARE
Syntax:
参数标记只能使用 应该出现数据值的地方,而不是 对于SQL关键字,标识符等 类推。
答案 1 :(得分:1)
据我所知,您只能绑定参数,而不能绑定到所需查询的任何部分。你实际上是在告诉数据库“嘿,我会在这里传递一个值,我希望你能做到你的魔法,以确保它不会超越它的界限”。表名或字段名之类的东西不是值,它们是表结构本身的一部分。
在这种情况下,您只需使用简单的$query = "DROP TABLE " . $table;
即可。应该很容易检查已知表的列表,以确保您没有注入任何有害的东西。无论如何,任何使DDL更改的内容都不应该从用户那里获取输入,就我而言。这些类型的更改可以基于基于用户输入,但查询的实际构造应该是众所周知的,不应该需要外部数据来构建。
此外,我不确定您要对此查询做什么:
DROP TABLE (SELECT MAX(name) from profiles where name='testing');
看起来您可能正在尝试删除记录,但这完全是错误的语法。如果你试图删除一个名字来自另一个查询结果的表,我真的不认为你也可以这样做。我99%确定DROP TABLE
只需要一个文字表名称值。
答案 2 :(得分:0)
您确定要动态删除表格吗? 这是非常不寻常的。
您的数据库设计似乎有误 而现在你面临着一个后果。
您似乎应该一个表users
并从中删除行,而不是表格。