recherche

Maison  >  Questions et réponses  >  le corps du texte

Intégration de Sage Pay/Opayo Forms - PHP 8.1 - Erreur fatale PHP : erreur non détectée : tentative d'attribution de la propriété 'start' sur null

J'ai un problème similaire mais je ne trouve aucune solution pour travailler avec mon code (hérité), donc toute aide que vous pourriez fournir serait grandement appréciée.

Nous utilisons la passerelle de paiement Sage Pay / Opayo via l'intégration de formulaires. En cas de réussite/d'échec, le client sera redirigé vers une URL de notre site Web avec une chaîne _GET cryptée. Après le décryptage, appelez la fonction getToken ( $values = getToken($Decoded); ) pour obtenir la valeur du tableau.

Tous les marqueurs ne sont pas toujours renseignés, je soupçonne que ces valeurs nulles peuvent être à l'origine du problème.

Ce code fonctionne correctement sur PHP 7.1, mais génère une exception sur PHP 8.1 :

[2023-05-03 15:12:15 Europe/Londres] Erreur fatale PHP : erreur non détectée : tentative d'attribution de la propriété 'start' sur null dans /home/sitename/public_html/ch_functions.php:166 Trace de la pile: #0 /home/sitename/public_html/not_completed.php(32) : getToken('VendorTxCode=AP...') #1 {Principal} En ajoutant /home/sitename/public_html/ch_functions.php ligne 166

Le code est le suivant : ce qui échoue sur $resultArray[$i]->start = $start; est :

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粉872182023496 Il y a quelques jours611

répondre à tous(1)je répondrai

  • P粉111927962

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

    Vous faites référence à $resultArray[$i] en tant qu'objet, mais le tableau est vide, il n'y a donc aucun objet à référencer. Dans PHP 7.4 et versions antérieures, vous pouvez effectuer les opérations suivantes :

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

    PHP créera dynamiquement la propriété foo dans l'objet $x[0] 处动态创建一个 stdClass, mais émettra un avertissement :

    Vous supprimez ou ignorez actuellement cet avertissement. En PHP 8.0, cela génère désormais une erreur fatale. Créez donc simplement un objet vide avant d'essayer de définir sa valeur :

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

    ou :

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

    répondre
    0
  • Annulerrépondre