2017-09-04 9 views
0

私のコードと私の結果の両方を見ていますが、目立ったエラーは見られないので、いくつか余分な目を見せておくと便利だと思いました終わった。WordPressの奇妙な動作JSONエンコードされたデータのMySQL挿入

データベース内のトランザクションテーブルを更新するカスタムPayPal IPNリスナーがあります。私は仕事を辞める前に金曜日にそれを配備しました。今日帰ってからはうまくいっているようです。ほとんどがです。なぜ私は1つのインサートが奇妙に動作したのかを理解したいと思います。ここで

は、週末に起こったインサートのキャプチャです: PayPal IPN log

あなたが見ることができるように、第四取引のlog列の意図JSON値は空です。 transaction_id列の値が同じ配列から解析されているので、私はそれが不思議です。ここで

は、関連するデシベル insertコードです:トランザクションIDとして見

// Generate valid IPN log 
private function generateIpnLog() { 
    global $wpdb; 

    // prepare log 
    $array_log = []; 
    $array_log['verified'] = true; 
    $array_log['ipn_response'] = (isset($this->PayPal_Response)) ? : 'Error reading from POST array'; 

    // Parse transaction ID 
    $transaction_id = (isset($this->PayPal_Response['txn_id'])) ? $this->PayPal_Response['txn_id'] : null; 

    // Generate log 
    $log = json_encode($array_log); 

    // Update DB 
    $wpdb->insert(
     'log_paypal', 
     [ 
      'transaction_id' => ($transaction_id) ? $transaction_id : 'Error getting transaction ID', 
      'log' => ($log) ? $log : 'Error generating transaction log' 
     ], 
     [ 
      '%s', 
      '%s' 
     ] 
    ); 

    // json log response 
    $this->json_return = $log; 
} 

PayPalの応答から細かい解析され、そして、我々が知っているので$array_log['verified']は私の推測では、問題がなければならないで明示的に宣言された値を持っていますjson_encode($array_log)

また、問題のPayPalアカウントのPayPal IPNの履歴からデータをチェックし、NULL log列と他の列との間にデータが形成される方法に違いがないことも確認できます。

誰でもこのインスタンスで何が起こっているのか考えていますか?

+0

私は右のそれを得た場合、あなたは 'log'(' $ array_log')が空の行にあったはずのものを知ることができましたか?それを編集する必要があります。それはかなり重要です。 – ishegg

+0

@isheggあなたの質問は何か分かりませんが、IPNデータを手動で更新できるかどうかを尋ねている場合は可能です。しかし、それは明らかに長期的には役に立たない。 – DrewT

+1

いいえ、私は '$ array_log'を手動で再構築して、正しくエンコードしなかったのを確認できますか? – ishegg

答えて

0

@isheggが提案したように、PayPal IPNはwindows-1252エンコーディングを使用し、DBフィールドはUTF-8にエンコードされていたため、エンコードの問題でした。

このケースでは、PayPalの返品データがネスト/多次元(以下を参照)ではないので、修正するのは簡単でした。 PayPalのIPNのエントリは、暗号証明書チェーンによって検証された後、以前の関数の中で呼び出され

// Process IPN response 
$this->PayPal_Response = $this->processIpn(); 

次に、関数自体:

// Manipulate IPN response and prepare 
// for database update and log 
private function processIpn() { 
    // Response ref. 
    $response = $this->post_array; 

    if (isset($response['charset'])) { 
     if ($response['charset'] == "windows-1252") { 
      foreach ($response as $key => $ipn_value) { 
       $response[$key] = mb_convert_encoding($ipn_value, 'UTF-8', 'Windows-1252'); 
      } 
     } 
    } 
    return $response; 
}