ZetCode

PHP PDOStatement::bindColumn 教程

最后修改于 2025 年 4 月 19 日

PHP 中的 PDOStatement::bindColumn 方法将 PHP 变量绑定到结果集中的列。这使得在获取行时可以通过变量直接访问列值。

基本定义

PDOStatement::bindColumn 将 PHP 变量绑定到结果集中的列。在获取行时,该变量将自动更新为列的值。

语法:PDOStatement::bindColumn(mixed $column, mixed &$param, int $type = PDO::PARAM_STR, int $maxlen = 0, mixed $driverdata = null): bool

$column 可以是列号(从 1 开始索引)或列名。$param 是要绑定的 PHP 变量。$type 指定参数的数据类型。

基本列绑定

此示例显示了如何将列绑定到简单查询的变量。

pdo_bindcolumn_basic.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 id, name, email FROM users');
    $stmt->execute();
    
    $stmt->bindColumn('id', $id);
    $stmt->bindColumn('name', $name);
    $stmt->bindColumn('email', $email);
    
    while ($stmt->fetch(PDO::FETCH_BOUND)) {
        echo "ID: $id, Name: $name, Email: $email\n";
    }
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

这将三列绑定到变量。调用 fetch(PDO::FETCH_BOUND) 时,变量会自动更新。列名用于指定要绑定的列。

按列号绑定

此示例演示了使用列的数字位置而不是名称进行绑定。

pdo_bindcolumn_numbers.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 id, name FROM users');
    $stmt->execute();
    
    $stmt->bindColumn(1, $id);
    $stmt->bindColumn(2, $name);
    
    while ($stmt->fetch(PDO::FETCH_BOUND)) {
        echo "ID: $id, Name: $name\n";
    }
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

列按其在结果集中的位置(从 1 开始索引)进行绑定。第一列是 id(位置 1),第二列是 name(位置 2)。即使列名更改,此方法也有效。

指定数据类型

此示例显示了如何将列绑定到变量时指定数据类型。

pdo_bindcolumn_types.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 id, name, salary FROM users');
    $stmt->execute();
    
    $stmt->bindColumn('id', $id, PDO::PARAM_INT);
    $stmt->bindColumn('name', $name, PDO::PARAM_STR);
    $stmt->bindColumn('salary', $salary, PDO::PARAM_STR); // Using STR for decimal
    
    while ($stmt->fetch(PDO::FETCH_BOUND)) {
        echo "ID: $id (".gettype($id)."), Name: $name (".gettype($name)."), Salary: $salary\n";
    }
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

第三个参数指定数据类型。PDO::PARAM_INT 确保 id 是整数。PDO::PARAM_STR 用于字符串。对于小数,通常使用 STR,因为没有特定的 decimal 类型。

绑定到类属性

此示例演示了如何将列绑定到对象的属性。

pdo_bindcolumn_class.php
<?php

declare(strict_types=1);

class User {
    public $id;
    public $name;
    public $email;
}

try {
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    $stmt = $pdo->prepare('SELECT id, name, email FROM users');
    $stmt->execute();
    
    $user = new User();
    
    $stmt->bindColumn('id', $user->id, PDO::PARAM_INT);
    $stmt->bindColumn('name', $user->name, PDO::PARAM_STR);
    $stmt->bindColumn('email', $user->email, PDO::PARAM_STR);
    
    while ($stmt->fetch(PDO::FETCH_BOUND)) {
        echo "User: {$user->id}, {$user->name}, {$user->email}\n";
    }
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

列绑定到 User 对象的属性。每次 fetch 都会更新对象的属性。在面向对象编程中,这种方法很有用。

使用不同的获取模式

此示例显示了 bindColumn 如何与不同的获取模式一起使用。

pdo_bindcolumn_fetchmodes.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 id, name FROM users');
    $stmt->execute();
    
    $stmt->bindColumn(1, $id);
    $stmt->bindColumn(2, $name);
    
    // FETCH_BOUND updates bound variables
    while ($stmt->fetch(PDO::FETCH_BOUND)) {
        echo "Bound: ID: $id, Name: $name\n";
    }
    
    // Regular fetch doesn't update bound variables
    $stmt->execute();
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        echo "Regular: ID: {$row['id']}, Name: {$row['name']}\n";
    }
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

绑定变量仅在 $_SESSION['id'] 使用 PDO::FETCH_BOUND 时更新。FETCH_ASSOC 等常规获取方法不会影响绑定变量。本示例展示了这两种方法以进行比较。

仅绑定特定列

此示例演示了仅绑定某些列,同时正常获取其他列。

pdo_bindcolumn_partial.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 id, name, email, created_at FROM users');
    $stmt->execute();
    
    $stmt->bindColumn('name', $name);
    $stmt->bindColumn('email', $email);
    
    while ($row = $stmt->fetch(PDO::FETCH_BOUND)) {
        echo "Name: $name, Email: $email\n";
        echo "Full row: ";
        print_r($row);
    }
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

仅将 name 和 email 列绑定到变量。其他列仍可在 $row 数组中访问。这表明您可以混合使用绑定的列和常规获取。

绑定最大长度

此示例展示了如何使用 maxlen 参数限制返回数据的大小。

pdo_bindcolumn_maxlen.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 id, name, bio FROM users');
    $stmt->execute();
    
    $stmt->bindColumn('name', $name, PDO::PARAM_STR, 20);
    $stmt->bindColumn('bio', $bio, PDO::PARAM_STR, 100);
    
    while ($stmt->fetch(PDO::FETCH_BOUND)) {
        echo "Name (max 20 chars): $name\n";
        echo "Bio preview (max 100 chars): " . substr($bio, 0, 30) . "...\n";
    }
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

第四个参数限制了每列返回的最大数据长度。name 限制为 20 个字符,bio 限制为 100 个字符。这对于只需要预览的大文本字段很有用。

最佳实践

来源

PHP bindColumn 文档

本教程涵盖了 PDOStatement::bindColumn 方法,并通过实际示例展示了其在数据库操作中的不同用法。

作者

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

列出 所有 PHP PDO 函数