• bindParam() 和 bindValue() 的区别


    何时评估变量

    绑定值.php
    $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() 立即计算变量。

    bind_param.php
    $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() 指定了一个未定义的数组,则会发生错误。

    bindParam() 的副作用 (?)

    奇怪的行为.php
    $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.phpbindParam()如果指定为第三个参数,PDO::PARAM_INT如果要绑定的变量不是整数类型就会报错,$id感觉会是个比较麻烦的问题.

  • 相关阅读:
    Windows:VS Code IDE安装ESP-IDF【保姆级】
    Vue2_lesson4_el与data的两种方式
    验证 Vue Props 类型,你这几种方式你可能还没试用过
    【Java每日一题】— —第十八题:求二维数组中的元素最小值及其索引。(2023.10.02)
    1.4_3 Axure RP 9 for mac 高保真原型图 - 案例2 【旋转的唱片】
    03、GO语言变量定义、函数
    第一章:初识C++
    搭建一个自定义的工作流管理平台(二)
    如何快速挣到一百万
    Matlab中关于 : 的使用
  • 原文地址:https://blog.csdn.net/allway2/article/details/126841474