首页 > 解决方案 > 使用php bindParam时:name中的冒号是什么意思

问题描述

PHP 手册有这个 PDO bindParam 语句的例子:

<?php
/* Execute a prepared statement by binding PHP variables */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12);
$sth->execute();
?>

:冒号只是意味着这:colour是一个参数吗?

标签: phppdo

解决方案


这映射到查询中的命名占位符。绑定不需要它,如果不存在,驱动程序将自动添加它。

在您的代码中,您有

$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');
                     ^^^^^^^^^              ^^^^^^^

:驱动程序使用和尾随文本作为占位符读取任何内容。然后它将该内容与绑定的值交换,转义所有特殊字符,并引用字符串。

那么你bindparam

:calories并且与:colour其中的每一个相匹配。假设$calorieso'brien。当查询进入数据库时​​,它将是:

SELECT name, colour, calories
FROM fruit
WHERE calories < 'o\'brien'

PDO 还支持只是问号的未命名占位符?。你按位置绑定这些。

$sth = $dbh->prepare('SELECT name, colour, calories
        FROM fruit
        WHERE calories < ? AND colour = ?');

然后使用 a1因为它是第一个占位符。

$sth->bindParam(1, $calories, PDO::PARAM_INT);

此外,您可以将所有值execute作为数组传递给函数,它也会进行绑定。

无论是绑定bindparam还是execute绑定,您都必须通过在查询中如何使用绑定来解决绑定问题。未命名是位置,命名是按名称。


推荐阅读