Błąd po zmianie z php 7.3 na 8.1: Cannot access offset of type string on string

0

Witajcie.
Mam do "naprawy" skrypt, który zaczął się sypać prawdopodobnie po zmianie php na 8.1. Problem w tym, że nie bardzo mam możliwość debugowania go (błąd znalazłem w logach).

Komunikat błędu:

Cannot access offset of type string on string
#0 /home/www/classs.php(529): ClassName->convertXmlToExportXml()
#1 /home/www/classs.php(656): ClassName->sendToApi()
#2 /home/www/classs.php(103): ClassName->sendToApi2()
#3 {main}

Kod wygląda następująco:

$o = new TQuery();
$o->sql = "select * from tablename where id = " . $id;
$o->Open();
if (!$o->isRow) {
  return false;
}

$rCode = $o->fieldByName('r_code');
if ($rCode == 'AM' || $rCode == 'AG') {
    $rCode = 'A1';
} else {
    $rCode = 'A2';
}

    $parsedXml = $this->convertXmlToExportXml($rCode);
    if (!$parsedXml) {
        return false;
    }

private function convertXmlToExportXml( $rCode) {
.......
}

Linia 529 to: $parsedXml = $this->convertXmlToExportXml($rCode);

Widzi ktoś może błąd?

Z góry dziękuje za pomoc :)

2

Ciężko powiedzieć. Ani nie wiadomo która to linia, ani co wchodzi.
Przykład kodu który generuje taki błąd:

<?php
$string = "abcd";
print $string[1];
print $string['stringThatSholudBeOffset'];//Fatal error: Uncaught TypeError: Cannot access offset of type string on string

Wcześniej to co wchodziło mogło być tablicą, teraz jest stringiem.
Teraz prośba, nie pisz że nie możesz tego Debugować tylko na to debugowanie znajdź sposób.
Print tego co wchodzi do logów. Podpięcie zdalnie debugera. Coś trzeba wymyśleć.
A najlepiej odpal lokalnie i przejedź debugerem.

0

Linia 529 to: $parsedXml = $this->convertXmlToExportXml($rCode); - napisałem która linia tworzy problem. Tj fragment API i błąd wyskakuje bardzo rzadko, nie wiadomo kiedy.

0
baracuda napisał(a):

Linia 529 to: $parsedXml = $this->convertXmlToExportXml($rCode); - napisałem która linia tworzy problem. Tj fragment API i błąd wyskakuje bardzo rzadko, nie wiadomo kiedy.

No to masz wchodzi tam jakieś A1 czy inny string z tych ifów i potem masz odwołanie na innym stringu jak w moim przykładzie.
Co robisz w tej funkcji to nikt nie zgadnie bo wstawiłeś kropki convertXmlToExportXml

0

hmmm....
ta metoda nie ma nic dziwnego:

private function convertXmlToExportXml( $rCode)
    {
        $icomponent = null;

        foreach ($xiComponents->iComponent as $icomp) {
            if (
                strtotime($icomp->startDate) <= strtotime($this->cTime) &&
                strtotime($icomp->endDate) >= strtotime($this->cTime)
            ) {
                if (
                    $this->decodeR(
                        (string) $rCode,
                        (string) $icomp->symbol
                    )
                ) {
                    $icomponent = $icomp;
                    break;
                }
            }
        }
        
        ////...... long code, but without $rCode

        $ls33objXml =
            "<Object><objectId>1</objectId><objectExternalIds><externalId><externalSystem>PartenonEHM</externalSystem><IdName>PM</IdName><IdValue></Object>";

        
        }
        return $ls33objXml;
    }

    private function decodeR($csR, $partR) {

        $converter = array(
         'I29-01' => 'PG',
         // .....
        );
        if (isset($converter[$partR]) && (string) $converter[$partR] === (string) $csR) {
            return true;
        } else {
            return false;
        }
        }
0

To ja bym sprawdził czy na serwerze kod jest ten sam który pokazujesz i uruchomił ten kod lokalnie. Bo tak to chyba nikt nie zgadnie.
Jak to jakaś legacy kobyła. To zaloguj sobie do pliku co wchodzi i na czym pracujesz i odtwórz to u siebie z debugerem.

0

Pokaż kod tego /home/www/classs.php, najlepiej cały

1 użytkowników online, w tym zalogowanych: 0, gości: 1