PHP/PDO:创建表时准备好的语句不起作用?
当我使用 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我在手册中找不到任何明确的内容,但是查看用户贡献的注释,参数的使用仅用于实际值,而不是表名、字段名等。
正常的字符串连接应该(并且可以)被使用。
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.
如果您动态创建表,这很可能意味着您不了解关系数据库的思想,从而导致做错了什么。
只需在应用程序设置时从现成的转储创建所有表,并且不在运行时创建任何表。
根本不需要使用动态表名。
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.