【问题标题】:Can I use PDO parameter markers when preparing CREATE TABLE statement?准备 CREATE TABLE 语句时可以使用 PDO 参数标记吗?
【发布时间】:2022-12-12 16:26:27
【问题描述】:

对于我的数据库抽象,我想在准备好的语句中使用数据文字时完全依赖 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

【问题讨论】:

    标签: php sqlite pdo


    【解决方案1】:

    你不能。您只能参数化 DML 和 DQL 查询,并且只能参数化文字值。

    【讨论】: