PHP 7.0下PDO FETCH_ASSOC赋值对象属性无输出问题求助
PHP 5.6 → 7.0 迁移:动态属性赋值无输出问题解决
首先看你给出的代码,一眼就能发现核心问题——你的while循环被错误地放在了catch代码块里面!这就导致只有当PDO执行SQL抛出异常的时候,才会执行给$translator赋值的逻辑。但你说查询结果能正确获取,说明SQL执行没有触发异常,那这段赋值代码根本就没跑过,$translator自然就没有customers_customer_data_field_email这个属性,echo的时候当然没输出。
那为什么PHP 5.6下能正常运行?大概率是你在5.6环境里的代码结构是对的(比如while循环在try块里),升级到7.0时不小心搞乱了代码缩进/括号结构;或者PHP 5.6的错误处理机制更宽松,某些隐性错误没触发,让代码“意外”执行了赋值逻辑。
修复步骤
把while循环移到try块内部,放在execute()之后,这样SQL执行成功后就会立即处理结果集:
$sql = "SELECT name, value FROM ".$tab_translator." WHERE lang_id=:lang_id"; try { $fetchTextTranslated = $conn->prepare($sql); $fetchTextTranslated->bindValue(':lang_id', (int) $translator_lang_id, PDO::PARAM_INT); $fetchTextTranslated->execute(); // 把赋值逻辑移到这里,SQL执行成功后立即处理结果 while ($textTranslated = $fetchTextTranslated->fetch(PDO::FETCH_ASSOC)) { $translator->$textTranslated['name'] = $textTranslated['value']; } } catch(PDOException $e) { if ($config->debug == 1) { echo 'Error: ' . $e->getMessage(); $fetchTextTranslated->debugDumpParams(); } }
额外建议
- 检查PDO的错误模式:确保你的PDO连接设置了
PDO::ERRMODE_EXCEPTION,这样SQL执行出错时才会抛出异常,方便调试。 - 可以在赋值后加个调试语句,比如
var_dump($translator),确认属性是否被正确赋值。
内容的提问来源于stack exchange,提问作者belvie
相关产品推荐
相关产品推荐

