2017-04-07 1 views
-1

のnullでgetFreeFormNumber()を呼び出すと、Keith Palmer Quickbooks PHP APIに取り組んでいました。それはすべてうまく動作し、接続します。サンプルクエリは結果を配列で返します。私がしたかったのは、結果配列を実行してmysqliテーブルにレコードを保存するmysqliのinsert文を実行することでした。致命的なエラー:C: qbapi quickbooks-php-master docs

ここで私はQuickbooksからレコードを取得し、mysqliテーブルに保存するコードです。 ?

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

私は、顧客のクエリを実行し、コードが私のQuickBooksに保存された顧客を取得し、私の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); 

} 

>

私の質問は、私はこのエラーを取得することです。しかし何らかの理由で上記のエラーが発生します。

+0

'$ Customer-> getPrimaryPhone(0)'が空またはNULLであるため、修正する必要があります。 –

+0

[Little Bobby](http://bobby-tables.com/)によると*** [あなたのスクリプトはSQLインジェクション攻撃の危険にさらされています。](http://stackoverflow.com/questions/60174/how-can- i-prevent-sql-in-php)***。 [文字列をエスケープする](http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string)でも安全ではありません! –

+0

クイックブックからレコードを取得するときに、それらのすべてに電話番号が保存されているわけではありません。だから電話番号のあるレコードがあり、そうでないレコードもある。 foreachループでは、$ Customer-> getPrimaryPhone(0)**は連絡先番号を持たないレコードではnullであるが、連絡先番号であれば機能する。私はまだレコードを保存したいが、レコードには連絡先番号があります。ありがとう。 –

答えて

2

最初に値をテストしてから、関数呼び出しを実行してその結果を変数に代入します。次に、クエリ内の変数を使用します。

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); 

} 

警告!

Little Bobbyyour script is at risk for SQL Injection Attacks.を言います。でもescaping the stringは安全ではありません!

+0

お返事ありがとうございます。私はちょうど電話番号を確認するあなたのコードを追加しました。コードをトリガーするボタンをクリックすると、サーバーエラーが発生します。 **ステータスコード:500 Internal Server Error ** ....私は以前に** php(isset)**を追加しましたが、それは私にサーバーエラーを与えます。 –

+0

'$ Customer-> getPrimaryPhone(0)'をエコーアウトするとどうなりますか? –