Heim  >  Fragen und Antworten  >  Hauptteil

Sage Pay/Opayo Forms-Integration – PHP 8.1 – Schwerwiegender PHP-Fehler: Nicht erfasster Fehler: Versuch, die Eigenschaft „Start“ auf Null zuzuweisen

Ich habe ein ähnliches Problem, aber ich finde keine Lösung für die Arbeit mit meinem (geerbten) Code. Daher wäre ich für jede Hilfe sehr dankbar.

Wir nutzen das Sage Pay / Opayo-Zahlungsgateway über die Formularintegration. Nach Abschluss/Fehler wird der Kunde mit einer verschlüsselten _GET-Zeichenfolge zu einer URL auf unserer Website weitergeleitet. Rufen Sie nach der Entschlüsselung die Funktion getToken ( $values = getToken($Decoded); ) auf, um den Wert aus dem Array abzurufen.

Es werden jedoch nicht immer alle Marker ausgefüllt. Ich vermute, dass diese Nullwerte die Ursache des Problems sein könnten.

Dieser Code läuft einwandfrei unter PHP 7.1, löst jedoch unter PHP 8.1 eine Ausnahme aus:

[03.05.2023 15:12:15 Europa/London] Schwerwiegender PHP-Fehler: Nicht abgefangener Fehler: Versuch, die Eigenschaft „start“ auf null in /home/sitename/public_html/ch_functions.php:166 zuzuweisen Stacktrace: #0 /home/sitename/public_html/not_completed.php(32): getToken('VendorTxCode=AP...') #1 {Haupt} Einwerfen /home/sitename/public_html/ch_functions.php Zeile 166

Der Code lautet: Was bei $resultArray[$i]->start = $start; fehlschlägt, ist:

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粉872182023P粉872182023431 Tage vor556

Antworte allen(1)Ich werde antworten

  • P粉111927962

    P粉1119279622023-09-08 15:29:37

    您将 $resultArray[$i] 作为对象引用,但该数组为空,因此没有可供引用的对象。在 PHP 7.4 及更早版本中,您可以执行以下操作:

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

    PHP 会在 $x[0] 处动态创建一个 stdClass 对象,然后动态创建 foo 属性,但会发出警告:

    您当前正在抑制或忽略此警告。在 PHP 8.0 中,这现在会生成致命错误。因此,只需在尝试设置其值之前创建一个空对象即可:

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

    或者:

    if ($start !== false) {
        $resultArray[$i] = (object) [
            'start' => $start,
            'token' => $Tokens[$i],
        ];
    }

    Antwort
    0
  • StornierenAntwort