Ptcms在php7.2.10下的采集调试

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

Ptcms在php7.2.10下的采集调试

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() 的构造,原数组指针也没有变,数组单元的值也不受影响。
    foreach 不支持用“@”来禁止错误信息的能力。
*/

  
  /*
  foreach 中使用引用的情况。
 普通情况下,foreach($arr as $value)中的$arr和$value是拷贝,不受外部影响的
 */
$arr = array(0,1,2,3,4,5);
 foreach($arr as $value){
      $arr = array();
      echo $value;
}// 结果是:12345

//    但如果$arr是引用的话,情况则不同了,我们用代码来说明问题
$arr = array(0,1,2,3,4,5);
$arr = &$arr;
 foreach($arr as $value){
     $arr = array();
     echo $value;
 }//    结果是: 0    这是因为循环用的$arr是直接指向原数据的,而不是copy了一份。

//如果$value是引用,其结果是一样的,同样$value是指向原数据的而不是copy
$arr = array(0,1,2,3,4,5);
 foreach($arr as &$value){
     $arr = array();
     echo $value;
 }//    结果是: 0

    还有一种情况比较特殊,即是如果定义了$arr为全局变量的话,$arr也会变成引用

global $arr;
$arr = array(0,1,2,3,4,5);
 foreach($arr as $value){
     $arr = array();
     echo $value;
 }//   结果是: 0

/*
  如果两次循环一个数组,一定不能这样写
foreach($arr as &$value){}
foreach($arr as $value){}
    这会导致第二次的循环的结果不正确(可能是php的bug吧)。可以用以下几种来代替:

//solution 1
foreach($arr as &$value){}
 unset($value);
 foreach($arr as $value){}
 //solution 2
 foreach($arr as &$value){}
 foreach($arr as &$value){}
 //solution 3
 foreach($arr as &$value){}
 $arr2 = $arr;
 foreach($arr2 as $value){}
     3.防止foreach出现未定义情况,尽量这样来写foreach    
foreach((array)$arr as $value) {}
*/
$test=array('a','b','c');
 foreach($test as &$value){
     echo $value;
}
echo $value;
foreach($test as $value){
     echo $value;
}
echo $value;
/*
运行结果:
在第一个foreach中,我们使用了赋值引用符号,它的意思是每次遍历时,$value指向的是$test数组中的对应元素的地址,循环一次时,$value指向的是'a'的地址,第二次循环的时候,$test指向的是第二个元素'b'的地址,第三次循环时,指向的就是'c'的地址。
'a','b','c'
$value变量指向的还是$test的第三个元素即'c'的地址
'c'
'a','b','b'
'b'
解释:
然后foreach本身的操作是把数组中对应的元素赋值给as后面的变量,所以在第二个foreach中,遍历第一次的时候,把数组第一个变量地址上的‘a’赋值给$value指向的地址即['a','b','a'],第二次遍历的时候,把数组第二个变量地址上的'b'赋值给$value指向的地址即['a','b','b'],第三次遍历的时候,把数组第三个变量地址上的'b'赋值给$value指向的地址,还是['a','b','b']。
如果希望还是['a','b','a']:
在使用完赋值引用操作符之后,把变量unset掉。unset($value)语句,相当于取消$value对该地址的引用,这样第二次foreach的时候,$value相当于新的变量。

*/
$test=array('a','b','c');
 foreach($test as &$value){
     //对$value进行操作
}
var_dump($test);
/*
运行一下结果如下:
array(3)
 { [0]=> string(1) "a"
   [1]=> string(1) "b"
   [2]=> &string(1) "c"
  } //元素'c'的前面有个赋值引用符号’&‘
*/

vim /usr/share/wwwphp/ptcms/test.php
经过测试,php7.2可以运行以上测试程序。

public function getolist($zym_38, $zym_27 = 1, $zym_11 = 0)
   { $zym_49 = 'chapterolist_' . $zym_38; $zym_52 = $this->cache->get($zym_49);
  // echo $zym_52;
 print_r($zym_49);
echo"<br/>";

print_r(zym52);printr(zym_52);没有数据, print_r(zym_49); 显示chapterolist_34

public function getchapterlist($zym_38, $zym_42, $zym_27, $zym_11)中
$zym_52 = this&gt;where(this-&gt;where(zym_48)->field(‘id,siteid,name,oid,time’)->page(zym27)&gt;limit(zym_27)-&gt;limit(zym_11)->order($zym_51)->select(); 可以取到数据。

public function getolist($zym_38, $zym_27 = 1, $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();
没有取到数据,尝试修改
$zym_52 = $this->where(array(‘novelid’ => $zym_38))->group(‘oid’)->field(‘oid,name,time,url,id’)->order(‘oid asc’)->select();不行
$zym_52 = $this->where(array(‘novelid’ => $zym_38))->field(‘oid,name,time,url,id’)->order(‘oid asc’)->select(); 可以
Ptcms在php7.2.10下的采集调试
错误都消失,但是
Ptcms在php7.2.10下的采集调试
最好这样

Ptcms在php7.2.10下的采集调试

没有以下脚本

<script type="text/javascript">
    $(function(){$(".g-star").raty({scoreName:"star",score:"20",click:function(v){layer.confirm("您对《圣墟》评分"+v+"分,请确认操作!",{btn:["确定","放弃"]},function(index){$.get("/user/star/add.html",{novelid:"1692",star:v},function(res){if(res.status==1){layer.alert("评分成功",{icon:6})}else{if(res.code==-1){layer.alert(res.info,{icon:5},function(){window.location.href=res.data})}else{layer.alert(res.info,{icon:5})}}},"json");layer.close(index)})}});var length=$(".fulldir .dirlist li").length;if(length>30){var len=Math.ceil(length/3);$(".fulldir .dirlist li:lt(15)").removeClass("hide");$(".fulldir .dirlist li:gt("+(3*(len-5)-1)+")").removeClass("hide");$(".fulldir .dirlist li").eq(14).after('<li class="fulltip">···················· 查看全部'+length+"章节 ····················</li>")}else{$(".fulldir .dirlist li").removeClass("hide")}$(".loading").remove();$(".fulltip").on("click",function(){$(this).remove();$(".fulldir .dirlist li").removeClass("hide")});$(".commentlist a").on("click",function(){var param={id:$(this).parent().data("id")},$num=$(this).find("span"),url;if($(this).hasClass("up")){url="/novelsearch/comment/good.html"}else{if($(this).hasClass("down")){url="/novelsearch/comment/bad.html"}else{return true}}$.post(url,param,function(res){if(res.status==1){layer.alert(res.info,{icon:6},function(i){$num.text(parseInt($num.text())+1);layer.close(i)})}else{layer.alert(res.info,{icon:5})}},"json")})});
    ;(function(){var ua=navigator.userAgent.toLowerCase();if(/ipad/i.test(ua)||/iphone/i.test(ua)||/windows mobile/i.test(ua)||/android/i.test(ua)){var u="1692/";setTimeout(function(){window.location.href="https://m.kuaiyankanshu.net/"+u},300)}})();
</script>

基本采集显示错误解决了;下面就是采集规则的完善以及进一步模仿主站