2017-10-18 6 views
0

j'obtiensErreur sur l'appel d'une fonction avec la connexion au serveur SQL

Fatal error: Call to a member function query() on a non-object in C:...\test.php on line 27

après avoir appelé 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'))); 
     }  
    } 

?> 

Pourquoi l'erreur n'apparaît-elle qu'à ce moment-là? Est-ce la meilleure façon de faire cela?

Cordialement, Elio Fernandes

+0

globals ... yuk. Passez simplement l'objet $ pdo à votre fonction exeQuery. Et même si 'global $ pdo; 'fonctionne, il semble que $ pdo n'a pas été instancié. dbConnect() doit retourner l'objet $ pdo qu'il crée, afin que vous puissiez le passer à d'autres fonctions. – ADyson

+0

Adyson, est-ce que cela vous dérange de faire les changements que vous dites dans le code que j'ai posté? –

Répondre

0

Ce serait mieux sans la partie encapsulées global $pdo;. Au lieu de cela, renvoyez l'objet PDO de votre méthode connect, et transmettez-le aux autres, pour être utilisé.

N.B. J'ai délibérément donné aux variables des noms différents dans des endroits différents, pour illustrer que le nom ne doit pas nécessairement être le même lorsqu'il est transmis d'une étendue à une autre, c'est l'objet qui est passé qui est important. Vous pourriez peut-être envisager d'utiliser des noms cohérents, afin de faciliter la compréhension du code plus tard, et de tracer l'objet à travers le flux.

<?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'))); 
    }  
} 
?> 
+1

Merci pour votre aide. –