mariadb 绑定参数的名称

fsi0uk1n  于 2023-02-19  发布在  其他
关注(0)|答案(1)|浏览(111)

Doctrine中,是否可以绑定参数的name(与绑定参数的value相反)?

为什么我需要它

存在具有7个布尔列的表,每个列用于一周中的每一天:mondaytuesday等(这些对应于由 * GTFS * 定义的calendar实体的结构,https://gtfs.org/schedule/reference/#calendarttxt)。
给定一周中的某一天(例如monday),我想获取所有在星期一可用的行,即:

$statement = $this
    ->getEntityManager()
    ->getConnection()
    ->prepare('
        SELECT id
        FROM calendar
        WHERE monday = 1
    ');

通常,我希望能够在查询中提供日期的名称,我可以简单地这样做:

->prepare("
    SELECT id
    FROM calendar
    WHERE $dayName = 1
");

我想知道是否有可能使用参数绑定作为参数的名称,例如

$statement = $this
    ->getEntityManager()
    ->getConnection()
    ->prepare('
        SELECT id
        FROM calendar
        WHERE :dayName = 1
    ');

$statement->bindValue('dayName', $dayName);

其不起作用,参见下文。

我所尝试的

1

WHERE :dayName = 1

转换为以下SQL查询:

SELECT calendar.id
FROM calendar
WHERE 'monday' = 1

并且,因为该条件永远不为真,所以返回空集[]

2

WHERE `:dayName` = 1
SELECT calendar.id
FROM calendar
WHERE `'monday'` = 1

Column not found: 1054 Unknown column ''monday'' in 'where clause'

3

WHERE ":dayName" = 1
# no query

Invalid parameter number: number of bound variables does not match number of tokens

pbossiut

pbossiut1#

这当然是不可能的。
在语句中,占位符可用作参数标记,以指示稍后执行查询时将数据值绑定到查询的位置。参数标记不应用引号括起来,即使您打算将它们绑定到字符串值。参数标记只能用于应出现表达式的位置,而不能用于SQL关键字、标识符等。
简而言之:您只能对文本(字符串、数字...)使用参数标记
如果你不能改变你的数据库设计,我建议你使用另一个SQL语句,并进行简单的位检查:

prepare("select id, (monday + 
                     tuesday * 2 + 
                     wednesday * 4 + 
                     thursday * 8 + 
                     friday * 16 + 
                     saturday * 32 + sunday *64) as day
from calendar having (day) & (1 << :daynumber)")

现在,通过绑定daynumber(星期一=0,星期二=1,...星期日=6),您可以简单地检查某个服务在特定工作日是否可用。

相关问题