Ptcms在php7.2.10下的采集调试

在PHP7.2.10环境下,Ptcms在进行小说采集时遇到章节和目录报错。错误发生在novelsearch_chapter.php的第326行,通过测试发现可能与引用操作有关。经过代码调整,解决了Invalid argument supplied for foreach()的警告。错误消失后,继续完善采集规则和模仿主站功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、重新采集后章节和目录报错 2018/10/3

目录报错

Warning: Invalid argument supplied for foreach() in /usr/share/wwwphp/ptcms/application/novelsearch/model/novelsearch_chapter.php on line 326

vim /usr/share/wwwphp/ptcms/application/novelsearch/model/novelsearch_chapter.php


public function getolist($zym_38, $zym_27 = 1, $zym_11 = 0) 
   { $zym_49 = 'chapterolist_' . $zym_38; $zym_52 = $this->cache->get($zym_49); 
     if (APP_DEBUG || !$zym_52) 
	 { $this->setTableId($zym_38); 
       if ($zym_11 == 0) 
	   { $zym_52 = $this->where(array('novelid' => $zym_38, 'oid' => array('>', 0)))->group('oid')->field('oid,name,time,url,id')->order('oid asc')->select(); 
       } else 
	   { $zym_52 = $this->where(array('novelid' => $zym_38, 'oid' => array('>', 0)))->group('oid')->field('oid,name,time,url,id')->order('oid asc')->page($zym_27)->pagesize($zym_11)->select(); 
       } 
	   $zym_13 = $this->get('novelsearch_info', $zym_38, 'novel.pinyin'); 
	   foreach ($zym_52 as &$zym_47) 
	   { $zym_47['url_read'] = U('novelsearch.chapter.read', array('novelid' => $zym_38, 'novelkey' => $zym_13, 'chapterid' => $zym_47['oid'])); 
	   } 
	   $this->cache->set($zym_49, $zym_52, 900); 
	 } 
	 return $zym_52; 
   } 
<?php $a =&$b ?>

这意味着 $a 和 $b 指向了同一个变量。
注: $a 和 $b 在这里是完全相同的,这并不是 $a 指向了 $b 或者相反,而是 $a 和 $b 指向了同一个地方
怀疑问题出在&引用上。

/*
 foreach 结构,这只是一种遍历数组简便方法。
foreach 仅能用于数组,当试图将其用于其它数据类型或者一个未初始化的变量时会产生错误。有两种语法,第二种是第一种的有用的扩展。
foreach(array_expression as $value) statement
foreach(array_expression as $key => $value) statement
    第一种格式遍历给定的 array_expression 数组。每次循环中,当前单元的值被赋给 $value 并且数组内部的指针向前移一步(因此下一次循环中将会得到下一个单元)。
    第二种格式做同样的事,只是除了当前单元的值以外,键值也会在每次循环中被赋给变量 $key。看下面代码:
$arr = array("1"=>"111","2"=>"222","3"=>"333");
foreach($arr as $key=>$value)
{
  echo $key."=>".$value."\n";
}
结果如下:
1=>111
2=>222
3=>333
    键值这里可以理解为数组下标,数组元素a[2]的下标就是2.

    当 foreach 开始执行时,数组内部的指针会自动指向第一个单元。这意味着不需要在 foreach 循环之前调用 reset()。而while循环需要reset。下面两种代码功能完全相同。
1.用while循环
$arr = array("one", "two", "three");
reset ($arr);
while (list(, $value) = each ($arr)) {
echo "Value: $value<br>\n";
}
2.用foreach
foreach ($arr as $value) {
echo "Value: $value<br>\n";
}
    此外注意 foreach 所操作的是指定数组的一个拷贝,而不是该数组本身。因此即使有 each() 的构造,原数组指针也没有变,数组单元的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值