从外部文件加载时,PHP文件声明中的函数未定义

时间:2017-10-04 02:03:01

标签: javascript php jquery html ajax

我链接到一个名为全局变量和functions.js的JS文件。 我在index.php的主体中包含PHP标签,在内部标签中我定义了一个名为generateformtoken的函数。

当按下按钮时,我在全局变量和functions.js文件中调用一个函数。

全局变量和functions.js中的函数在按下按钮时使用ajax调用加载一个名为login_form.php的文件的数据,特别是在index.php页面加载之后这样功能generateformtoken已加载。

在文件login_form.php中有一些PHP代码调用函数generateformtoken,在php代码之后有我的表单html代码。

我的问题是,login_form.php中调用的函数声称它未定义,即使它是从index.php加载,并且在index.php中定义了函数之后。< / p>

这是我的index.php文件代码,它包含在正文标记之后。

<?php
        session_start();
        echo ("ok so this is def loading...");
        function generateFormToken($form) {
            // generate a token from an unique value
            $token = md5(uniqid(microtime(), true));
            // Write the generated token to the session variable to check it against the hidden field when the form is sent
            $_SESSION[$form.'_token'] = $token;
            return $token;
        }
?>

这是我的全局变量和函数.JS文件。按下按钮时会调用此函数,它会检测到形式尚不存在:

function ajaxCall() {
$.ajax({
url: "php/login_form.php",
success: function (data) { $("body").append(data); },
dataType: 'html'
});
}

以下是我的login_form.php文件,我试图将内容加载到index.php的正文中:

<?php
echo("so php is being loaded via ajax...");
// generate a new token for the $_SESSION superglobal and put them in a hidden field
$newToken = generateFormToken('form1');
?>
<div id="loginContainerBackground">
<div id="loginContainer">       
<form action="php/login_form.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="token" value="<?php echo $newToken; ?>">
<label for="username">Username:</label>
<input type="text" id="username" name="username">
<label for="password">Password:</label>
<input type="password" id="password" name="password">
<div id="lower">
<input type="checkbox" id="checkBoxId"><label for="checkBoxId">Keep me logged in</label>
<input type="submit" value="Login">
</div><!--/ lower-->
<p id="loginFormErrorMessage"></p>
</form>
</div>
</div>

所以我的问题是为什么我在最初定义的函数在我用AJAX调用加载后调用它时不起作用?有解决方案吗?

1 个答案:

答案 0 :(得分:0)

如果我理解你的话,那将是因为php函数不会遍历ajax,所以你不能在索引页面上拥有该函数,并认为ajax页面也会包含该函数。他们需要像个人页面一样对待。要解决此问题,您还需要在login_form.php页面中包含该功能。最简单的方法是将其从index.php页面中删除,创建一个新文件:

<强> /functions/generateFormToken.php

<?php
function generateFormToken($form)
{
    // generate a token from an unique value
    $token = md5(uniqid(microtime(), true));
    // Write the generated token to the session variable to check it against the hidden field when the form is sent
    $_SESSION[$form.'_token'] = $token;
    return $token;
}

然后从session_start();移除index.php,然后创建一个config.php页面,您将在所有顶级php文件中包含该页面:

<强> /config.php

<?php
session_start();
define('DS',DIRECTORY_SEPARATOR);
define('ROOT_DIR',__DIR__);
define('FUNCTIONS',ROOT_DIR.DS.'functions');

最后,当您加载两个页面时,请包含配置页面并包含功能页面。

  

注意: 您应首先在页面上包含配置页面以加载。 html开始输出后无法加载配置。在输出任何内容之前,您的所有非HTML代码都应该位于顶部。

<强>的index.php

<?php
include_once(__DIR__.DIRECTORY_SEPARATOR.'config.php');
include_once(FUNCTIONS.DS.'generateFormToken.php');
// Do other header code here
// When you are done, start writing html to the browser
?>

<强> /php/login_form.php

<?php
$DS = DIRECTORY_SEPARATOR;
include_once(realpath(__DIR__.$DS.'..').$DS.'config.php');
include_once(FUNCTIONS.DS.'generateFormToken.php');
// Do other header code here
// When you are done, start writing html to the browser

$newToken = generateFormToken('form1');
?>
<div id="loginContainerBackground">
    <div id="loginContainer">       
        <form action="php/login_form.php" method="post" enctype="multipart/form-data">
            <input type="hidden" name="token" value="<?php echo $newToken; ?>">
            <label for="username">Username:</label>
            <input type="text" id="username" name="username">
            <label for="password">Password:</label>
            <input type="password" id="password" name="password">
            <div id="lower">
                <input type="checkbox" id="checkBoxId"><label for="checkBoxId">Keep me logged in</label>
                <input type="submit" value="Login">
            </div><!--/ lower-->
            <p id="loginFormErrorMessage"></p>
        </form>
    </div>
</div>