【问题标题】:Undefined variable and offset [duplicate]未定义的变量和偏移量[重复]
【发布时间】:2013-06-05 09:41:23
【问题描述】:

我的错误是:

注意:未定义变量:在第 21 行的 C:\xampp\htdocs\server4.php 中返回

第 21 行是:

   $return .= fgets($this->_socket);

注意:未定义的偏移量:C:\xampp\htdocs\server4.php 第 95 行中的 0

注意:未定义的偏移量:C:\xampp\htdocs\server4.php 第 95 行中的 0

第 95 行是:

$serverInfo = $master->server_getInfo($serverList[0]['ip'], $serverList[0]['port']);

还有我的完整代码:

<?php
class Q3Master
{
    private $_socket;
    private $_port = '20810';
    private $_host;

    public function __construct($masterHost)
    {
            $this->_socket = fsockopen('udp://79.175.173.73',20810);
            stream_set_blocking($this->_socket,0);
    }

    public function master_listServers($timeout = '1')
    {
            fputs($this->_socket,str_repeat(chr(255),4).'getservers 69 empty full demo'."\n");

            $time=time()+$timeout;
            while($time > time() || strpos($return,'EOT') === FALSE)
            {
                    $return .= fgets($this->_socket);
            }
            $return = explode('\\',$return);
            unset($return[0]);
            unset($return[count($return)]);
            $iplist = array();
            foreach($return as $server)
            {
                    for($i = 0;$i < 4;$i++)
                            $addr[] = ord($server[$i]);

                    for($i = 4;$i < 6;$i++)
                            $port .= dechex(ord($server[$i]));
                    $port = hexdec($port);
                    $iplist[] = array('ip' => join('.',$addr),'port' => $port);
                    unset($addr);
                    unset($port);
            }

            return $iplist;
    }

    function server_getInfo($adresse, $port)
    {
            if($port != 0)
            {
                    $cmd = "\xFF\xFF\xFF\xFFgetstatus";
                    $f = fsockopen('udp://'.$adresse, $port);

                    socket_set_timeout ($f, 1);
                    fwrite ($f, $cmd);
                    $data = fread ($f, 10000);
                    fclose ($f);

     if($data)
     {
        $temp = explode("\x0a",$data);

        $list3 = explode("\\",substr($temp[1],1,strlen($temp[1])));
        for ($i = 0;$i <= count($list3);$i = $i + 2) {
           $list[@$list3[$i]] = @$list3[$i + 1];
        }
        array_pop($list);

        $players = array();
        foreach($temp as $id => $player)
        {
           if($id != 0 AND $id != 1)
           {
              $infos = explode(' ', $player, 3);
              $name = explode('"', $infos[2]);
              $players[] = array('score' => $infos[0], 'ping' => $infos[1], 'name' => $name[1]);
           }
        }
        array_pop($players);

        $infos = array();
        $infos = $list;
        $infos['players'] = $players;

        return $infos;
     }
     else
        return FALSE;
            }
            else
                    return FALSE;
    }
}
$master = new Q3Master('79.175.173.73');

$serverList = $master->master_listServers();


$serverInfo = $master->server_getInfo($serverList[0]['ip'], $serverList[0]['port']);

?>

【问题讨论】:

    标签: php


    【解决方案1】:

    添加 var 返回的初始化:

    $return = '';
    

    试试这个:

    public function master_listServers($timeout = '1')
        {
                $return = '';
                fputs($this->_socket,str_repeat(chr(255),4).'getservers 69 empty full demo'."\n");
    
                $time=time()+$timeout;
                while($time > time() || strpos($return,'EOT') === FALSE)
                {
                        $return .= fgets($this->_socket);
                }
                $return = explode('\\',$return);
                unset($return[0]);
                unset($return[count($return)]);
                $iplist = array();
                foreach($return as $server)
                {
                        for($i = 0;$i < 4;$i++)
                                $addr[] = ord($server[$i]);
    
                        for($i = 4;$i < 6;$i++)
                                $port .= dechex(ord($server[$i]));
                        $port = hexdec($port);
                        $iplist[] = array('ip' => join('.',$addr),'port' => $port);
                        unset($addr);
                        unset($port);
                }
    
                return $iplist;
        }
    

    【讨论】:

      【解决方案2】:

      注意:未定义变量:在第 21 行的 C:\xampp\htdocs\server4.php 中返回

      然后定义该变量:$return = null

      注意:未定义的偏移量:C:\xampp\htdocs\server4.php 第 95 行中的 0

      然后要么定义偏移量:$serverList[0] = array('ip' =&gt; null, 'port' =&gt; null),要么在使用前检查偏移量是否定义:

      if (isset($serverList[0])) {
        $serverInfo = $master->server_getInfo($serverList[0]['ip'],
                                              $serverList[0]['port']);
      }
      

      但首先您应该调查为什么您期望在哪里定义 $return$serverList[0]。也许这些变量应该是由代码的不同部分提供的,那是被破坏的。

      【讨论】:

      • 谢谢,但知道有这个问题:Warning: Missing argument 2 for Q3Master::server_getInfo(), called in C:\xampp\htdocs\server4.php on line 97 and defined in C:\xampp\htdocs\server4.php on line 44 Notice: Undefined variable: port in C:\xampp\htdocs\server4.php on line 46
      • “Missing argument 2 for Q3Master::server_getInfo()”的哪一部分你不明白?至于未定义的$port变量:reson与$return相同。
      【解决方案3】:

      你需要在使用之前定义$return,因为如果while循环不会被执行,$return没有被定义,因此不能作为explode()的参数。

      $return = ''; // <-- define it as an empty string
      
      while($time > time() || strpos($return,'EOT') === FALSE)
      {
             $return .= fgets($this->_socket);
      }
      $return = explode('\\',$return);
      

      【讨论】:

        猜你喜欢
        • 2021-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-18
        • 2020-01-22
        • 1970-01-01
        相关资源
        最近更新 更多