PHP/PDO:创建表时准备好的语句不起作用?

发布于 2024-09-18 08:46:10 字数 336 浏览 4 评论 0原文

当我使用 PDO 准备好的语句,并使用它将表名称插入到失败的查询中时,一个简单的示例:

$stmt = $dbh->prepare("CREATE TABLE ? (id foo, int bar,...)");
$stmt->execute(Array('table_foobar'));

它所做的就是将 ? 替换为 'table_foobar',单引号不允许为我创建表格!

我最终需要在准备好的语句顶部执行 sprintf 来添加预定义的表名称。

我到底错过了什么?

When I am using a PDO prepared statement, and use it to plug in a table name to the query it fails, a quick example:

$stmt = $dbh->prepare("CREATE TABLE ? (id foo, int bar,...)");
$stmt->execute(Array('table_foobar'));

All it does is replaces ? with 'table_foobar', the single quotes don't allow creation of the table for me!

I end up needing to do a sprintf on TOP of the prepared statement to add in a predefined table name.

What on earth am I missing here?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

情话已封尘 2024-09-25 08:46:10

我在手册中找不到任何明确的内容,但是查看用户贡献的注释,参数的使用仅用于实际,而不是表名、字段名等。

正常的字符串连接应该(并且可以)被使用。

$tablename = "tablename";
$stmt = $dbh->prepare("CREATE TABLE `$tablename` (id foo, int bar,...)");

I can find nothing clear in the manual, but looking at the User Contributed Notes, the use of parameters is intended for actual values only, not table names, field names etc.

Normal string concatenation should (and can) be used.

$tablename = "tablename";
$stmt = $dbh->prepare("CREATE TABLE `$tablename` (id foo, int bar,...)");
忘你却要生生世世 2024-09-25 08:46:10

如果您动态创建表,这很可能意味着您不了解关系数据库的思想,从而导致做错了什么。
只需在应用程序设置时从现成的转储创建所有表,并且不在运行时创建任何表。

根本不需要使用动态表名。

If you are creating a table dynamically, that most likely means you do not understand relational database ideology and as a result doing something wrong.
Just create all the tables at application setup from ready made dump and do not create any tables at runtime.

No need to use dynamic table name at all.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文