2017-04-07 4 views
-1

Je travaillais sur l'API Keith Palmer Quickbooks PHP. Tout fonctionne bien et se connecte. Les requêtes d'exemple renvoient le résultat dans des tableaux. Ce que je voulais faire est d'exécuter une instruction d'insertion mysqli qui s'exécuterait dans le tableau des résultats et enregistrerait les enregistrements dans la table mysqli.Erreur fatale: Appel à une fonction membre getFreeFormNumber() sur null dans C: qbapi quickbooks-php-master docs

Voici mon code qui récupère les enregistrements de Quickbooks et les enregistre dans la table mysqli. ?

$customers = $CustomerService->query($Context, $realm, "SELECT * FROM Customer"); 


foreach ($customers as $Customer) 
{ 

//First, we will retrieve the ID, and strip out any spaces/characters. 
$id = $Customer->getId(); 
$str = preg_replace("/[^0-9]/","",$id); 

    //Insert customer into customer tables. 
     $sql = "INSERT INTO Customers (CustomerID__kp, CustomerName, CustomerAddress1, CustomerCity, CustomerCounty, CustomerPostcode, CustomerTelephone) 

      VALUES ('".$str."', 
        '".$Customer->getFullyQualifiedName()."', 
        '".$Customer->getBillAddr(0)->getLine1()."', 
        '".$Customer->getBillAddr(0)->getCity()."', 
        '".$Customer->getBillAddr(0)->getCountrySubDivisionCode()."', 
        '".$Customer->getBillAddr(0)->getPostalCode()."', 
        '".$Customer->getPrimaryPhone(0)->getFreeFormNumber()."' 

        ) 
        ON DUPLICATE KEY 
        UPDATE CustomerName = '".$Customer->getFullyQualifiedName()."', 
        CustomerAddress1 = '".$Customer->getBillAddr(0)->getLine1()."', 
        CustomerCity = '".$Customer->getBillAddr(0)->getCity()."', 
        CustomerCounty = '".$Customer->getBillAddr(0)->getCountrySubDivisionCode()."', 
        CustomerPostcode = '".$Customer->getBillAddr(0)->getPostalCode()."', 
        CustomerTelephone = '".$Customer->getPrimaryPhone(0)->getFreeFormNumber()."' 
        "; 

     $conn->query($sql); 

} 

>

Ma question est que je reçois cette erreur:

Fatal error: Call to a member function getFreeFormNumber() on null in C:\qbapi\quickbooks-php-master\docs\

Quand je lance les requêtes des clients, le code obtient les clients enregistrés dans mes QuickBooks et sauve dans mon mysqli. Mais pour une raison quelconque, je reçois l'erreur ci-dessus.

+0

'$ Customer-> getPrimaryPhone (0)' est vide ou NULL, vous devez corriger cela. –

+0

[Little Bobby] (http://bobby-tables.com/) dit *** [votre script est à risque pour les attaques par injection SQL.] (Http://stackoverflow.com/questions/60174/how-can- i-prevent-sql-injection-en-php) ***. Même [échapper la chaîne] (http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string) n'est pas sûr! –

+0

Lorsque je reçois les enregistrements des quickbooks, tous n'ont pas de numéro de téléphone enregistré. Il y a donc des enregistrements avec des numéros de téléphones et d'autres non. Dans foreach loop ** $ Customer-> getPrimaryPhone (0) ** peut par null pour les enregistrements qui n'ont pas de numéro de contact mais cela fonctionnera si le numéro de contact. Je veux toujours enregistrer les enregistrements néanmoins les enregistrements ont le numéro de contact ou pas. Merci. –

Répondre

2

Vous souhaitez d'abord tester la valeur, puis effectuer l'appel de fonction et affecter le résultat à une variable. Ensuite, utilisez la variable dans la requête:

foreach ($customers as $Customer) 
{ 

//First, we will retrieve the ID, and strip out any spaces/characters. 
$id = $Customer->getId(); 
$str = preg_replace("/[^0-9]/","",$id); 

// test customer phone number 
if(isset($Customer->getPrimaryPhone(0))){ 
    $CustomerTelephone = $Customer->getPrimaryPhone(0)->getFreeFormNumber(); 
} else { 
    $CustomerTelephone = ''; 
} 

    //Insert customer into customer tables. 
     $sql = "INSERT INTO Customers (CustomerID__kp, CustomerName, CustomerAddress1, CustomerCity, CustomerCounty, CustomerPostcode, CustomerTelephone) 

      VALUES ('".$str."', 
        '".$Customer->getFullyQualifiedName()."', 
        '".$Customer->getBillAddr(0)->getLine1()."', 
        '".$Customer->getBillAddr(0)->getCity()."', 
        '".$Customer->getBillAddr(0)->getCountrySubDivisionCode()."', 
        '".$Customer->getBillAddr(0)->getPostalCode()."', 
        '".$CustomerTelephone."' 

        ) 
        ON DUPLICATE KEY 
        UPDATE CustomerName = '".$Customer->getFullyQualifiedName()."', 
        CustomerAddress1 = '".$Customer->getBillAddr(0)->getLine1()."', 
        CustomerCity = '".$Customer->getBillAddr(0)->getCity()."', 
        CustomerCounty = '".$Customer->getBillAddr(0)->getCountrySubDivisionCode()."', 
        CustomerPostcode = '".$Customer->getBillAddr(0)->getPostalCode()."', 
        CustomerTelephone = '".$CustomerTelephone."' 
        "; 

     $conn->query($sql); 

} 

AVERTISSEMENT!

Little Bobby dit your script is at risk for SQL Injection Attacks.. Même escaping the string n'est pas sûr!

+0

Merci pour la réponse. Je viens d'ajouter votre code de vérification du numéro de téléphone. Quand je clique sur le bouton qui déclenche le code, j'obtiens une erreur de serveur. ** Code d'état: 500 Erreur de serveur interne ** .... J'ai ajouté ** php (isset) ** plus tôt mais cela me donne une erreur de serveur. –

+0

Que se passe-t-il si vous renvoyez '$ Customer-> getPrimaryPhone (0)'? –