I get following error:
PHP message: PHP Fatal error: Uncaught TypeError: Cannot access offset of type string on string
on this line:
if ($uploadZoneData[1]['size'] != 0) {
On php 7.4 i had any troube but with php 8 i have.
What can be the problem?
EDIT: Full code of the related functions:
function uploadSingleFile($zoneImage, $fileMoveTo, $fileAllowedExtensions, $fileAllowedSize, $zoneCustomer, $zone)
{
global $config;
// define file upload settings
$errors = array();
$fileName = $zoneImage['name'];
$fileSize = $zoneImage['size'];
$fileTmp = $zoneImage['tmp_name'];
$fileType = $zoneImage['type'];
$fileExt = strtolower(end(explode('.', $zoneImage['name'])));
$MBtoByte = $fileAllowedSize * 1048576;
$extensions= $fileAllowedExtensions;
// define errors
if (in_array($fileExt, $extensions) === false) {
$errors[] = "Dieser Datei-Typ ist nicht erlaubt";
}
if ($fileSize > $MBtoByte) {
$errors[] = 'Die Datei ist zu gross';
}
// finally try to upload the file
if (empty($errors) == true) {
$temp = explode(".", $zoneImage["name"]);
$newfilename = $zoneCustomer . '-' . strtoupper($zone) . '-' . uniqid() . '.' . end($temp);
move_uploaded_file($fileTmp, $_SERVER["DOCUMENT_ROOT"] . $fileMoveTo . $newfilename);
$status = '1';
} else {
$status = '0';
}
// build array of the different outputs
$uploadStatus = array($status, $newfilename, $errors);
return $uploadStatus;
}
function updateZoneData($zoneFile, $zoneCustomer, $zone, $zoneLink, $maxWidth, $bannerID)
{
global $db;
// get customer values
$getCustomerValues = getColumnValue('customers', "WHERE `customerNr` = '" . $zoneCustomer . "'");
// define redirect url
switch ($zone) {
case "a1":
$redirectZone = "zones.php#zones-overview-a1-overview";
break;
case "a2":
$redirectZone = "zones.php#zones-overview-a2-overview";
break;
case "b1":
$redirectZone = "zones.php#zones-overview-b1-overview";
break;
case "b2":
$redirectZone = "zones.php#zones-overview-b2-overview";
break;
case "b3":
$redirectZone = "zones.php#zones-overview-b3-overview";
break;
case "b4":
$redirectZone = "zones.php#zones-overview-b4-overview";
break;
case "a9":
$redirectZone = "zones.php#zones-overview-a9-overview";
break;
case "a9-1":
$redirectZone = "zones.php#zones-overview-a9-1-overview";
break;
case "a11":
$redirectZone = "zones.php#zones-overview-a11-overview";
break;
default:
$redirectZone = "zones.php";
}
// upload file to the server
$uploadZoneData = uploadSingleFile($zoneFile, '/adserver/banners/', array("jpg", "jpeg", "png", "gif"), '3', $zoneCustomer, $zone);
if ($uploadZoneData[1]['size'] != 0) {
if ($uploadZoneData[0] == '1') {
// create ZIP-Backup (zone-banners) from '/adserver/banners' to '/cp/includes/files/zip-backups'
createZipBackup('/adserver/banners', '/cp/includes/files/zip-backups', 'adserver-banners.zip');
// get zone values & delete old bannerImg from file-system
$getZoneDeleteValues = getColumnValue('zones', "WHERE `customerNr` = '" . $zoneCustomer . "' AND `zone` = '" . $zone . "' AND `id` = '" . $bannerID . "'");
unlink($_SERVER["DOCUMENT_ROOT"] . '/adserver/banners/' . $getZoneDeleteValues['0']['bannerImg']);
// execute action
$updateZoneData = $db->update("zones", [
"customerNr" => $zoneCustomer,
"customer" => $getCustomerValues['0']['customer'],
"zone" => $zone,
"bannerImg" => $uploadZoneData[1],
"bannerLink" => $zoneLink,
"maxWidth" => $maxWidth,
"changeDate" => date("Y-m-d H:i:s")
], [
"id" => $bannerID
]);
redirectTo($redirectZone, 1, "« " . strtoupper($zone) . "-Banner (" . $getCustomerValues['0']['customer'] . " [K. N°: " . $zoneCustomer . "]) » wurde erfolgreich aktualisiert.", 'ZONES');
} else {
// collect and save errors (file-upload)
$collectedErrors = array_flatten($uploadZoneData[2]);
setcookie("collectedErrors", '1', time() + (1 * 5), "/"); // expire in 5 seconds
$_SESSION["collectedErrors"] = $collectedErrors;
redirectTo($redirectZone, 0, "« " . strtoupper($zone) . "-Banner (" . $getCustomerValues['0']['customer'] . " [K. N°: " . $zoneCustomer . "]) » konnte nicht aktualisiert werden.", 'ZONES');
}
} else {
// execute action
$updateZoneData = $db->update("zones", [
"customerNr" => $zoneCustomer,
"customer" => $getCustomerValues['0']['customer'],
"zone" => $zone,
"bannerLink" => $zoneLink,
"maxWidth" => $maxWidth,
"changeDate" => date("Y-m-d H:i:s")
], [
"id" => $bannerID
]);
redirectTo($redirectZone, 1, "« " . strtoupper($zone) . "-Banner (" . $getCustomerValues['0']['customer'] . " [K. N°: " . $zoneCustomer . "]) » wurde erfolgreich aktualisiert.", 'ZONES');
}
}
5
Answers
Thanks for your answers the solution to my problem is.
Replace this
with the following:
You should have to upgrade your php. This will help you. Because many codes doesn’t work on old versions. SO upgrade PHP it will help.
else share your full code. we will try to resolve your error as soon as possible.
First of all, welcome to Stack Overflow!
This error means that you are trying to access the index [1][‘size’] of the string, which is not valid. Be sure to check that
uploadSingleFile(...)
is returning you an array and not a string.I checked your code and I saw that the returned array of uploadSingleFile have these three items:
$newfilename
is not an array. It is a string, as you defined here:I’m not a techie, so I find myself on StackOverflow quite often looking for answers. I had this problem and came here in search of an answer. I had already defined the array ($CA = []; in my case), but it was failing on levels deeper than 1 into the array. At its deepest, my array would look like this:
The simplest way I can find to put this answer is that EVERY level of the array must be defined, so I ended up with this for each loop through my dataset: (Note: If $row[x] is not null, all $row[any number less than x] won’t be null.)
PHP no longer automatically creates the array depth you need; you must set it explicitly to avoid the error. Hope this makes it clearer for other non-techies on this page. I’m interested in any better ways to do it (I like to keep my code concise!)
you can use
that is an usual PHP 8 error