我写PHP脚本使用我的mySQL数据库。我唯一的问题是绑定变量删除表/创建表等。
$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
绑定参数与仅仅替换字符串的一部分不同:你不能绑定任何你想要的东西。
在这种情况下:您不能为表名使用绑定参数——您必须使用字符串连接来构建查询,而不是使用准备好的语句。
引用 PREPARE
Syntax:
只能使用参数标记数据值应该出现在哪里,不是吗用于SQL关键字、标识符等。
据我所知,您只能绑定到参数,而不能绑定到您想要的查询的任何部分。你实际上是在告诉数据库"嘿,我要传递给你一个值,我希望你施展魔法确保它不会超出它的界限"像表名或字段名这样的东西不是值,它们是表结构本身的一部分。
在这种情况下,您必须使用一个简单的$query = "DROP TABLE " . $table;
。根据已知的表进行检查应该很容易,以确保你没有注射任何有害物质。就我而言,任何使DDL发生变化的东西都不应该从用户那里获取输入。这些类型的更改可以基于用户输入的,但是查询的实际构造应该非常清楚,不应该需要外部数据来构造。
另外,我不太确定你想用这个查询做什么:
DROP TABLE (SELECT MAX(name) from profiles where name='testing');
看起来你可能试图删除一条记录,但这是完全错误的语法。如果您试图删除一个名称来自另一个查询结果的表,我真的认为您也不能这样做。我99%肯定DROP TABLE
只期望一个字面表名值。
确定要动态删除表吗?
这是极不寻常的。
似乎你有错误的数据库设计。
现在你面临着一个后果。
似乎你应该有一个表users
和删除行从它,而不是表。