首页 > 解决方案 > 调用 PHP 函数表单 Javascript 后页面不加载

问题描述

当我从 javascript 函数(位于 .js 外部文件中)调用 PHP 函数时,网页会刷新并且似乎停止在 PHP 函数处加载。

function completePurchase(){

    //check if perosn signed in
    if (signedIn){
    alert("Purchase Complete! Total : " + total);
    //Upadte database - call PHP function in MainPage2 
    document.write('<?php echo upadtePurchaseToDB();?>');

    }
}

PHP 函数驻留在 PHP 标记内的 PHP 页面中:

//PHP to handle data when purchase button is pressed 
  function upadtePurchaseToDB(){

    echo "PHP CALLAED AS PURCHASE BUTTON PRESSED";

};

这个想法是在调用 PHP 函数时更新数据库。

但是,当被调用时,页面会刷新并保持空白。在控制台中,如果我导航到“元素”选项卡,我可以看到 PHP 调用:

不确定根本问题是我如何使用 JS 调用 PHP 函数或 PHP 函数的放置位置。

标签: javascriptphp

解决方案


一个问题是你试图让 JS 生成 PHP 代码,然后期望它能够工作:它不能。PHP 在服务器上运行,只有在浏览器请求页面时才“做事”:PHP 生成源代码供浏览器处理。这就是它所做的一切

当浏览器页面时,JS 启动,PHP 不再存在:有关这方面的更多信息,请参阅Javascript 和 PHP 之间的差异,我强烈建议您阅读该内容。

但是,您所描述的真正document.write()问题(您的页面看似重新加载但在 PHP 代码上死机)是由您使用 引起的,它绝对不会像您认为的那样做,您不应该在现代代码

document.write是JS中最早的函数之一,也是超低级的:它不会将文本写入网页,而是将字节写入文档字节流,以便文档解析器同时从字节流中提取数据并将其解析成页树。

虽然页面仍在处理中,但这似乎是安全的:document.write只需将字节注入打开的字节流,解析器将解析它,一切看起来都很好。然而,一旦页面树完成并且文档字节流关闭,事情就开始变得非常非常错误:

任何调用都document.write将尝试写入打开的字节流,如果它已关闭,document.write则只会打开一个字节流:现在您有一个空文档字节流。因为文档解析器看到一个打开的字节流,它开始根据里面的内容构建一个页面树,现在你的页面已经消失了,因为这是你告诉浏览器做的。

它也不是“似乎在 PHP 函数处停止加载”的情况,实际发生的是您已经告诉页面解析器形成页面树的新页面代码是 byte sequence <?php echo upadtePurchaseToDB();?>。所以解析器看着它,看到了<,所以知道后面会是一个标签,因为这就是 HTML 的工作方式。然后它看到?并运行“错误:此 HTML 是无效的 HTML”并停止。

所以这里的底线是阅读 PHP 运行的地点和时间,以及 JS 的运行地点和时间,但可以说更重要的是:永远不要使用document.write,因为它根本不会按照你的想法运行。


推荐阅读