Saya mengalami masalah yang sama tetapi saya tidak boleh mendapatkan sebarang penyelesaian untuk bekerja dengan kod (warisan) saya jadi sebarang bantuan yang anda boleh berikan akan sangat dihargai.
Kami menggunakan gerbang pembayaran Sage Pay / Opayo melalui penyepaduan borang.
Setelah selesai/gagal, pelanggan akan dialihkan ke URL di tapak web kami dengan rentetan _GET yang disulitkan.
Selepas penyahsulitan, panggil fungsi getToken ( $values = getToken($Decoded);
) untuk mendapatkan nilai daripada tatasusunan.
Tidak semua penanda sentiasa diisi walaupun, saya mengesyaki nilai nol ini mungkin menjadi punca masalah.
Kod ini berfungsi dengan baik pada PHP 7.1, tetapi memberikan pengecualian pada PHP 8.1:
[2023-05-03 15:12:15 Europe/London] Ralat maut PHP: Ralat Tidak Ditangkap: Mencuba untuk menetapkan sifat 'mula' pada null dalam /home/sitename/public_html/ch_functions.php:166 Jejak tindanan: #0 /home/sitename/public_html/not_completed.php(32): getToken('VendorTxCode=AP...') #1 {Utama} Membuang /home/sitename/public_html/ch_functions.php baris 166
Kodnya ialah, apa yang gagal pada $resultArray[$i]->start = $start;
ialah:
function getToken($thisString) { // List the possible tokens $Tokens = array("Status","StatusDetail","VendorTxCode","VPSTxId","TxAuthNo","Amount","AVSCV2","AddressResult","PostCodeResult","CV2Result","GiftAid","3DSecureStatus","CAVV", "AddressStatus", "PayerStatus", "CardType", "Last4Digits","BankAuthCode","DeclineCode"); // Initialise arrays $output = array(); $resultArray = array(); // Get the next token in the sequence for ($i = count($Tokens)-1; $i >= 0 ; $i--){ // Find the position in the string $start = strpos($thisString, $Tokens[$i]); // If it's present if ($start !== false){ // Record position and token name $resultArray[$i]->start = $start; $resultArray[$i]->token = $Tokens[$i]; } } // Sort in order of position sort($resultArray); // Go through the result array, getting the token values for ($i = 0; $i<count($resultArray); $i++){ // Get the start point of the value $valueStart = $resultArray[$i]->start + strlen($resultArray[$i]->token) + 1; // Get the length of the value if ($i==(count($resultArray)-1)) { $output[$resultArray[$i]->token] = substr($thisString, $valueStart); } else { $valueLength = $resultArray[$i+1]->start - $resultArray[$i]->start - strlen($resultArray[$i]->token) - 2; $output[$resultArray[$i]->token] = substr($thisString, $valueStart, $valueLength); } } // Return the ouput array return $output; }
Anda merujuk
$resultArray[$i]
sebagai objek, tetapi tatasusunan kosong, jadi tiada objek untuk dirujuk. Dalam PHP 7.4 dan lebih awal anda boleh melakukan perkara berikut:PHP akan mencipta sifat foo secara dinamik dalam objek
$x[0]
处动态创建一个stdClass
, tetapi akan mengeluarkan amaran:Anda sedang menahan atau mengabaikan amaran ini. Dalam PHP 8.0, ini kini menghasilkan ralat maut. Jadi cuma buat objek kosong sebelum cuba menetapkan nilainya:
atau: