【问题标题】:Escaping a colon (:) in a PDO prepared statement在 PDO 准备好的语句中转义冒号 (:)
【发布时间】:2022-01-19 23:03:15
【问题描述】:
$sql3 = 'SELECT sched_id, date_format(sched_date_time,\'%H:%i\') AS \'Time\'
         FROM schedule
         WHERE (date_format(sched_date_time,\'%Y-%m-%d\') = \':date\') AND
                schedule.film_id = :film_id';

$sth2 = $pdo->prepare($sql3);
$sth2->bindValue(':date', '2021-12-18');
// date_format($date,"%Y-%m-%d")
$sth2->bindValue(':film_id', $row1['film_id']);
$sth2->execute();

我收到以下错误

"参数号无效:绑定变量个数不匹配 令牌数”

我相信这是由 SQL 函数 date_format() 中的变量 $sql3 中的冒号引起的。

如何对冒号进行转义,以便在不让 PDO 认为它是占位符声明的情况下保留它以进行格式化?

根据其他问题的答案,我必须在冒号前使用\\ 来转义它,但我仍然收到错误。

我使用 XAMPP 作为便携式/临时开发环境。 XAMPP 使用 MariaDB 作为其数据库。

【问题讨论】:

    标签: php mysql sql pdo mariadb


    【解决方案1】:

    为避免需要转义引号,请在双引号内定义 SQL 语句:

    $sql3 = "SELECT sched_id, date_format(sched_date_time,'%H:%i') AS 'Time'
    FROM schedule
    WHERE (date_format(sched_date_time,'%Y-%m-%d') = :date) 
    AND schedule.film_id = :film_id";
    
    $sth2 = $pdo->prepare($sql3);
    $sth2->bindValue(':date','2021-12-18', PDO::PARAM_STR);
    // date_format($date,"%Y-%m-%d")
    $sth2->bindValue(':film_id',$row1['film_id'], PDO::PARAM_INT);
    $sth2->execute();
    

    根据bindValue documentation,您也可以显式设置值的类型。

    【讨论】:

    • SQL 字符串中的:date 周围应该不需要's。如有必要,数据库引擎将处理参数值的任何引用/转义。
    • 好地方,我已经有一段时间没有做 PDO 的东西了。
    • 实际上切换到双引号解决了这个问题。我也错误地在占位符周围使用单引号,这样做会导致错误且不必要。
    • 同时转义 '%H:%i' 上的单引号使分号成为查询字符串的一部分,导致 PDO 认为它是占位符声明,作为 SQL 中单引号之外的分号据我所知,没有任何价值或应用。 PDO 显然是为了解决这个问题而设计的。
    • @KeelanMcCarthy 你把一切都搞错了。没有斜线使它成为 PDO。 在 :date 周围去掉你错误地放在那里的单引号解决了这个问题。再一次,切换报价绝对不会改变。 All slashes disappear from the stringThat's basic PHP syntax。 Jacob Mulquin 不相信其他人建议的解决方案。而且我不幻想它会在这里贬低一些评论者。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    相关资源
    最近更新 更多