【问题标题】:DB connect class: bind issue数据库连接类:绑定问题
【发布时间】:2016-01-09 03:50:51
【问题描述】:

我有一个 DB 连接类,一切都很好,除了绑定值的步骤,它在所有字段中插入最后一个字段数据加上类型,而绑定返回数字 2 而不是(INT,BOOL,NULL,.. .) 正如我指定的那样:

所以,它应该插入:

将 fied1 倒入 field1 将 fied2 倒入 field2 将 fied3 倒入 field3

等等,下面是代码:

<?php

final class crud {


public function __construct($connexionName) {

    $this->connexionName  = $connexionName;
}


public final function insert($tableName, $fields=array()){

        $this->tableName = $tableName;
        $this->fields    = $fields;


        foreach ($this->fields as $vf) {

            $inKeys[]       = $vf;
            $inKeysDotted[] = ':' . $vf;

            $insImKeys       = implode(', ', $inKeys);
            $insImKeysDotted = implode(', ', $inKeysDotted);


            $this->insImKeys         = $insImKeys;
            $this->insImKeysDotted   = $insImKeysDotted;

        }

            $this->insertedKeys         = $inKeys;
            $this->insertedKeysDotted   = $inKeysDotted;

            //print_r($this->insertedKeys);

            //echo '<br />';

        $sql = "INSERT INTO `$this->tableName` ($this->insImKeys) VALUES ($this->insImKeysDotted);";
        //echo $sql.'<br />';

        $insertItems = $this->connexionName->prepare($sql);

        $this->insertItems    = $insertItems;

        //print_r($insertItems).'<br />';

} // end prepareStm()


public final function bindParams($setValues=array()){


    $combine = array_combine($this->insertedKeys, $setValues);

    foreach ($combine as $getKey => $getVal) {

        switch ($getVal) {
        case is_int($getVal):
            //echo $getVal .' is INT<br />';
            $setType = PDO::PARAM_INT;
            //return PDO::PARAM_INT;
            break;
        case is_bool($getVal):
            //echo $getVal .' is BOOL<br />';
            $setType = PDO::PARAM_BOOL;
            //return PDO::PARAM_BOOL;
            break;
        case is_null($getVal):
            //echo $getVal .' is NULL<br />';
            $setType = PDO::PARAM_NULL;
            //return PDO::PARAM_NULL;
            break;
        default:
            //echo $getVal .' is STR<br />';
            $setType = PDO::PARAM_STR;
            //return PDO::PARAM_STR;
            break;

        return $setType;
    }


   echo "this->insertItems->bindParam($getKey, $getVal, $setType)<br />";
   $this->insertItems->bindParam($getKey, $getVal, $setType);

   //echo '<pre>';
   //print_r($this->insertItems);
   //echo '</pre>';


    }


} // end bindParams()


public final function executeQuery(){
    return $this->insertItems->execute();
}



}

require_once '../Included_Files/Connect.php';



$con = new crud($connexion);

echo '<br />';

$con->insert('test', array('field1', 'field2', 'field3'));
$con->bindParams(array('pour field1', 'pour field2', 'pour field3'));
$con->executeQuery();

?>

echo 和 print_r 的结果是:

INSERT INTO `test` (field1, field2, field3) VALUES (:field1, :field2, :field3);
this->insertItems->bindParam(field1, pour field1, 2)

this->insertItems->bindParam(field2, pour field2, 2)

this->insertItems->bindParam(field3, pour field3, 2) 

感谢您的支持

【问题讨论】:

    标签: php class pdo bind


    【解决方案1】:

    您的代码中有两个问题,一个主要问题,一个次要问题。

    首先,因为您使用的是PDOStatement::bindParam(),所以您绑定的是一个变量,而不是一个值。这意味着当您调用时

    $this->insertItems->bindParam("field1", $getVal, PDO::PARAM_STR);
    $this->insertItems->bindParam("field2", $getVal, PDO::PARAM_STR);
    $this->insertItems->bindParam("field3", $getVal, PDO::PARAM_STR);
    

    在循环的三个连续迭代中,所有三个这些字段都绑定到变量$getVal,其值在每次循环中都会发生变化。

    您想要做的是致电PDOStatement::bindValue()。这会将 $getVal 的值(在您进行调用时)绑定到参数,而不是变量本身。

    这是您的主要问题,解决该问题将使您的代码(大部分)正常工作。


    你的小问题是你的 switch 语句:

    switch ($getVal) {
       case is_int($getVal):
       ...
    

    这相当于写if($getVal == is_int($getVal))。这意味着,如果$getVal === '0'(也就是说,$getVal 是一个字符串,其值在布尔上下文中的计算结果为 false),那么'0' == is_int($getVal)('0' 不是 int,所以 is_int 返回 false),最后你试图将字符串 '0' 绑定为一个整数。

    您应该将 switch 语句替换为一系列 if/else if 语句,或者改用 switch(true)

    【讨论】:

    • 我用了 if/else,结果还是一样:if(is_int($getVal)){ $setType = PDO::PARAM_INT; }
    • 但是您是否将bindParam() 更改为bindValue()?这是代码中的主要问题,它根本无法正常工作。
    • 好吧,如果我引用了参数: $setType = "PDO::PARAM_STR";并回显它们,它返回正确的值,我认为因为它不是字符串,它只是一个参数,它将返回与该参数等效的数字,如果我错了,请纠正我
    • PDO::PARAM_STR 不应有引号。您不需要进行该更改,目前还不清楚您为什么这样做。
    • 我只是为了测试我得到了正确的参数类型,我认为绑定问题已经解决,它正在获取与该类型等效的数字
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 2010-09-13
    • 2016-07-12
    • 2012-02-29
    相关资源
    最近更新 更多