这个PDO绑定功能出了什么问题?

时间:2014-09-22 11:29:00

标签: php pdo

我正在尝试通过创建自己的类来简化我的数据库功能 其中一个函数是bind。它以前工作但现在它做了一些奇怪的事情 代码是:

protected function tInsert(&$connection, $table, $data, $replaceSpecials){
    $sql = $this->createSqlQuery($table, $data);

    $stmt = $connection->prepare($sql);

    /* THIS WORKS
    $stmt->bindParam(":username", $data["username"]);
    $stmt->bindParam(":pass_hash", $data["pass_hash"]);
    $stmt->bindParam(":salt", $data["salt"]);
    $stmt->bindParam(":email", $data["email"]);
    $stmt->bindParam(":sex", $data["sex"]);
    $stmt->bindParam(":birthday", $data["birthday"]);
    $stmt->bindParam(":code", $data["code"]);
    */

    // THIS DOESNT
    $stmt = $this->bind($stmt, $data, $replaceSpecials);

    $stmt->execute();
}

private function bind($stmt, $data, $replaceSpecials){
    if ($replaceSpecials)
        foreach($data as $k => $d){
            $d = str_replace("<", "&lt;",
                str_replace(">", "&gt;", $d));
            $stmt->bindParam(":" . $k, $d);
        }

    else if (!$replaceSpecials)
        foreach($data as $k => $d) 
            $stmt->bindParam(":" . $k, $d);

    else return $this->bind($stmt, $data, false);
    return $stmt;
}

我确定我正确格式化了数据。
注释掉的部分工作,而当我尝试使用我的自定义绑定功能 它不起作用。
它之前在其他功能上工作..
它也不是sql查询..我确定它在某个地方的绑定函数中。

我的最终结果是每个列都填充了最后一个给定的参数 (在此上下文中将是:代码)

e.g。这个数组是数据

array (size=7)
  'salt' => string 'b3d7201e14' (length=10)
  'username' => string 'mister x' (length=8)
  'pass_hash' => string 'd930f9a672bd12c9cf94aff748ca5bd100139bd5bdc7fafbdbfc8ad4bd79ba3c' (length=64)
  'email' => string 'someone@gmail.com' (length=23)
  'sex' => string 'm' (length=1)
  'birthday' => string '25-11-1992' (length=10)
  'code' => string '1ad21a5596cb556' (length=15)

生成的sql查询:

INSERT INTO temp_users (salt, username, pass_hash, email, sex, birthday, code) 
VALUES(:salt, :username, :pass_hash, :email, :sex, :birthday, :code)

1 个答案:

答案 0 :(得分:1)

bindParam()替换为bindValue()。 bindParam定义了用于执行查询的变量名称。因此,当循环结束时,所有变量都绑定到$d,在执行查询时,它具有最后一次迭代的值。

将此更改为bindValue(),您将在函数调用时设置值$d