对于我的数据库抽象,当在预处理语句中使用数据文字时,我希望完全依赖PDO参数标记,以便消除转义和引用的需要。
问题是,这似乎只适用于某些查询类型:显而易见的SELECT、UPDATE和INSERT查询按预期工作,但CREATE TABLE抛出一个“常规错误”,无论我使用的是命名标记还是问号标记。
<?php
// works:
(new PDO('sqlite::memory:'))->prepare('CREATE TABLE test (name TEXT DEFAULT \'unnamed\')')->execute();
// doesn't work:
(new PDO('sqlite::memory:'))->prepare('CREATE TABLE test (name TEXT DEFAULT ?)')->execute(['unnamed']);
这是错误:
PHP Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: 1 near "?": syntax error in /home/andy/projects/orm/public/pdo.php:7
Stack trace:
#0 /home/andy/projects/orm/public/pdo.php(7): PDO->prepare()
#1 {main}
thrown in /home/andy/projects/orm/public/pdo.php on line 7
与Can PHP PDO Statements accept the table or column name as parameter?的重要区别在于,我并不试图参数化标识符,而是一个文字。
如果参数不能在DDL中使用,有人能告诉我一些文档或规范吗?
1条答案
按热度按时间sirbozc51#
根据clarification,查询参数(QP)不能用来代替任何文字值。特别是,虽然SQLite图目前指出QP可以在DEFAULT子句中使用,但专用部分明确禁止它。