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
P粉872182023
P粉872182023 2023-09-07 22:16:21
0
1
586

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粉872182023
P粉872182023

répondre à tous(1)
P粉111927962

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],
    ];
}
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal