【问题标题】:cURL doesn't seem to work in a while loopcURL 似乎在 while 循环中不起作用
【发布时间】:2010-07-21 18:42:31
【问题描述】:

我会发布整个内容,否则会有点混乱:

<?php
echo "<html>
 <head>
  <title>ARMORY.</title>
  <meta http-equiv='Content-Type' content='text/html' charset=iso-8859-1>
 </head>
 <body>
 <table width='50%' border='1' cellpadding='10' cellspacing='10'>";


$server = "Sunstrider";
$guild = "Mist";
$url='http://eu.wowarmory.com/guild-info.xml?r='.$server.'&gn='.$guild.'&p=1';
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt ($ch, CURLOPT_USERAGENT,  "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1");
$xml = curl_exec($ch);
$rosterxml = new SimpleXMLElement($xml);
curl_close($ch);
$array = array();



foreach($rosterxml->guildInfo->guild->members->character as $char)
  if(strtolower($char['level']) === '80')
  {
        $array[] = $char['name']."<br />";

  }

  echo "
   <tr>
    <td valign='middle'>Name</td>
    <td valign='middle'>TEST</td>
   </tr>";  
$i = 0;
while($array[$i] != null) 
{

 $name = $array[$i];
 $raidurl='http://eu.wowarmory.com/character-achievements.xml?r='.$server.'&cn='.$name.'&c=168';
 $ch = curl_init();
 curl_setopt ($ch, CURLOPT_URL, $raidurl);
 curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
 curl_setopt ($ch, CURLOPT_USERAGENT,  "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1");
 $xml2 = curl_exec($ch);
 $achievementxml = new SimpleXMLElement($xml2);
 curl_close($ch);
 var_dump($achievement);

 echo "<tr>
  <td>$array[$i]</td>
  <td></td>
  </tr>";
 $i++;



}

?>

 </body>
</html>

$achievement 的 var_dump 只是一遍又一遍地产生 NULL(显然是由于循环),而不是关于数组的任何信息。但是,执行 $rosterxml 的 var_dump 会产生预期的效果,因此 cURL 在 while 循环之外似乎可以正常工作。

【问题讨论】:

  • 您是否在循环内测试过它试图访问的 URL?
  • 查看如何处理 curl 错误:fr.php.net/manual/en/function.curl-error.php
  • 我还是更喜欢libxml_set_streams_context() anti-user-agent-sniffing 解决方案 :)
  • @Wrikken,你可能是对的!
  • 您不需要为每次循环迭代不断地实例化一个新的 curl。与 useragent/returntransfer 选项一起在循环外执行此操作,只需更改循环内的 URL。 Curl 对象可以重复用于多个请求。同样,永远不要假设 curl exec 像你一样成功。始终检查它是否返回 FALSE(即:失败)

标签: php xml curl


【解决方案1】:

那是因为你的变量被称为$achievementxml 而不是$achievement

我建议你使用error_reporting=E_ALL 编码,这样你就可以捕捉到这样的错误。未定义的变量将导致E_NOTICE 级别的错误消息。

【讨论】:

  • +1,开发时甚至可以使用E_ALL | E_STRICT 以获得最大的详细程度。
  • 啊哈,看来我是个白痴。谢谢,也谢谢你的建议。你可能会说我对 PHP 很陌生,而且我可能不会通过让我的代码完全没有 cmets 来解决问题,但是你有它!
  • 或者快捷方式:-1(这将设置所有位),所以将来甚至可能会想到操作 E_* 常量,直到我们得到一个 E_REALLY_ALL
猜你喜欢
  • 2011-07-23
  • 2014-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-31
  • 2013-12-03
  • 1970-01-01
相关资源
最近更新 更多