ZetCode

PHP PDOStatement::bindParam 教程

最后修改于 2025 年 4 月 19 日

PDOStatement::bindParam 方法将一个 PHP 变量绑定到预处理 SQL 语句中的一个参数。这提供了安全的参数化查询。

基本定义

PDOStatement::bindParam 将一个变量绑定到 SQL 语句中的参数标记。该变量通过引用绑定,并在执行时进行求值。

语法:bindParam(string|int $param, mixed &$var, int $type = PDO::PARAM_STR, int $maxLength = null, mixed $driverOptions = null)。该方法成功时返回 true,失败时返回 false。

绑定整数参数

此示例显示如何将整数参数绑定到预处理语句。

bind_int.php
<?php

declare(strict_types=1);

try {
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    $stmt = $pdo->prepare('SELECT * FROM users WHERE id = :id');
    $id = 5;
    $stmt->bindParam(':id', $id, PDO::PARAM_INT);
    $stmt->execute();
    
    $user = $stmt->fetch();
    if ($user) {
        echo "User found: {$user['name']}";
    }
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

这会将一个整数参数绑定到 :id 占位符。PDO::PARAM_INT 指定了参数类型。变量 $id 通过引用绑定,并在调用 execute() 时进行求值。

绑定字符串参数

此示例演示如何将字符串参数绑定到预处理语句。

bind_string.php
<?php

declare(strict_types=1);

try {
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    $stmt = $pdo->prepare('SELECT * FROM users WHERE name = :name');
    $name = 'John Doe';
    $stmt->bindParam(':name', $name, PDO::PARAM_STR);
    $stmt->execute();
    
    $user = $stmt->fetch();
    if ($user) {
        echo "User found with email: {$user['email']}";
    }
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

这会将一个字符串参数绑定到 :name 占位符。PDO::PARAM_STR 是字符串参数的默认类型。变量 $name 通过引用绑定。

绑定布尔参数

此示例显示如何将布尔参数绑定到预处理语句。

bind_bool.php
<?php

declare(strict_types=1);

try {
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    $stmt = $pdo->prepare('UPDATE settings SET active = :active WHERE user_id = 1');
    $active = true;
    $stmt->bindParam(':active', $active, PDO::PARAM_BOOL);
    $stmt->execute();
    
    echo "Setting updated successfully";
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

这会将一个布尔参数绑定到 :active 占位符。PDO::PARAM_BOOL 确保正确的布尔值处理。变量 $active 通过引用绑定。

绑定 NULL 参数

此示例演示如何将 NULL 值绑定到预处理语句参数。

bind_null.php
<?php

declare(strict_types=1);

try {
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    $stmt = $pdo->prepare('UPDATE users SET middle_name = :middle WHERE id = 1');
    $middle = null;
    $stmt->bindParam(':middle', $middle, PDO::PARAM_NULL);
    $stmt->execute();
    
    echo "Middle name set to NULL successfully";
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

这会将一个 NULL 值绑定到 :middle 占位符。PDO::PARAM_NULL 明确指示 NULL 参数。变量 $middle 通过引用绑定。

绑定带长度的大字符串

这展示了如何绑定指定长度的大字符串参数。

bind_large_string.php
<?php

declare(strict_types=1);

try {
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    $stmt = $pdo->prepare('INSERT INTO articles (title, content) VALUES (?, ?)');
    $title = "New Article";
    $content = str_repeat("This is a long article content. ", 100);
    
    $stmt->bindParam(1, $title, PDO::PARAM_STR);
    $stmt->bindParam(2, $content, PDO::PARAM_STR, strlen($content));
    $stmt->execute();
    
    echo "Article inserted successfully";
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

这会绑定一个指定长度的大字符串参数。第四个参数设置了最大长度。这里使用了位置参数 (?) 而不是命名参数。

绑定输出参数

此示例演示如何为存储过程调用绑定输出参数。

bind_output.php
<?php

declare(strict_types=1);

try {
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    $stmt = $pdo->prepare('CALL get_user_email(:id, :email)');
    $id = 5;
    $email = '';
    
    $stmt->bindParam(':id', $id, PDO::PARAM_INT);
    $stmt->bindParam(':email', $email, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 255);
    $stmt->execute();
    
    echo "User email: $email";
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

这会为存储过程绑定一个输出参数。PDO::PARAM_INPUT_OUTPUT 指示该参数既是输入也是输出。指定了长度。

绑定多个参数

此示例显示了如何绑定不同类型的多个参数。

bind_multiple.php
<?php

declare(strict_types=1);

try {
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    $stmt = $pdo->prepare('INSERT INTO products (name, price, in_stock) VALUES (:name, :price, :stock)');
    
    $name = "New Product";
    $price = 19.99;
    $stock = true;
    
    $stmt->bindParam(':name', $name, PDO::PARAM_STR);
    $stmt->bindParam(':price', $price, PDO::PARAM_STR); // Using STR for float
    $stmt->bindParam(':stock', $stock, PDO::PARAM_BOOL);
    $stmt->execute();
    
    echo "Product added successfully";
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

这会将不同类型的多个参数绑定到预处理语句。请注意,对于浮点值,通常使用 PDO::PARAM_STR。所有变量都通过引用绑定。

最佳实践

来源

PHP bindParam 文档

本教程介绍了 PDOStatement::bindParam 方法,并通过实际示例展示了不同的参数类型和用法。

作者

我叫 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。至今,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出 所有 PHP PDO 函数