【问题标题】:Error on calling a function with connection to SQL server调用连接到 SQL Server 的函数时出错
【发布时间】:2017-10-18 15:05:22
【问题描述】:

我得到了

致命错误:在非对象上调用成员函数 query() C:...\test.php 第 27 行

拨打callQuery2之后。

<?php
    dbConnect();
    callQuery1();
    callQuery2();

    function callQuery1(){
        // SQL query
        $q = "SELECT * FROM table1 WHERE name like 'john%' ";

        // Execute query
        $data1 = exeQuery($q);  
    }

    function callQuery2(){
        // SQL query
        $q = "SELECT * FROM table2 WHERE event = 'holiday' ";

        // Execute query
        $data2 = exeQuery($q);  
    }

    // Execute SQL Query
    function exeQuery($qry) {
        global $pdo;

    ####### LINE 27 #######
        $stmt = $pdo->query($qry);

        if($stmt = $pdo->prepare($qry)) {
            $stmt->execute();
            $data = $stmt->fetchAll(PDO::FETCH_ASSOC);
            $stmt->closeCursor();       
            return $data;
        }
    }

    // database connection
    function dbConnect(){

        $DBSERVER = "***";
        $DBUSER   = "***";
        $DBPASS   = "***";
        $DBNAME   = "***";

        // OBDC
        try {       
            $pdo = new PDO("odbc:DRIVER={SQL Server};Server={$DBSERVER};Database={$DBNAME}", $DBUSER, $DBPASS);
            // set the PDO error mode to exception
            $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            //die(json_encode(array('outcome' => true)));
        }
        catch(PDOException $ex) {
            //die(json_decode(array('outcome' => false, 'message' => 'Unable to connect')));
        }       
    }

?>

为什么错误只出现在那个时间之后? 有更好的方法吗?

问候, 埃利奥·费尔南德斯

【问题讨论】:

  • globals...yuk。只需将 $pdo 对象传递给您的 exeQuery 函数。即使global $pdo; 实际上工作,似乎 $pdo 还没有被实例化。 dbConnect() 应该返回它创建的 $pdo 对象,因此您可以将它传递给其他函数。
  • Adyson,您介意在我发布的代码中进行您所说的更改吗?

标签: php sql-server database


【解决方案1】:

没有global $pdo; 部分会更好地封装。而是从您的 connect 方法返回 PDO 对象,并将其传递给其他对象以供使用。

注意我特意在不同的地方为变量赋予了不同的名称,以说明当它从一个范围传递到另一个范围时,名称不必相同,重要的是传递的对象。不过,您可能会考虑使用一致的名称,以便以后更容易理解代码,并通过流程跟踪对象。

<?php
$dbConn = dbConnect();
callQuery1($dbConn);
callQuery2($dbConn);

function callQuery1($db){
    // SQL query
    $q = "SELECT * FROM table1 WHERE name like 'john%' ";

    // Execute query
    $data1 = exeQuery($q, $db);
}

function callQuery2($db){
    // SQL query
    $q = "SELECT * FROM table2 WHERE event = 'holiday' ";

    // Execute query
    $data2 = exeQuery($q, $db);
}

// Execute SQL Query
function exeQuery($qry, $pdo) {

####### LINE 27 #######
    $stmt = $pdo->query($qry);

    if($stmt = $pdo->prepare($qry)) {
        $stmt->execute();
        $data = $stmt->fetchAll(PDO::FETCH_ASSOC);
        $stmt->closeCursor();       
        return $data;
    }
}

// database connection
function dbConnect(){

    $DBSERVER = "***";
    $DBUSER   = "***";
    $DBPASS   = "***";
    $DBNAME   = "***";

    // OBDC
    try {       
        $pdo = new PDO("odbc:DRIVER={SQL Server};Server={$DBSERVER};Database={$DBNAME}", $DBUSER, $DBPASS);
        // set the PDO error mode to exception
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        return $pdo;
    }
    catch(PDOException $ex) {
        //die(json_decode(array('outcome' => false, 'message' => 'Unable to connect')));
    }       
}
?>

【讨论】:

  • 感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多