$statement = $database->prepare('INSERT INTO favorite_category (id_users, category_id) values(:id, :category_id)'); $id = 3; $categoryID = 10; $statement->bindParam(':id', $id); $statement->bindParam(':category_id', $categoryID); $statement->execute(); $statement->bindValue(':id', 3); $statement->bindValue(':category_id', 10); $statement->execute();
如果不包含变量,bindParam() 将引发错误。bindValue() 直接放值或者放变量都可以。
bindParam() 在执行时评估变量。bindValue() 立即计算变量。
$a = [ 'id' => 2, 'user' => 'jack', 'sex' => 1, 'prefecture' => 24 ]; $statement = $db->prepare('INSERT INTO users (id, name, sex, birthday, prefecture) VALUES (?, ?, ?, ?)'); $statement->bindParam(1, $a['id'], PDO::PARAM_STRING); $statement->bindParam(1, $a['name'], PDO::PARAM_INT); $statement->bindParam(2, $a['sex'], PDO::PARAM_INT); $statement->bindParam(4, $a['prefecture'], PDO::PARAM_STRING); $statement->execute();
由于 bindParam() 不会在现场对变量进行求值,因此即使指定了未定义的数组也不会出错,即使以未定义的方式执行也不会出错。如果 bindValue() 指定了一个未定义的数组,则会发生错误。
$statement = $database->prepare(/** 省略 **/); $id = 3; $statement->bindParam(':id', $id, PDO::PARAM_INT); var_dump($id); //=> int(3); $statement->execute(); var_dump($id); //=> string(1) "3"
bindParam()仅在使用时发生 execute()执行后传递的变量bindParam()是字符串类型。strange_behavior.php的情况下,$id从整数类型变为字符串类型,因此,$id如果在执行查询后在某个进程中使用,则存在意外行为的风险。
PDO也有这样的例子,就是这样strange_behavior.php,bindParam()如果指定为第三个参数,PDO::PARAM_INT如果要绑定的变量不是整数类型就会报错,$id感觉会是个比较麻烦的问题.