PDOStatement::bindParam()和PDOStatement::bindValue()之间的区别是什么?
当前回答
从PDOStatement::bindParam的手动条目:
与PDOStatement::bindValue()不同的是,该变量被绑定为引用,并且仅在调用PDOStatement::execute()时才会被求值。
举个例子:
$sex = 'male';
$s = $dbh->prepare('SELECT name FROM students WHERE sex = :sex');
$s->bindParam(':sex', $sex); // use bindParam to bind the variable
$sex = 'female';
$s->execute(); // executed with WHERE sex = 'female'
or
$sex = 'male';
$s = $dbh->prepare('SELECT name FROM students WHERE sex = :sex');
$s->bindValue(':sex', $sex); // use bindValue to bind the variable's value
$sex = 'female';
$s->execute(); // executed with WHERE sex = 'male'
其他回答
以下是我能想到的一些:
使用bindParam,你只能传递变量;没有值 使用bindValue,你可以同时传递(值和变量) bindParam只适用于变量,因为它允许参数通过“引用”作为输入/输出(在PHP中值不是有效的“引用”):它对驱动程序很有用(引用手册):
支持调用存储 返回数据作为输出的过程 参数,有的还作为 两者都发送的输入/输出参数 并更新以接收它。
对于一些DB引擎,存储过程可以具有可用于输入(从PHP向过程提供一个值)和输出(从存储过程向PHP返回一个值)的参数;要绑定这些参数,你必须使用bindParam,而不是bindValue。
答案在bindParam的文档中:
与PDOStatement::bindValue()不同的是,该变量被绑定为引用,并且仅在调用PDOStatement::execute()时被计算。
和执行
调用PDOStatement::bindParam()将PHP变量绑定到参数标记:绑定的变量将其值作为输入传递,并接收相关参数标记的输出值(如果有的话)
例子:
$value = 'foo';
$s = $dbh->prepare('SELECT name FROM bar WHERE baz = :baz');
$s->bindParam(':baz', $value); // use bindParam to bind the variable
$value = 'foobarbaz';
$s->execute(); // executed with WHERE baz = 'foobarbaz'
or
$value = 'foo';
$s = $dbh->prepare('SELECT name FROM bar WHERE baz = :baz');
$s->bindValue(':baz', $value); // use bindValue to bind the variable's value
$value = 'foobarbaz';
$s->execute(); // executed with WHERE baz = 'foo'
从PDOStatement::bindParam的手动条目:
与PDOStatement::bindValue()不同的是,该变量被绑定为引用,并且仅在调用PDOStatement::execute()时才会被求值。
举个例子:
$sex = 'male';
$s = $dbh->prepare('SELECT name FROM students WHERE sex = :sex');
$s->bindParam(':sex', $sex); // use bindParam to bind the variable
$sex = 'female';
$s->execute(); // executed with WHERE sex = 'female'
or
$sex = 'male';
$s = $dbh->prepare('SELECT name FROM students WHERE sex = :sex');
$s->bindValue(':sex', $sex); // use bindValue to bind the variable's value
$sex = 'female';
$s->execute(); // executed with WHERE sex = 'male'
来自准备语句和存储过程
使用bindParam插入多行,一次绑定:
<?php
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);
// insert one row
$name = 'one';
$value = 1;
$stmt->execute();
// insert another row with different values
$name = 'two';
$value = 2;
$stmt->execute();
你再也不用挣扎了,只要有这样一条路:
$stmt = $pdo->prepare("SELECT * FROM someTable WHERE col = :val");
$stmt->execute([":val" => $bind]);
推荐文章
- 如何实现一个好的脏话过滤器?
- PHP中的三个点(…)是什么意思?
- Guzzlehttp -如何从guzzle6得到响应的正文?
- 移动一个文件到服务器上的另一个文件夹
- Laravel中使用雄辩的ORM进行批量插入
- PHP 5.4调用时引用传递-容易修复可用吗?
- 格式化字节到千字节,兆字节,千兆字节
- 如何在PHP中获得变量名作为字符串?
- 用“+”(数组联合运算符)合并两个数组如何工作?
- Laravel PHP命令未找到
- 如何修复从源代码安装PHP时未发现xml2-config的错误?
- 在PHP中对动态变量名使用大括号
- 如何从对象数组中通过对象属性找到条目?
- 如何从关联数组中删除键及其值?
- PHP字符串中的花括号