2

所以我有一个有趣的问题

我在使用 jquery .load() 函数时遇到问题。我有一个文件结构如下

index.php  
|  
|---header.html  
|---body.html  
|---footer.html

index.php 设置三个变量$variable_one = new Database('passedQuery');

然后将 header.html、body.html 和 footer.html 包含在 index.php 中

在 body.html 我有类似的东西

<div class="span4 well">
        <h3>Current Statistics</h3>
        <hr>
        <table class="table table-striped">
            <thead>
                <tr>
                    <th>Users</th>
                    <th>Event One</th>
                    <th>Event Two</th>
                    <th>Event Three</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td><?php echo $var1->result[0][0]; ?></td>
                    <td><?php echo $var2->result[0][0]; ?></td>
                    <td><?php echo $var3->result[0][0]; ?></td>
                </tr>
            </tbody>
        </table>
    </div>

我在 body.html 中还有一个表单,它是通过通用 jquery 函数提交的

 $(document).ready(function(){
    $('.btn').bind('click', function(e){
        e.preventDefault();
        var form = $(this).parents('form');
        var vals = $(form).serialize();
        var form_id = $(form).attr('id');
        $.ajax({
            url: $(form).attr('action'),
            type: $(form).attr('method'),
            data: vals,
            dataType: 'json',
            success: function(data){
                console.log("Success");
                $('#information').html('<div class="alert alert-success">Great Success! :)</div>');
                setTimeout(function() {
                    $('#content').load('views/partials/body.html');
                }, 5000);
            },
            error: function(a, b, c){
                console.log("Error");
                $('#information').html('<div class="alert alert-error">Epic Failure</div>');
                setTimeout(function() {
                    $('#content').load('views/partials/body.html');
                }, 5000);
            }
        });
    });
 });

当我提交表单并重新加载正文时,在 html 中回显的 PHP 变量现在消失了,我收到类似于以下内容的 apache 错误

[dateTime] [error] [client IP] PHP Notice:  Undefined variable: variable in /path/to/body.html on line 133, referer: myReferrer

我问了我的几个朋友,他们都被难住了,Freenode 的#jquery 也是如此。有人有想法么?

更新 - 表格代码和 index.php 代码 表格

<div class="span4 well">
        <form class="form-horizontal" id="admin_add" name="admin_add" method="post" action="routes/to/add_admin.php">
            <fieldset>
                <legend>Add Administrator</legend>
                <div class="control-group">
                    <label class="control-label" for="select03">Select a user</label>
                    <div class="controls">
                        <select id="select03" name="user">
                            <?php
                                foreach($var1->result as $key => $value)
                                    echo "<option>".$value[0]."</option>";
                            ?>
                        </select>
                    </div>
                </div>
                <div class="form-actions">
                    <button type="submit" class="btn btn-primary form-submit-button">Submit</button>
                </div>
            </fieldset>
        </form>
    </div>

指数

$var2 = new Database('query', 'SELECT COUNT(uid) FROM attendees WHERE eid = 1');
$var3 = new Database('query', 'SELECT COUNT(uid) FROM attendees WHERE eid = 2');

/**
 * List users to add to database
 */
$var1 = new Database('query', 'SELECT name FROM users WHERE admin=0');

/**
 * Include all the visuals
 */
include('views/partials/header.html');
require_once('views/partials/body.html');
include('views/partials/footer.html');
4

2 回答 2

3

当您第一次加载 body.html 时,我猜您正在使用 php 的include()函数加载它。好吧,它的作用是“连接” php,因此在服务器端它就像一个长 php 文件。这适用于您的变量,因为它好像代码中没有中断。

当您使用 jQuery 的load()函数时,这会发生在客户端。正在发生的事情是您正在获取 JUST 的 html 输出,body.html并且您正在动态地(在客户端)将该内容放入客户端页面。

您遇到的问题是 PHP 不再连接。load()接受body.html它的奇点并将其放入页面中。

另一种看待它的方式是,当有人去index.php解析 php 时,所有被回显的变量都会变成沼泽标准 text/html 并传送到浏览器。一旦它们不再是 php 变量,它们只是 text/html。通过 javascript发出新请求body.html意味着您引用的那些变量不再可用。它们已经被转换为 HTML 并发送到浏览器,然后 php 停止了,这是一个新请求。

老实说,我不知道你想如何解决这个问题。你可能想研究一个像 smarty 这样的模板系统。或者您可能希望将您的函数放入一个名为functions.phpinclude it into your的文件body.html中,然后在您的文件中引用这些函数,body.html而不是依赖索引页面中的代码。

即你的body.html会是这样的:

<?php include "functions.php"; ?>
<div ...>
<?php 
    $var1 = getVar1(); // function in functions.php
    echo $var1->result[0][0];
    // ... etc
?>
</div>

然后当它从 javascript 调用时,在它被传递到浏览器之前,php 将被评估并且一切都会工作。

希望我已经很好地解释了这个家伙。:)

于 2012-07-01T00:22:27.907 回答
0

当您的 jQuery 请求到达服务器时,它将返回 body.html,它没有任何 PHP 处理,因此您在 index.php 中设置的变量不存在。

于 2012-07-01T00:21:56.473 回答