我链接到一个名为全局变量和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调用加载后调用它时不起作用?有解决方案吗?
答案 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>