我的cookie类在获取cookie时保持返回null

时间:2017-06-11 10:13:37

标签: php cookies

我正在创建自己的自定义cookie类,我似乎无法弄清楚我做错了什么。这是我的cookie类:

<?php
class Cookie implements CookieHandlerInterface {
  private $_domain;
  private $_secure;
  public function __construct(array $config = array()) {
    $this->_domain = isset($config['domain']) ? $config['domain'] : 'localhost';
    $this->_secure = isset($config['secure']) ? $config['secure'] : false;
  }
  public function set($name, $value = null, $timeLength) {
    if (!is_null($value)) {
      if (is_array($value)) {
        if ($this->__isMultiArray($array)) {
          return null;
        } else {
          $value = $this->__arrayBuild($value);
          $value = 'array(' . $value . ')';
        }
      } elseif (is_bool($value)) {
        if ($value) {
          $value = 'bool(true)';
        } else {
          $value = 'bool(false)';
        }
      } elseif (is_int($value)) {
        $value = 'int(' . strval($value) . ')';
      } elseif (is_float($value)) {
        $value = 'float(' . strval($value) . ')';
      } elseif (is_string($value)) {
        $value = 'string(' . $value . ')';
      } else {
        return null;
      }
    } else {
      $value = 'null(null)';
    }
    setcookie($name, $value, (time() + $timeLength), '/', $this->_domain, $this->_secure, true);
  }
  public function get($name, $defualtOutput = null) {
    if (isset($_COOKIE[$name])) {
      $output = rtrim($_COOKIE[$name], ')');
      $xr1 = mb_substr($output, 0, 1);
      if (equals($xr1, 'a')) {
        $output = ltrim($output, 'array(');
        return $this->__arrayBreak($output);
      }
      if (equals($xr1, 'b')) {
        $output = ltrim($output, 'bool(');
        if (equals($output, 'true')) {
          return true;
        } else {
          return false;
        }
      }
      if (equals($xr1, 'i')) {
        $output = ltrim($output, 'int(');
        return (int) $output;
      }
      if (equals($xr1, 'f')) {
        $output = ltrim($output, 'float(');
        return (float) $output;
      }
      if (equals($xr1, 's')) {
        $output = ltrim($output, 'string(');
        return $output;
      }
      if (equals($output, 'null(null)')) {
        return null;
      }
    }
    if (
      !is_array($defualtOutput)
      && !is_bool($defualtOutput)
      && !is_int($defualtOutput)
      && !is_float($defualtOutput)
      && !is_string($defualtOutput)
      && !is_null($defualtOutput)
    ) {
      trigger_error(
        'The $defualtOutput var needs to be only certain types of var types. Allowed (array, bool, int, float, string, null).',
        E_USER_ERROR
      );
    }
    return $defualtOutput;
  }
  public function delete($name) {
    if (isset($_COOKIE[$name])) {
        setcookie($name, '', time() - 3600, '/', $this->_domain, $this->_secure, true);
    }
  }
  private function __arrayBuild($array) {
    $out = '';
    foreach ($array as $index => $data) {
      $out .= ($data != '') ? $index . '=' . $data . '|' : '';
    }
    return rtrim($out, '|');
  }
  private function __arrayBreak($cookieString) {
    $array = explode('|', $cookieString);
    foreach ($array as $i => $stuff) {
        $stuff = explode('=', $stuff);
        $array[$stuff[0]] = $stuff[1];
        unset($array[$i]);
    }
    return $array;
  }
  private function __isMultiArray($array) {
    foreach ($array as $key => $value) {
      if (is_array($value)) {
        return true;
      }
    }
    return false;
  }
}
?>

我设置了一个测试Cookie,例如app('cookie')->set('test', 'hello', 0); 果然它创造了像预期的cookie。所以cookie读取string(hello)

当我尝试回应它时,它会回显默认值而不是实际变量,因此app('cookie')->get('test', 'test');会返回test

get函数应检查cookie是否存在isset($_COOKIE[$cookieName])然后它应该修剪额外的rtrim($_COOKIE[$cookieName], ')')然后它应该抓取字符串中的第一个字符mb_substr($_COOKIE[$cookieName], 0, 1) 0从头开始,1只抓住第一个字符。

将它与默认值(a,b,i,f,s)进行比较后,例如,默认情况下,如果它以s字符串开头,如果它是i,则会被发送默认为int等等。

如果它们都是假的,它会检查它是否作为null发送,如果是这样它返回null,否则它返回传递的默认值。

equals函数与$var1 == $var2相同,它是计时攻击安全的。

因此它会一直返回默认值null,任何帮助都会提前感谢。

1 个答案:

答案 0 :(得分:0)

大声笑我觉得真傻我把0作为第三个参数,认为它会告诉cookie在浏览器会话关闭时到期,但它确实(time()+ 0)不等于0.所以它设置为它在创建时过期的cookie。所以我做了time() - (time() * 2)。我实现了我想要的目标。