此行使我的网络主机上的页面崩溃,但在我的本地主机上却没有
This line crashes the page on my web host but not on my localhost
$title = $xpath->query("span[@class='item_list']",$item)[0];
我不明白为什么只有当我在我的虚拟主机上省略这一行时它才有效。 localhost 看起来正常且功能正常。这用于 Wordpress 4.9.4 中的模板。我不知道主机的 PHP 版本是什么。此行位于另一个 xpath 查询的循环内,如果上面的行被删除,该查询将与页面一起使用:
foreach( $xpath->query("//div[@class='product_list']") as $item) { }
我的虚拟主机上的 php 中是否设置了限制,阻止我执行多个查询?或者嵌套查询?
解决了我的问题。当我在脚本上打开错误报告并向我展示这个时,罪魁祸首就出来了:
Fatal error: Cannot use object of type DOMNodeList as array
我参考了这个错误,了解到它是由我最初怀疑的本地主机和虚拟主机之间的不同 PHP 版本引起的。
节点列表不能被视为旧 PHP 版本(< 5.6.3)中的数组。
这里有几种方法可以避免这个问题。
使用->item()
方法
$titleNode = $xpath->query("span[@class='item_list']",$item)->item(0);
在 Xpath 中使用限制
foreach ($xpath->query("span[@class='item_list'][1]",$item) as $titleNode) {
//...
}
这将节点列表中的节点限制为第一个。如果 Xpath 表达式无法匹配某个节点,则 foreach()
可以针对第一个节点执行一次,也可以不执行。这是验证此处是否有要处理的标题节点的一个很好的快捷方式。
直接获取文本内容
$titleString = $xpath->evaluate("string(span[@class='item_list'])",$item);
Xpath 表达式可以 return 结果为标量变量(字符串、数字、布尔值)。这仅适用于 DOMxpath::evaluate()
。 string()
将第一个匹配的节点转换为字符串(return 是它的文本内容)。如果没有匹配的节点,它 return 是一个空字符串。
$title = $xpath->query("span[@class='item_list']",$item)[0];
我不明白为什么只有当我在我的虚拟主机上省略这一行时它才有效。 localhost 看起来正常且功能正常。这用于 Wordpress 4.9.4 中的模板。我不知道主机的 PHP 版本是什么。此行位于另一个 xpath 查询的循环内,如果上面的行被删除,该查询将与页面一起使用:
foreach( $xpath->query("//div[@class='product_list']") as $item) { }
我的虚拟主机上的 php 中是否设置了限制,阻止我执行多个查询?或者嵌套查询?
Fatal error: Cannot use object of type DOMNodeList as array
我参考了这个错误,了解到它是由我最初怀疑的本地主机和虚拟主机之间的不同 PHP 版本引起的。
节点列表不能被视为旧 PHP 版本(< 5.6.3)中的数组。
这里有几种方法可以避免这个问题。
使用->item()
方法
$titleNode = $xpath->query("span[@class='item_list']",$item)->item(0);
在 Xpath 中使用限制
foreach ($xpath->query("span[@class='item_list'][1]",$item) as $titleNode) {
//...
}
这将节点列表中的节点限制为第一个。如果 Xpath 表达式无法匹配某个节点,则 foreach()
可以针对第一个节点执行一次,也可以不执行。这是验证此处是否有要处理的标题节点的一个很好的快捷方式。
直接获取文本内容
$titleString = $xpath->evaluate("string(span[@class='item_list'])",$item);
Xpath 表达式可以 return 结果为标量变量(字符串、数字、布尔值)。这仅适用于 DOMxpath::evaluate()
。 string()
将第一个匹配的节点转换为字符串(return 是它的文本内容)。如果没有匹配的节点,它 return 是一个空字符串。