Penyepaduan Borang Sage Pay/Opayo - PHP 8.1 - Ralat Maut PHP: Ralat Tidak Ditangkap: Percubaan untuk menetapkan 'mula' harta pada nol
P粉872182023
P粉872182023 2023-09-07 22:16:21
0
1
590

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;

}

P粉872182023
P粉872182023

membalas semua(1)
P粉111927962

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:

$x = [];
$x[0]->foo = 1;

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:

if ($start !== false) {
    $resultArray[$i] = new stdClass();
    $resultArray[$i]->start = $start;
    $resultArray[$i]->token = $Tokens[$i];
}

atau:

if ($start !== false) {
    $resultArray[$i] = (object) [
        'start' => $start,
        'token' => $Tokens[$i],
    ];
}
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan