Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Wordpress中传递给PHP会话的Javascript变量_Javascript_Php_Wordpress_Session - Fatal编程技术网

在Wordpress中传递给PHP会话的Javascript变量

在Wordpress中传递给PHP会话的Javascript变量,javascript,php,wordpress,session,Javascript,Php,Wordpress,Session,我不确定这是否是最好的方法,但我有一个按钮,当按下它时调用onClickJS函数,它传递了两个参数。我想在php会话中保存这两个参数,然后加载另一个页面并使用这些值 所以,我知道如果我在第页上使用类似的内容!: <?php session_start(); $message1 = "A message"; $message2 = "Another message"; $_SESSION['routineName'] = $message1;

我不确定这是否是最好的方法,但我有一个按钮,当按下它时调用
onClick
JS函数,它传递了两个参数。我想在php会话中保存这两个参数,然后加载另一个页面并使用这些值

所以,我知道如果我在第页上使用类似的内容!:

    <?php
    session_start();

    $message1 = "A message";
    $message2 = "Another message";

    $_SESSION['routineName'] = $message1;
    $_SESSION['dayName'] = $message2; 
    ?>
我试过这样的方法:

function trackIt(routine, dayName) 
{
    <?php
    session_start();

    $_SESSION['routineName'] = ?> routine; <?php
    $_SESSION['dayName'] = $message2; 
    ?>
}
函数trackIt(例程,dayName)
{
常规;
}
和其他人,但什么都不起作用

这就是我调用onClick(trackIt)函数的方式:

echo('<td colspan="3" style="background-color:#005673; text-align:right; padding: 4px 0px;">
<button class="btnTrack" onClick="trackIt(\'' . $name . '\' , \'' . $nameday1 . '\')" >Track It!</button></td>');
echo('
跟踪它!);
我想做的是将例程和dayName保存到会话中

是否可以将JS变量/参数保存到PHP会话中

PS:我正在使用Wordpress。


谢谢

您放在文件中的PHP代码不是在Javascript运行时执行的,而是在页面发送到客户端之前执行的。因此,您不能从内容中的任何位置访问
$\u会话
,您需要从Wordpress的代码中访问。通常这是通过

您需要将Javascript变量传递给服务器端PHP。正如@Grasshopper所说,最好(或至少是最可维护的方式)是通过AJAX:

// This is your JAVASCRIPT trackit function
function trackIt(routine, day) {
    $.post(
         '/wp-setvar.php',
         {
             routine  : routine,
             day      : day
         }, // You can add as many variables as you want (well, within reason)
         function success(data) {
             // Here we should receive, given the code below, an object
             // such that data.result is a string saying "OK".
             // Just in case you need to get back something from the server PHP.
             // Otherwise just leave this function out.
         }
    );
};
在服务器上,您需要创建一个特定的文件来接受传入的变量(最好是从插件执行此操作,以免在安装之外添加文件:WordFence等安全扫描程序不赞成这种做法)。下面这是一个屠夫的解决方案

<?php /** This is wp-setvar.php */

/** Set up WordPress environment, just in case */
require_once( dirname( __FILE__ ) . '/wp-load.php' );

session_id() || session_start();

nocache_headers();

// DO NOT, FOR ANY REASON, ACCESS DIRECTLY $_SESSION
// ONLY USE A VARIABLE WITHIN $_SESSION (here, "ajjx")
// OTHERWISE THIS MAY ALLOW ANYONE TO TAKE CONTROL OF YOUR INSTALLATION.
$_SESSION['ajjx'] = $_POST;

Header('Content-Type: application/json;charset=utf8');
die(json_encode(array(
    'result' => 'OK', // This in case you want to return something to the caller
))); 
那你就:

  <?php print ajjx('routine', 'none!'); ?><!-- will print routine, or "none!" -->


一个更具杀伤力的解决方案是在
wp config.php
本身中添加上面的函数定义。然后它将在Wordpress中随处可见。如果您有权访问
wp config.php
。另外,先备份wp config,然后使用完整的FTP客户端进行备份;不要使用Wordpress插件编辑它,因为如果
wp config
崩溃,插件也可能崩溃。。。你会发现自己处于一种“我的开罐器被锁在罐头里”的境地


如果你对上面的一些问题感到不舒服,最好什么都不做。或者先在一个可以轻松重新安装的一次性Wordpress安装上进行练习。

这是一个空的Javascript函数(不执行任何操作并返回未定义的
),因为其中的PHP代码不会输出任何内容。AJAX可能是最好的选择。下面是一个jQuery/AJAX示例:但由于您希望将用户带到另一个页面,因此可以使用带有隐藏字段的表单。
<?php

  ...
  $value = '';
  if (array_key_exists('ajjx', $_SESSION)) {
       if (array_key_exists('routine', $_SESSION['ajjx']) {
           $value = $_SESSION['ajjx']['routine'];
       }
  }
  function ajjx($varname, $default = '') {
      if (array_key_exists('ajjx', $_SESSION)) {
           if (array_key_exists($varname, $_SESSION['ajjx']) {
               return $_SESSION['ajjx'][$varname];
           }
      }
      return $default;
  }
  <?php print ajjx('routine', 'none!'); ?><!-- will print routine, or "none!" -->
  <?php print ajjx('routine'); ?><!-- will print nothing if routine isn't defined -->