У меня есть два веб-сайта, один из которых работает на PHP 7.0, а другой - на PHP 7.1, у меня есть возможность хранить продукт в корзине на обоих, это все еще работает, но у продукта также есть параметры (например, цвет, размер и т. д.).
Это также должно быть показано в корзине покупок, иначе люди добавляют один и тот же товар дважды с разными вариантами, но люди видят один и тот же товар дважды и не могут различить их.
Я уже написал этот код, и на PHP 7.0 он работает, но на 7.1 параметры пусты, почему это могло быть?
Это мой код:
<?php
$n = 0;
$o = 0;
// Loop array inside select element where product options are selected
foreach($varpijp as $productvar) {
// Filter anything empty
if (!empty($productvar)) {
$productvar['artikelid'] = $artikel['content_id'];
$productvar['prodoptie'] = $o . $artikel['content_id'];
// Empty options every loop
$productopties = '';
$productarray = '';
// Loop options and make key useable with $key and value with $prodvalue
foreach($productvar as $key => $prodvalue) {
if ($key == 'Prijs') {
$key = str_replace('Prijs', '', $key);
} elseif ($key == 'prodoptie') {
$key = '';
$prodvalue = '';
} elseif ($key == 'artikelid') {
$key = '';
$prodvalue = '';
} else {
$key = $key . ': ';
}
// Put results in variable $productopties
$productopties.= $key . '' . $prodvalue . ' ';
}
foreach($productvar as $key1 => $prodvalue1) {
if ($key1 == 'Prijs') {
$key1 = str_replace('Prijs', '', $key1);
} else {
$key1 = $key1 . ': ';
}
if ($key1 !== 'Prijs') {
$productarray[] = $key1 . $prodvalue1;
$serializedarray = json_encode($productarray);
}
}
// Loop all option tags
$productvars.= "<option value='" . $productvar['prodoptie'] . "' data-array='" . $serializedarray . "' data-optie='" . $o . "' data-src='" . $prijscalc . "'>" . $productopties . "</option>";
}
$n++;
$o++;
}
echo $productvars;
Как я уже сказал, он отлично работает на 7.0, но когда я помещаю отчет об ошибках, чтобы показать все на моем сайте 7.1, я получаю сообщение об ошибке в этой строке:
$productarray[] = $key1 . $prodvalue1;
Создание такого массива, по-видимому, больше не работает, поэтому попробовал это так:
$productarray = array();
$productarray[] = $key1 . $prodvalue1;
Ошибка исчезла, но теперь мои параметры всегда пусты, и я не знаю почему.
Что я могу сделать, чтобы это исправить?
$productvars .= "<option value='".$productvar['prodoptie']."' data-array='".$serializedarray."' data-optie='".$o."' data-src='".$prijscalc."'>".$productopties."</option>";
В приведенном выше коде $serializedarray - это то, что мне нужно.
На рабочем сайте это выглядит например так:
["\u20ac 124,95 - ","Aantal kratten: 1","artikelid: 40","prodoptie: 040"]
Но на сайте 7.1 продукт, который также имеет несколько вариантов, показывает мне только это:
["prodoptie: 0315"]
Это ошибка, которую я получаю:
Fatal error: Uncaught Error: [] operator not supported for strings in /home/website/public_html/product-page.php:256
Когда я использую тот же код, что и 7.0
Просматривали ли вы журнал ошибок PHP, если нет, пожалуйста, и разместите полное сообщение об ошибке здесь, в своем вопросе
@RiggsFolly Я добавил ошибку внизу своего вопроса.
Ошибка возникает из-за того, что ваша переменная $productarray является строковым типом. $productarray = '';, вы должны отредактировать это как $productarray = [];
Вы определяете $productarray = ''; как строку, поэтому вы не можете использовать ее как массив позже. В PHP 7.1 это обернулось фатальной ошибкой. В PHP 7.0 (и ранее) PHP автоматически преобразовывал переменную в массив.
$productarray = ''; Вы определили / инициализировали переменную как STRING, а затем пытаетесь использовать ее как массив
Я также рекомендовал бы вам определять переменные, которые вы используете после цикла до цикла. В противном случае ваш код выдаст несколько «неопределенных переменных», если в цикл не вошли, или если оператор if в цикле не оценивается как истина.






$productarray; должен быть массивом, но определяется как строка: $productarray = '';.
Заменить это объявление на $productarray = array();
Для получения дополнительной информации об изменениях с php 7.0 на 7.1 см. официальная документация
String modification by character on an empty string now works like for non-empty strings, i.e. writing to an out of range offset pads the string with spaces, where non-integer types are converted to integer, and only the first character of the assigned string is used. Formerly, empty strings where silently treated like an empty array.
Спасибо. Сайт снова работает отлично.
Какую именно ошибку вы получаете?