先说预处理语句中的占位符
两种形式:
- 使用问号占位符
- 使用:name占位符
而bindParam与bindValue就是为绑定占位符的值准备的方法
两个方法参数相同
- 参数1:你要绑定的参数名称
- 参数2:值
- 参数3:值类型
使用问号占位符绑定值
$sql = "insert into users (name,age) value (?,?)";
bindParam(1,$name,PDO::PARAM_STR);//这里的1就是第一个问号
/*bindValue跟bindParam相同*/
使用:name占位符绑定值
$sql = "insert into users (name,age) value (:name,:age)";
bindParam(':name',$name,PDO::PARAM_STR);//这里的:name就是SQL语句中的:name
/*bindValue跟bindParam相同*/
建议使用:name的形式
因为如果你的参数较多,或者传入的参数变动,你如果使用问号的形式,则得到SQL语句中去一个一个数是第几个,很麻烦
上面说了用法,下面是bindParam与bindValue的区别
区别1:
- bindParam:绑定一个参数到指定变量名,(简单理解:你的占位符名称就是你实际传递的变量的别名)
- bindParam只能传递变量,不能书写直接量,他是引用传递,
- 例如你把变量A绑定进去,实际上你的占位符和你的变量A的引用是同一个
- bindValue:绑定一个值到参数中,(简单理解:你传递的变量,他会将值取出然后传递给你的参数,如果是直接量,则直接赋值给参数)
- bindValue可以传递变量,可以书写直接量,他是值传递
区别2:
- bindParam:在执行execute之前,是不进行取值的
- 也就是说,你在执行execute之前改变传递的变量的值,在SQL语句查询时,会受到影响
- bindValue:在执行execute之前,进行取值
- 只要执行了bindValue方法,则值已经被传递进去了,在bindValue之后改变传递的变量的值,是不起作用的
bindColumn
在执行查询语句之后,是【依次】将列的值绑定到一个变量中,通过fetch函数遍历取出
例如:一列共有2行
| name |
|---|
| 小明 |
| 小红 |
| … |
bindColumn('name',$userName);绑定name列到$userName变量中- 在你后续的fetch循环取数据的时候,$userName这个变量保存的就是每一行的数据
- 例如第一次循环:$nameUser的值是:小明
- 那么第二次循环:$nameUser的值是:小红
代码示例:
$sql = "select name,age from users";
$stmt = $pdo->prepare($sql);
$stmt->execute();
$stmt->bindColumn('name',$name);
//或者也可以这么写:
$stmt->bindColumn(1,$name);
while($stmt->fetch()){
echo 'name中的值依次是:' . $name;
echo '<br/>';
}
/*如果表结构与上面的那个表一样,那么,循环将输出,小明和小红*/
echo '一共查询了:' . $stmt->columnCount() . '列;';
本文介绍了PDO预处理语句中的占位符,包括问号和:name形式,并详细解析了bindParam与bindValue的区别。bindParam是引用传递,执行execute前不取值,而bindValue是值传递,执行前已赋值。bindColumn则用于在查询后将列值绑定到变量,便于遍历获取数据。
1万+

被折叠的 条评论
为什么被折叠?



