自动分配PDO类型

时间:2016-01-08 03:18:13

标签: php pdo bind

我的PDO类有一个名为bindParams的函数,它有2个参数:setValues和setType,

输出结果应该是:

$insertNews->bindParam(':news_title', $newsTitle, PDO::PARAM_STR);

所以,我希望自动分配" PDO :: PARAM_STR"他们的价值观,在我的情况下" news_title"是变量setValues," PDO :: PARAM_STR"是setType:

public final function bindParams($setValues=array(), $setType = null){

    //print_r($setValues);

    foreach ($setValues as $getVal) {

        echo $getVal.'<br />';

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


    }

} // end bindParams()

$con = new crud($dbCon);
$con->insert('ban_ip', array('visitor_type', 'ip'));
$con->bindParams(array('Visitor_Type', 1));

输出结果为:

  

Visitor_Type为STR

它没有循环其他值,即1。

编辑:正确的代码:

我认为这个有效:

public final function bindParams($setValues=array(), $setType = null){


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

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

        //echo 'key '.$getKey.' val '.$getVal.'<br />';

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


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


    }


} // end bindParams()

结果是:

Visitor_Type is STR
this->stmt->bindParams(visitor_type, Visitor_Type, PDO::PARAM_STR)
1 is INT
this->stmt->bindParams(ip, 1, PDO::PARAM_INT)

如果我没有弄错的话,我应该只执行没有任何回声的代码来运行它。

感谢您的帮助

1 个答案:

答案 0 :(得分:4)

发生的事情是,在第一次通过循环设置$ setType之后,在后续迭代中,is_null($ setType)返回false,因此switch语句永远不会计算。

你可以做几件不同的事情,这取决于你是否真的打算传入$ setType。如果不这样做,则应删除$ setType参数和is_null检查,然后在switch语句后添加对bindParam($ getVal,$ setType)的调用。

另外,要小心你的switch语句值:你可能想切换(true)(或只是使用if语句),而不是切换($ getVal),因为根据实际值你也会得到不同的结果(不是只需输入$ getVal。