【问题标题】:Why isn't my php code triggered on form submit?为什么我的 php 代码没有在表单提交时触发?
【发布时间】:2023-04-06 18:34:01
【问题描述】:

我会解释我的代码,然后在代码sn-ps之后继续解决问题:

我有一个名为“functions_questions”的表单。提交后,以下代码会根据当前分数增加或减少我的 sql 数据库(标题为“答案”)中的一列(标题为“分数”)。

<?php  
    $id = $_SESSION['id'];

    if(isset($_POST['functions_question'])){

    $res = $db->query("SELECT score FROM answers WHERE id=$id");
    $data = $res->fetch_array();

    if($data['score']<2)$db->query("UPDATE answers SET score = score+1 WHERE id=$id");

    if($data['score']>1)$db->query("UPDATE answers SET score = score-1 WHERE id=$id");

  }

?>

我还有以下 AJAX 代码,它会在提交表单时自动更改 div (id = "ajaxtest") 中的文本。当然,这样做不会刷新页面,因为它使用 AJAX。

<script type='text/javascript'>

$(document).ready(function () {
$('#questionform').on('submit', function(e) {
    e.preventDefault();
    $.ajax({
        url : $(this).attr('action') || window.location.pathname,
        type: "POST",
        data: $(this).serialize(),
        success: function (data) { 

ajaxtest.innerHTML = '"<?php echo $data['score']; ?>"';

            },
        });
    });
});
</script>

最后,我有以下代码,它显示了标题为“答案”的数据库中标题为“分数”的列中的值。

<?php
$resss = $db->query("SELECT * FROM answers WHERE id=$id");
$data = $resss->fetch_array();
var_dump($data['score']);
?>

当我提交表单时,我可以作为管理员在数据库中看到分数已更新。 AJAX 代码将 div (ajaxtest) 更改为 $data['score'],但它显示更新之前的前一个分数,而不是新更新的分数。如何修改它以便 ajaxtest 显示更新的分数而不是未更新的分数?

【问题讨论】:

  • 表单本身是否命名为functions_questions?或者这实际上是表单中输入/按钮/提交/其他表单字段的名称?
  • 这是表单的名称。
  • 在 HTML 中,表单本身并不是表单元素;它没有值,也没有提交。您需要根据提交的实际表单元素进行测试。
  • &lt;?php echo $data['score']; ?&gt; 的值在页面加载时是固定的 - PHP 在发送页面之前呈现页面,包括 javascript。如果您想使用从 PHP 脚本返回的数据,您需要更改成功回调以执行类似 ajaxtest.innerHTML = data.score; 的操作
  • 嗯,当我将其更改为 ajaxtest.innerHTML = 'data.score'; 时,div 只是更改为“data.score”。

标签: php ajax forms


【解决方案1】:

只需使用以下代码更改您的 PHP 代码:-

<?php  
    $id = $_SESSION['id'];

    if(isset($_POST['functions_question'])){

        $res = $db->query("SELECT score FROM answers WHERE id=$id");
        $data = $res->fetch_array();

        if($data['score']<2)$db->query("UPDATE answers SET score = score+1 WHERE id=$id");

        if($data['score']>1)$db->query("UPDATE answers SET score = score-1 WHERE id=$id");

        $res = $db->query("SELECT score FROM answers WHERE id=$id");
        $data = $res->fetch_array();

    }

?>

也许对你有帮助。

我只是在更新新记录后得到分数。

【讨论】:

  • 感谢您的评论。为什么在代码末尾重复 $res = $db-&gt;query("SELECT score FROM answers WHERE id=$id"); $data = $res-&gt;fetch_array(); 可能有助于解决问题?
  • 因为您在获得值之前获得了 1,并且在更新这些值之后所以现在为 2,但是您显示的是更新查询之前的旧值。
【解决方案2】:

嗯,这是因为声明 ajaxtest.innerHTML = '"&lt;?php echo $data['score']; ?&gt;"'; 在文件被提供后立即被评估,因此转换为 ajaxtest.innerHTML = &lt;score when file was served&gt;';

如果您想显示新值,则必须使用另一个异步请求(通常称为 AJAX 调用)来检索它,或者在负责管理调用并通过数据参数:

编辑

JS:

$(document).ready(function () {
    $('#questionform').on('submit', function(e) {
        e.preventDefault();
        $.ajax({
            url : $(this).attr('action') || window.location.pathname,
            type: "POST",
            data: $(this).serialize(),
            success: function (data) { 
                ajaxtest.innerHTML = data;
            },
        });
    });
});

PHP:

<?php
    $id = $_SESSION['id'];

    if(isset($_POST['functions_question'])){

        $res = $db->query("SELECT score FROM answers WHERE id=$id");
        $data = $res->fetch_array();

        if($data['score'] < 2)
            $db->query("UPDATE answers SET score = score+1 WHERE id=$id");

        if($data['score'] > 1)
            $db->query("UPDATE answers SET score = score-1 WHERE id=$id");
        $res = $db->query("SELECT score FROM answers WHERE id=$id");
        $data = $res->fetch_array();

        echo $data['score'];
    }

是这样的:

  1. 提供文件并评估其中的所有 PHP 语句,向客户端发送响应
  2. 对服务器的 AJAX 请求
  3. 服务器处理请求
  4. AJAX 接收响应(数据)
  5. 您使用响应数据

您可以通过启用开发人员工具(通常是 ctrl+shift+i)并在“网络”选项卡中启用 XHR 来检查 Chrome 中的 AJAX 请求的结果。

【讨论】:

  • 感谢您的评论!不幸的是,我对如何将其应用于我的 AJAX 代码(我的帖子中的第二个代码块)有点困惑。我以为它已经设置为您在上面发布的 JS 格式。我应该用您在那里编写的 PHP 代码替换 ajaxtest.innerHTML = '"&lt;?php echo $data['score']; ?&gt;"'; 吗?很抱歉看起来这么密集,但我是一个完全的新手。
  • 为什么重复查询可以解决问题是因为您正在从数据库中检索新值并用它填充 $data。
  • 这很有帮助!谢谢!希望这是我的最后一个问题:ajaxtest.innerHTML = data; 如何“知道”要引用哪些数据?换句话说,PHP 链接到 JS 的代码的哪一部分?
  • 当我进行这些更改并提交表单时,它最终用我的网页的整个副本替换了那个 div。 (我知道你看不到完整的代码,但我猜“数据”目前指的不仅仅是 PHP 代码。)因此,我想一个比我上面问的更有成效的问题是: 有没有办法指定我希望“数据”专门引用那段 PHP 代码?
  • data 指的是响应中的所有内容。您可以尝试在 echo $data['score']; 之后添加 die(); 语句。这将确保响应仅包含分数的值。此外,要将 JS 中的 data 作为具有属性的对象访问,您必须以某种格式(如 JSON)从 PHP 返回响应。但是,由于您似乎刚刚开始 PHP 编码之旅,我想这种方法现在很好。但是,它有几个缺点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多