使用瞬变存储表单通知

时间:2018-06-15 作者:Marcelo

我正在考虑使用瞬态来存储表单消息,以便在提交表单并重新加载页面后显示。

我的问题是:如果两个或多个用户在不同的会话中使用相同的表单,我如何才能将正确的临时消息发送给正确的用户?

3 个回复
最合适的回答,由SO网友:Pabamato 整理而成

我将使用用户ID然后使用用户IP如果未登录,您可以按如下方式存储结果:

/*
your form validation/submission logiccode goes here
*/

$max_execution_tim = @ini_get(\'max_execution_time\'); 
$submission_result = array(\'message\' => \'Worked!\', \'status\' => \'success\');

// You can use this function:
// https://stackoverflow.com/a/6718472/1321398
$user_ip = GetIP();
$transient_name = is_user_logged_in() ? "form_submission_user-" .         
get_current_user_id() : "form_submission_anonimous-" . $user_ip ;
// save it for a minute
set_transient( $transient_name, $submission_result, 1 * MINUTE_IN_SECONDS );
然后,您可以在输出表单之前进行检查:

$user_ip = GetIP();
$transient_name = is_user_logged_in() ? "form_submission_user-" . 
get_current_user_id() : "form_submission_anonimous-" . $user_ip ;
if( $submission_result = get_transient( $transient_name ) ){
    //show your message
    echo $submission_result[\'message\'];
    // delete it to avoid duplicated messages
    delete_transient( $transient_name );
}

SO网友:Ishan Sharma

一种快速的方法是将用户IP地址的哈希添加到密钥中。基本上,如果您将transient保存为\'user-response\', 现在将其另存为\'user-response\' . md5(<user\'s IP address>).

如果您正在收集敏感数据,我建议将响应作为cookie存储在访问者的浏览器中,然后从cookie本身重新加载时显示。但这并不需要短暂的时间。

SO网友:kierzniak

瞬态是为了存储所有非特定用户的缓存而发明的。您正在尝试模拟刚刚为此类内容创建的会话的操作。为什么要发明自己的解决方案而不使用现有的解决方案?

“WordPress无法与$\\u会话配合使用。”

你有任何案例研究来支持你的观点吗?我在项目中多次使用会话,没有遇到任何问题。在WordPress中,甚至有一个只为处理会话而创建的插件。https://github.com/ericmann/wp-session-manager

仅限wordpress。com不支持该会话,因为它使用自己的解决方案。直到你使用wordpress。com,您可以毫无问题地使用会话。

回到你的问题上来。您正在查找Flash消息。Flash消息是存储在会话中的消息,在检索后立即删除。您可以在GitHub上找到一些实现:https://github.com/plasticbrain/PhpFlashMessages

<?php 

// Start a Session
// Read about managing session with WordPress

// Instantiate the class
$fm = new \\Plasticbrain\\FlashMessages\\FlashMessages();

// Process form e.g. send an email and add success message
$msg->success(\'Thank you for sending message!\');

// Display message
if( $fm->hasMessages(\'success\') ) {

    /**
     * This line will display success message and also remove it
     * from session. After refresh $fm->hasMessages(\'success\')
     * will return false
     */ 
    $fm->display(\'success\'); 
}

结束