Оператор PDO больше не работает в PHP 7 - PullRequest
0 голосов
/ 30 сентября 2018

Когда я переключаюсь с PHP 5.6 на 7.0 или 7.2., Этот оператор больше не работает:

$translator = new stdClass();

$sql = "SELECT name, value FROM ".$tab_translator." WHERE lang_id=:lang_id";
try {
    $fetchTextTranslated = $conn->prepare($sql);
    $fetchTextTranslated->bindValue(':lang_id', (int) trim($translator_lang_id), PDO::PARAM_INT);
    $fetchTextTranslated->execute();
    }
catch(PDOException $e) {
if ($config->debug==1) { echo 'Error: ' . $e->getMessage(); }}

while ($textTranslated = $fetchTextTranslated->fetch(PDO::FETCH_ASSOC)) {
   $translator->$textTranslated['name']=$textTranslated['value'];
}

Когда я повторяю $textTranslated['name'] или $textTranslated['value'], я получаю данные из таблицы.Но я хочу, чтобы извлеченные данные были в виде stdClass object $ translation, и это больше не работает в PHP 7 и выше.

Буду признателен за вашу помощь.

1 Ответ

0 голосов
/ 30 сентября 2018

Я просто хотел бы упомянуть, что использование переменных переменных, как правило, является признаком неоптимальной архитектуры хранения данных, но могут быть и некоторые незначительные случаи, когда может быть получено преимущество.Однако, как правило, старайтесь по возможности избегать переменных переменных.

Пожалуйста, прочитайте о Унифицированный синтаксис переменных .

https://www.oreilly.com/ideas/upgrading-to-php7#uniform_variable_syntax

Вы должны обернуть свою динамическую переменнуюсвойство в фигурных скобках.

$translator->{$textTranslated['name']} = $textTranslated['value'];
//           ^-----------------------^

Это устраняет потенциальную путаницу / несогласованность при попытке оценить линию.Опять же, смотрите мой связанный документ.


Я имею в виду, что ваш код может делать что-то совершенно другое, например:

Вы хотите сохранить данные как элемент с ключом nameв свойстве $translator->$textTranslated (свойство переменной).... нет, но я просто говорю, что это улучшение php7 устраняет двусмысленность при чтении слева направо.

Для записи, вот синтаксис альтернативы (который вы не должны 'т для вашей задачи):

 ($translator->$textTranslated)['name'] = $textTranslated['value'];

Видите разницу?


Дополнительные ссылки:

...