我最近为我的网站迁移了主机,该网站附带了较新版本的 php。自从迁移以来,我一直收到错误
Warning: Trying to access array offset on value of type bool in /xxx/edit-post.php on line 150
,该错误与出现在博客文章类别选择字段的每个复选框之间的 if($row3['catID'] == $row2['catID']){
相关。它似乎不会妨碍为博客文章选择类别的功能。
<legend>Categories</legend>
<?php
$stmt2 = $db->query('SELECT catID, catTitle FROM blog_cats ORDER BY catTitle');
while($row2 = $stmt2->fetch()){
$stmt3 = $db->prepare('SELECT catID FROM blog_post_cats WHERE catID = :catID AND postID = :postID') ;
$stmt3->execute(array(':catID' => $row2['catID'], ':postID' => $row['postID']));
$row3 = $stmt3->fetch();
if($row3['catID'] == $row2['catID']){
$checked = 'checked=checked';
} else {
$checked = null;
}
echo "<input type='checkbox' name='catID[]' value='".$row2['catID']."' $checked> ".$row2['catTitle']."<br />";
}
?>
以上是编辑帖子页面的相关代码部分。我尝试了几种解决方案,但我真的不明白我在做什么,博客本身是一个非常简单的安装(甚至比 phpbb 更简单),所以在我迁移之前,我从来不需要处理除了 html、css 和 js 之外的事情。我该如何解决此错误?
看起来
$row2
或 $row3
正在通过其他框架中的某种机制转换为布尔值(true 或 false)。我建议在整个框架中搜索 $row2
或 $row3
的每个实例或使用,以找出具体发生的情况。如果这是由于 PHP 版本的更新或更改造成的,那么可以合理地假设其他可能更重要的东西也可能被破坏。
如果您可以确认这是一个单独的、无关紧要的问题(有时
$row2
将是一个预期的数组,有时是一个布尔值,在其他地方没有任何影响),这样的事情应该可以工作:
更换
if($row3['catID'] == $row2['catID']){
与
if( is_array( $row3 ) && isset( $row3['catID'] && is_array( $row2 ) && isset( $row2['catID'] && $row3['catID'] == $row2['catID']){
这基本上是检查每个变量是否实际上是一个数组,然后在比较之前检查每个特定的数组键是否存在。
还有其他一些方法可以做同样的事情,例如简单地检查
$row3['catID']
是否已使用 isset
声明,等等
再次请记住,这是一个廉价的修复方法。您应该通过检查使用并当然声明
$row2
和 $row3
的每一行代码来确切地发现发生这种情况的原因,以确保导致此问题的原因不会或不会导致可能不会触发的危险警告。