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。
绑定整数参数
此示例显示如何将整数参数绑定到预处理语句。
<?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() 时进行求值。
绑定字符串参数
此示例演示如何将字符串参数绑定到预处理语句。
<?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 通过引用绑定。
绑定布尔参数
此示例显示如何将布尔参数绑定到预处理语句。
<?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 值绑定到预处理语句参数。
<?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 通过引用绑定。
绑定带长度的大字符串
这展示了如何绑定指定长度的大字符串参数。
<?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(); }
这会绑定一个指定长度的大字符串参数。第四个参数设置了最大长度。这里使用了位置参数 (?) 而不是命名参数。
绑定输出参数
此示例演示如何为存储过程调用绑定输出参数。
<?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 指示该参数既是输入也是输出。指定了长度。
绑定多个参数
此示例显示了如何绑定不同类型的多个参数。
<?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。所有变量都通过引用绑定。
最佳实践
- 始终使用 bindParam 以确保安全: 防止 SQL 注入。
- 指定参数类型: 确保正确的数据处理。
- 使用命名参数: 使代码更具可读性。
- 按引用绑定: 变量在执行时进行求值。
- 处理错误: 对 PDO 操作使用 try-catch 块。
来源
本教程介绍了 PDOStatement::bindParam 方法,并通过实际示例展示了不同的参数类型和用法。
作者
列出 所有 PHP PDO 函数。