【问题标题】:PDO Statement does not work anymore in PHP 7PDO 语句在 PHP 7 中不再起作用
【发布时间】:2018-09-30 01:24:58
【问题描述】:

当我从 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 对象 $translator 的形式,这在 PHP 7 及更高版本中不再适用。

感谢您的帮助。

【问题讨论】:

  • 您的错误日志中有任何内容吗?
  • 也许可以试试$translator->{$textTranslated['name']}$translator->{$textTranslated['value']}
  • @qooplmao:嘿,它适用于 {$textTranslated['name']} !为什么现在必须把它放在大括号里?
  • 旧 PHP:$translator->{$textTranslated['name']}。新 PHP:{$translator->$textTranslated}['name']。或者类似的东西

标签: php stdclass


【解决方案1】:

我想提一下,变量变量的使用通常是次优数据存储架构的症状,但也可能存在一些可能获得优势的边缘情况。不过一般情况下,尽量避免使用可变变量。

请阅读统一变量语法

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

您必须将动态属性用大括号括起来。

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

这可以在尝试评估线路时消除潜在的混乱/不一致。再次,请参阅我的链接文档。


我的意思是,您的代码可能打算做一些完全不同的事情,例如:

您希望将数据存储为name 属性(变量属性)中具有键name 的元素。 ...你没有,但我只是说,这个 php7 改进消除了从左到右阅读时的歧义。

为了记录,这里是替代的语法(你不应该在你的任务中使用它):

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

看到区别了吗?


其他参考资料:

【讨论】:

    猜你喜欢
    • 2012-05-05
    • 2017-09-27
    • 2012-11-03
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    • 2023-02-11
    • 1970-01-01
    • 2012-12-01
    相关资源
    最近更新 更多