参数绑定详解
CDbCommand表示一个针对数据库执行的SQL语句,CDbCommand支持SQL语句预处理和参数绑定。 调用 bindParam 去绑定一个PHP变量到SQL中的一个参数。 调用 bindValue 去绑定一个值到一个SQL参数。 当绑定一个参数时,此SQL语句将自动准备好。 也可以调用prepare去明确的准备一条SQL语句。
参数形式:
1、 普通绑定
以变量命名的占位符:
<?php
/* Execute a prepared statement by binding PHP variables */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < :calories AND colour = :colour');
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12);
$sth->execute();
?>
未标记的占位符:
<?php
/* Execute a prepared statement by binding PHP variables */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < ? AND colour = ?');
$sth->bindParam(1, $calories, PDO::PARAM_INT);
$sth->bindParam(2, $colour, PDO::PARAM_STR, 12);
$sth->execute();
?>
2、 使用循环的方式绑定参数时,参数绑定的是地址不是值
正确:
<?php
foreach($params as $key => &$val) {
$sth->bindParam($key, $val);
}
?>
失败:($val by value, because bindParam needs&$variable):
<?php
foreach ($params as $key => $val) {
$sth->bindParam($key, $val);
}
3、 like绑定
错误:
"SELECT* FROM `users` WHERE `firstname` LIKE '%:keyword%'";
没有%时"SELECT * FROM `users` WHERE`firstname` LIKE :keyword";
这样是可以的
如果有%那么必须先将$keyword ="%".$keyword."%";
命名为另一个变量然后在绑定就可以。
例如:
备注:以上变量占位符与?占位符不能混用,否则会报错。
4、 in的绑定方案
在in包含数据是整数时,
例如这一个,返回的数据只有25相关的,只提取了第一个,之前的数据。
所以在绑定in时,需要将in里面的每一个变量单独绑定才能真实的出现所需完整数据。
利用的是?占位符的无命名性来先统计数据个数,然后在循环绑定。所以in中的数据必须是每一个都能实体的数据。
绑定普通字符串时: