Использование переменной $ _COOKIE для хранения важных данных - PullRequest
0 голосов
/ 15 июля 2011

Я создаю плагин для 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.

Я не удивлюсь, если есть какой-то лучший способ или лучший вариант, чтобы сделать это, но с моим ограниченным пониманием php я не могу придумать ни одного.

UPDATE: О сессиях: мне не нужно, чтобы значения сохранялись на нескольких страницах, только одна загрузка страницы. Поскольку Wordpress не использует сессии, я не вижу причин для его изменения.

Я немного поэкспериментировал, и проблема остается:

Весь следующий код находится в основном файле моего плагина Wordpress. Насколько я понимаю, файл плагина «включается» при каждом запросе, поэтому весь код запускается каждый раз, когда я обновляю свой тестовый пост.

Сначала я создаю переменную:

 $myplugin_connected = false;

Затем я подключаю свою функцию в нужном месте:

add_shortcode( 'myplugin_notconnected', 'myplugin_notconnected_func' );

Это в основном перехватывает функцию myplugin_notconnected_func() в шорткоде [myplugin_notconnected]. (A шорткод - это текст в сообщении WordPress, с некоторым идентификатором в скобках []. 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. Я прошу прощения за отсутствие последовательности, я учусь на ходу, и я определенно ценю помощь!

Ответы [ 3 ]

3 голосов
/ 15 июля 2011
Display_if_facebook_connected() { 
   $result = Check_facebook_connected();
   if (!$result) { return 'No, unconnected!' } else { return 'Yes, connected!' } 
} 


$connected = Display_if_facebook_connected();
1 голос
/ 17 июля 2011

Область

Обращаясь к обновленной части вашего вопроса:

Определение

$myplugin_connected = false;

и получение NULL в качестве результата на последующем

var_export($myplugin_connected, true)

может означать, что вы либо определили $myplugin_connected вне глобальной области действия (например, в функции вместо основной), либо вы определили в глобальной области действия, но у вас есть некоторые 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;
}

Но это всегда в глазах смотрящего ^^

1 голос
/ 15 июля 2011
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
    ...
}
...