删除表的绑定变量


binding variable for drop table php

我写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和删除从它,而不是表。