【问题标题】:Ajax POST with mysqli database queryAjax POST 与 mysqli 数据库查询
【发布时间】:2020-04-13 18:46:37
【问题描述】:

我正在尝试让 Ajax 发布到与主索引位于同一目录中的另一个.PHP 文件。我的想法是,我想要一个人们可以写入并立即在数据库中更新的在线日记。

目前,我的 ajax 是这样的

    $('#diary').on('input propertychange', function() {
    $.ajax({
        type: "POST",
        url: "updatedatabase.php",
        data: {content: $('#diary').val()},
        success: function(  msg  ) {
             alert('Data Saved: ' + msg);
         },
        dataType: "text"
    });
});

我的 PHP 在 updatedatabase.php 页面上看起来像这样

<?php

session_start();

if ($_POST['content']) {

$link = mysqli_connect("location", "username", "password", "databasename");

if (mysqli_connect_error()) {
    echo "Could not connect to database";
    die;
}

$query = "UPDATE `users` SET `Diary` = '".mysqli_real_escape_string($link, $_POST['content'])."' WHERE email = '".mysqli_real_escape_string($link, $_SESSION['email'])."' LIMIT 1";

if (mysqli_query($link, $query)) {
    echo "Success";
} else {
    echo mysqli_error($link);
    echo "Failure";
}

}

?>

主页开头的完整 HTML + PHP:

<?php

session_start();

$link = mysqli_connect(databaseinfo);

if (mysqli_connect_error()) {
    echo "Could not connect to database";
    die();
}

if (empty($_COOKIE['userId']) && (empty($_SESSION['email']))) {
    header('Location: index.php');
}


$query = "SELECT email FROM users WHERE email = '".mysqli_real_escape_string($link, $_COOKIE['userId'])."' ";

if (!mysqli_query($link, $query)) {
    header('Location: login.php');
    die();
}

if(isset($_POST['logout'])) {
    unset($_SESSION['email']);
    setcookie('userId', '', time() - 60 * 60);
    header('Location: login.php');
}



?>

<!doctype html>
<html lang="en">
  <head>
    <title>Title</title>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">

    <style type="text/css">

    body {
        background-image: url("images/landscape.jpg");

    }

    h1 {
        text-align: center;
        margin: 15px auto 30px auto;
    }

    #diary {
        min-height: 40vw;
    }

    </style>

  </head>
  <body>

    <div class="container">
        <div class="container">
        <h1>Secret Diary</h1>   

        <form method="POST">

            <div class="form-group">
            <button type="submit" name="logout" id="logout" class="btn btn-info">Logout</button>   
            </div>

        </form>
        </div>

        <div class="form-group">
            <div class="form-group">
              <textarea class="form-control" name="diary" id="diary" rows="3" placeholder="shhh"></textarea>
            </div>
        </div>

    </div>

    <!-- Optional JavaScript -->
    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
    <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>

    <script type="text/javascript"> 

        $('#diary').on('input propertychange', function() {
        $.ajax({
            type: "POST",
            url: "updatedatabase.php",
            data: {content: $('#diary').val()},
            success: function(  msg  ) {
                 alert('Data Saved: ' + msg);
             },
            dataType: "text"
        });
    });

    </script>

  </body>
</html>

我尝试过从 .on 更改为 .bind,我尝试过 ajax 代码的不同变体并更新数据库代码,我尝试过查看 StackOverflow。

p.s 我知道在 mysqli 查询注入中有几个安全错误。这主要是为了我自己的实践和学习之旅,但我正在努力解决这个问题。

非常感谢。

【问题讨论】:

  • 发布您的 html。
  • 在帖子中添加了 HTML。
  • 使用 $('#diary').on('input')
  • 会发生什么?你有错误吗?什么都没发生还是什么?
  • 你为什么不直接通过提交按钮提交日记文本,这意味着将其包装在表单标签中/使用onchange()等没有意义。我假设用户会在 textarea 标签中写入大量文本并希望提交。 onchange() 会在它们完成之前触发它,这是糟糕的用户体验

标签: php jquery ajax


【解决方案1】:

使用.on('change') 绑定输入事件。

另外,如果您要使用 ajax,请不要使用 slim 缩小的 jquery 库,它不包括在内。见jQuery 3 slim ajax basic example

编辑:我用这段 html/js 让脚本工作了:

<script
        src="https://code.jquery.com/jquery-3.4.1.min.js"
        integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo="
        crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>

<script type="text/javascript">

  $('#diary').on('change', function() {
    $.ajax({
      type: "POST",
      url: "updatedatabase.php",
      data: {content: $('#diary').val()},
      success: function(  msg  ) {
        alert('Data Saved: ' + msg);
      },
      dataType: "text"
    });
  });

</script>

【讨论】:

  • 谢谢。我已将 jQuery CDN 更改为未压缩。我还将 jquery 代码更改为 .on('input', function() 而不是 .on('input propertychange', function() 但它似乎仍然不起作用。我无法更新数据库,我是没有收到来自 updatedatabase.php 的返回回显
  • on('input') 和 on('change','input') 一样吗?
  • @Dyneskye - 请小心使用输入。它将在所有作为输入的元素上执行。
  • 谢谢!在摆弄 jquery cdns 之后它就可以工作了。以前它似乎在连续编辑后似乎不起作用,它似乎终于自行解决了。对于那些有同样问题的人,问题正如 oli 所说,我使用的库是苗条的 jquery,并且没有包含正确的 ajax 代码以使其工作。
【解决方案2】:

你应该像这样在 jQuery 中使用 change

 $('#diary').on('change', function() {
     code...
 });

 $(document).on('change', '#diary', function() {
     code...
 });

或者如果#diary 不是动态创建的(在运行时),你可以这样做:

 $('#diary').change(function() {
     code...
 });

【讨论】:

  • 谢谢。我已经尝试过这些,但似乎不起作用。我认为问题出在我的 ajax 代码或 updatedatabase.php 代码上?
  • 发生了什么?
  • 什么也没发生。我无法从我的 updatedatabase PHP 页面获得响应(我相信我应该收到警报),并且 MySQL 数据库日记表部分没有任何内容
  • 实际的 javascript 是否执行(如果您在更改功能中执行 alert('x');。是否出现该对话框?
  • $_POST['diary'] 应该是 $_POST['content'] 因为您在 ajax 请求中将数据作为内容发送:{value of diary}。因此,它是您应该在 PHP 中使用的关键内容。
猜你喜欢
  • 1970-01-01
  • 2023-01-30
  • 2013-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多