【问题标题】:Using the $_COOKIE var to keep important data使用 $_COOKIE 变量保存重要数据
【发布时间】:2011-07-17 19:27:06
【问题描述】:

我正在创建一个 wordpress 插件。我正在编写的所有功能都“挂钩”到某些 wordpress 事件中。这意味着我很难创建需要在多个函数中使用的变量。

例如:

有两个函数挂在某个地方:

Display_if_facebook_connected() { 
   if (Check_facebook_connected()) { return 'Yes, connected!' } 
   return ''; 
} 

Display_if_facebook_connected() { 
   if (!Check_facebook_connected()) { return 'No, not connected!' } 
   return ''; 
} 

它们都运行一个非常繁重的功能:

Check_facebook_connected() { // some heavy facebook connect stuff, return bool } 

我基本上是在尝试避免让繁重的函数运行两次,因为它会产生相同的结果。

在这种情况下,执行$_COOKIE['check_facebook_connected'] = true; 然后在Display_if_facebook_connected() 中读取该变量是否安全?

安全是指用户无法查看或更改该值。由于 cookie 从未真正设置过,我认为/希望它只是在 php 代码的末尾消失。

如果有更好的方法或更好的 var 来做到这一点,我不会感到惊讶,但由于我对 php 的了解有限,我想不出任何办法。

更新: 关于会话:我不需要将值保留在多个页面上,只需加载一页。由于 Wordpress 不使用会话,我认为没有理由更改它。

我尝试了一下,问题依旧:

以下所有代码都在我的 wordpress 插件的主文件中。根据我的理解,插件文件在每次请求时都“包含”,因此每次刷新测试帖子时都会运行所有代码。

首先我创建变量:

 $myplugin_connected = false;

然后我把我的函数挂在正确的地方:

add_shortcode( 'myplugin_notconnected', 'myplugin_notconnected_func' );

这基本上将myplugin_notconnected_func() 函数挂钩到 [myplugin_notconnected] 短代码中。 shortcode 是 wordpress 帖子中的文本,在 [ ] 括号之间有一些 id。Wordpress 会在出现时加载与短代码相关联的代码。)

这是myplugin_notconnected_func()

function myplugin_notconnected_func( $atts, $content = null ) {
    echo '<p>connected: ' . var_export($myplugin_connected, true)  . '</p>';
    return '$contents';
}    

结果如下:

已连接:NULL

这就是我尝试使用 $_COOKIE 变量的原因,因为至少它们在整个 php 实例中都存在。对于缺乏连贯性,我深表歉意,我正在边学习边学习,非常感谢您的帮助!

【问题讨论】:

  • 在这种情况下会话变量会不会更好?我不熟悉 WP 插件 - 但是没有记录的方法来保存插件数据吗?
  • 会话由浏览器关闭而不是 cookie 结束,所以我想你需要一个会话变量来存储你的数据。
  • @joon:我想如果你能澄清你希望连接状态持续多长时间会有所帮助。
  • WP 不使用会话,在开始在 WP 上安装会话之前,我一直在探索其他可能性。

标签: php cookies wordpress


【解决方案1】:
Display_if_facebook_connected() { 
   $result = Check_facebook_connected();
   if (!$result) { return 'No, unconnected!' } else { return 'Yes, connected!' } 
} 


$connected = Display_if_facebook_connected();

【讨论】:

  • 嗯,这看起来是我的答案,但我仍然不明白为什么 OP 有问题。
  • 他没有问题,但他正在调用 Check_facebook_connected(); (重功能)两次而不是一次
  • @genesis:我不确定,如果 OP 真的想要不同的返回值(就像你的解决方案那样)。我认为 OP 想在同一个脚本中多次调用 Display_if_facebook_connected,但希望重的 Check_facebook_connected() 函数只能同时执行一次
  • 是的,这正是我的脚本所做的......哦,等等,我会编辑它
  • 我不得不 -1 这个。你只需要 if... else 并且只有两个回报。现在你有if A then return val1, if not A then return val2, if neither A nor not A then return val3
【解决方案2】:

范围

参考您问题的更新部分:

定义

$myplugin_connected = false;

并获得NULL 作为后续结果

var_export($myplugin_connected, true)

可能意味着,您要么在全局范围之外定义了$myplugin_connected(例如,在函数中而不是 main 中),或者您在全局范围内定义,但一些unset($myplugin_connected)var_export 之前的某处。在这两种情况下,var_export 的返回值都是NULL

在你的情况下,我相信前者更有可能。你可以使用:

$GLOBALS['myplugin_connected'] = false;

var_export($GLOBALS['myplugin_connected'], true)

在您的短代码处理程序中提供连接状态(之前已经由您的“重”函数确定一次)。

Cookie

回答你的起源问题:

在这种情况下,这样做是否安全 $_COOKIE['check_facebook_connected'] = true;然后阅读 Display_if_facebook_connected() 中的变量?

嗯,$_COOKIE 是一个服务器端的superglobal,所以是的,只要您从未在响应中实际发送/设置该 cookie,用户就不会看到,也无法更改它。

就我个人而言,使用$_COOKIE 来保存仅对单页加载有效的状态,这对我来说是完全错误的。

我建议至少使用 $GLOBALS 而不是 $_COOKIE - 或者在这种情况下甚至更好地使用 static 变量而不是超全局变量 - 例如像这样:

function isConnected() {
    static $bConnected = null;
    if ($bConnected === null)
        $bConnected = Check_facebook_connected();
    return $bConnected;
}

但这总是在旁观者的眼中^^

【讨论】:

  • 我不知道 $GLOBALS 可以做到这一点,谢谢。可能 wordpress 在自己的范围内运行插件以避免名称冲突......
【解决方案3】:
session_start();
Check_facebook_connected()
{
    if(isset($_SESSION["is_facebook_connected"])) return ($_SESSION["is_facebook_connected"] === true);
    // if we get here we haven't checked the facebook connection status, so do it
    ...
}

【讨论】:

  • Wordpress 不使用会话...我不确定是否值得仅使用一个变量。
猜你喜欢
  • 2019-02-14
  • 2023-04-01
  • 2016-06-06
  • 1970-01-01
  • 1970-01-01
  • 2017-08-16
  • 2014-07-03
  • 2018-12-07
  • 2018-03-07
相关资源
最近更新 更多