Php PDO语句为准备好的语句中的字符串值插入整数

Php PDO语句为准备好的语句中的字符串值插入整数,php,pdo,Php,Pdo,我准备的语句被定义为通用mysql类的方法。使用此方法插入到另一个表中的insert工作正常。插入到特定表中,用整数替换我的所有插值。准备好的语句和查询看起来不错。 看起来插入的整数是从“category_id”字段中插值的 声明的编写: $sql = "INSERT INTO post_data (`headline`, `body`,`online`,`category_id`,`post_date`) VALUES (:headline, :body, :online, :

我准备的语句被定义为通用mysql类的方法。使用此方法插入到另一个表中的insert工作正常。插入到特定表中,用整数替换我的所有插值。准备好的语句和查询看起来不错。 看起来插入的整数是从“category_id”字段中插值的

声明的编写:

$sql = "INSERT INTO post_data (`headline`, `body`,`online`,`category_id`,`post_date`)
        VALUES (:headline, :body, :online, :categoryId, NOW())";
$bindValues = array('headline' => (string) $headline
, 'body' => (string) $body
, 'online' => (int) $online
, 'categoryId' => (int) $categoryId);
$mysql->insert($sql, $bindValues);
$mysql->insert方法(适用于另一个表,但不适用于上述查询:

public function insert($sql, array $bindValues) {
$stmt = $this->pdoConn->prepare($sql);
foreach ($bindValues as $name => $value) {
    $type = PDOBindings::getType($value);
    //see below for PDOBindings::getType()
    $stmt->bindParam($name, $value, $type);
}
try {
     $this->pdoConn->beginTransaction();
     $stmt->execute();
     $this->lastInserted = $this->pdoConn->lastInsertId();
     $this->pdoConn->commit();
} catch(Execption $e) {
     $this->pdoConn->rollback();
     return $e->getMessage();
}
return ($this->lastInserted > 0) ? $this->lastInserted : null;
PDOBindings::getType()静态方法非常简单:

public static function getType($bindValue) {
    $itsType = gettype($bindValue);
    switch ($itsType) {
        case "string":
            return PDO::PARAM_STR;
        break;
        case "integer":
            return PDO::PARAM_INT;
        break;
        case "boolean":
            return PDO::PARAM_BOOL;
        break;
        default :
        return PDO::PARAM_STR;
    }
}
插入:

INSERT INTO post_data (`headline`, `body`,`online`,`category_id`,`post_date`)
VALUES (:headline, :body, :online, :categoryId, NOW())
以下是:

$bindValues = array('headline' => (string) "This is the headline"
       , 'body' => (string) "This is the body field to be inserted"
       , 'online' => (int) 0
       , 'categoryId' => (int) 2);
插入以下行:

id headline body online category_id post_date 7 2 2 2 2 2013-11-03 08:34:49
不会在上面的try块中引发异常。执行只是失败。

无需进入PDO库本身(尽管您可以,因为它是开源的)-它不会覆盖插值


这是您的代码所做的。因此,您必须继续调试。

原因是
bindParam
通过引用绑定参数。您将所有参数绑定到同一个变量
$value
。因此,当您执行准备好的语句时,它将对所有参数使用此变量的最后一个值。这就是为什么要在每一列中插入
2


使用
bindValue
而不是
bindParam
,我认为它应该可以解决您的问题。或者完全摆脱调用
bindParam
的循环,只需将
$bindValues
传递给
execute()

哇。这花了你很多时间。由于代码格式问题,这个问题一直被拒绝。你不能只是剪切和粘贴你的代码。我希望他们能改变这个功能,让我们更容易在这里粘贴代码。只是一个旁注。你的大部分代码都是无用的。你写了很多代码,而且比原始PDOOh更糟糕。嘿,谢谢!你的“答案”是不是告诉我调试编译好的二进制代码!!你不知道这个无用代码的上下文或用法,所以请使用一些你的“常识”我知道足够的编程知识来判断我看到的代码。PDO库不是二进制文件吗?我可能错了。数组值是按它们应该的方式生成的。对$stmt->bindParam($name,$value,$type)的调用传递了正确的预期值。(即$stmt->bindParams('headline','This is a headline',PDO::PARAM_STR);每个二进制代码都是从源代码编译而来的。无论如何,Barmar已经发现了它。使用bindValue非常有效。通过引用传递bindParam的解释非常有意义。它看起来像是使用“bindValue”正确插入的。这也解释了后续GET失败的原因。这一举两得。谢谢!
$this->pdoConn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);