【问题标题】:PHP PDO Database class parameter passingPHP PDO 数据库类参数传递
【发布时间】:2014-04-21 14:03:09
【问题描述】:

我想设置一个包含多个参数的数组,将它传递给我的数据库类。目前我只能发送一个参数,但一般我的sql查询有多个参数。

示例数据库方法:

public function fetchQuery($sql,$params,$conn){
    try{
        $queryparams=array($params);
        $x=$conn->prepare($sql);
        $x->execute($queryparams);
        $rArray = $x->fetchAll(PDO::FETCH_ASSOC);
        return $rArray;
    }catch (Exception $e){
        die( print_r( $e->getMessage() ) );
    }
}

调用数据库方法:

        $params=$vendID;
        $sql = "SELECT Email from Contact WHERE VendID = ?";

 try{
          $emails=$db->fetchQuery($sql,$params,$conn);
          $eCount = count($emails);
           if($eCount>0){
                foreach($emails as $row){
                    $eArray[]=$row['Email'];
                }
            }else{
                echo "No email addresses associated with this vendor";
            }
        }
        catch(Exception $e){
            die( print_r( $e->getMessage() ) );
        }

现在说我的 sql 查询是这样的:“从联系人中选择 *,其中 CustID=?和过期=?” 我将如何构建一个数组并将其传递给我的函数?

每次尝试时,我都会收到一个数组到字符串转换错误。

谢谢

【问题讨论】:

    标签: php oop pdo sqlsrv


    【解决方案1】:

    现在说我的 sql 查询类似于:“Select * from Contact where CustID=? 和过期=?”我将如何构建一个数组并将其传递到我的 功能?

    我会删除代码中的$queryparams=array($params); 部分,并始终将数组传递给函数,即使它只有一个元素。

    $params= array($custID);
    $sql = "SELECT Email from Contact WHERE VendID = ?";
    
    try{
        $emails=$db->fetchQuery($sql,$params,$conn);
    

    多个

    $params= array($vendID, $expired);
    $sql = "Select * from Contact where CustID=? and Expired=?";
    
    try{
        $emails=$db->fetchQuery($sql,$params,$conn);
    

    我个人更喜欢命名参数,我可以在其中使用关联数组:

    $sql = "Select * from Contact where CustID= :custId and Expired= :expired";
    
    $params= array(':custId'=>$custID, 
                   ':expired'=>$expired
    );
    

    【讨论】:

    • 请解释一下投票,我厌倦了这个..如果你发现有问题什么!!!
    • 感谢您的回复,这正是我想要的。非常感谢。
    【解决方案2】:

    在您的 fetchQuery 方法中,您可以检查 $params 是否已经是一个数组。

    <?php
    if (is_array($params)) {
        $queryParams = $params;
    }
    else {
        $queryParams = array($params);
    }
    

    【讨论】:

    • 请解释我如何改进我的答案,或者不清楚的地方,而不是(或除了)downvoting
    【解决方案3】:

    您实际上并不需要此功能。它可以节省您只输入几个单词的时间。
    但同时它也限制了您使用 PDO。使用原始 pdo 查看您的代码

    $stmt = $con->prepare("SELECT Email from Contact WHERE VendID = ?");
    $stmt->execute([$vendID]);
    $emails = $stmt->fetchAll(PDO::FETCH_COLUMN);
    if(!$emails){
        echo "No email addresses associated with this vendor";
    }
    

    它比你的函数短 3 倍。
    PDO 本身已经是一个包装器。一个人需要非常有力的理由和太多的经验才能熟练地扩展它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-17
      • 2016-12-16
      • 2013-08-03
      • 2011-03-13
      相关资源
      最近更新 更多