【问题标题】:pass data from mysql to javascript将数据从 mysql 传递到 javascript
【发布时间】:2020-12-28 11:02:00
【问题描述】:

这是使用 jquery 从 mysql 检索数据的正确方法吗? php 端工作正常($data 打印到页面上)但 jquery 似乎根本没有接收到变量。

除此之外,有没有办法让 jquery 函数在页面之后和谷歌地图 initMap() 函数完成加载后运行?是否可以在标准 javascript 函数中包含 jquery 代码?

admin.php

<?php
require 'private/database.php';

$sql = "SELECT * FROM latlng";
$result = mysqli_query($conn, $sql);

$data = array();
if (mysqli_num_rows($result) > 0) {
    while ($row = mysqli_fetch_assoc($result)) {
        $data[] = $row;
    }
}
echo json_encode($data);

?><!DOCTYPE html>
<html>
  <head>
    <link type="text/css" rel="stylesheet" href="css/admin.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <script type="text/javascript" src="js/admin.js"></script>
    <script type="text/javascript" src="js/maps.js"></script>
    <script defer 
      src="https://maps.googleapis.com/maps/api/js?key=(mykey)&callback=initMap&libraries=places&v=weekly"
    ></script>
  </head>
  <body>
    <div id="map"></div><br>
  </body>
</html>

我尝试过的 js/admin.js

$(document).ready(function() {
    $.ajax({
        url: '../admin.php',
        method: 'post',
        dataType: 'json',
        success: function(data) {
            console.log(data);
        }
    })
});

我在控制台中收到“404 Not found”错误

【问题讨论】:

  • 您正在使用数据库中的数据生成地图?您不需要在此处使用 ajax(只需使用 PHP 数据创建一个 js 变量),但如果您决定使用 ajax,则必须只发回数据 - 而不是上面似乎发生的整个页面。使用逻辑测试检查您是否有 POST 请求(来自 ajax 请求)并在该块中处理 db 查询 - 并使用 exitdie 将数据发回
  • 要在 initMap 函数运行后运行 ajax 请求 - 最后从 initMap 中调用它
  • 如果您收到 404,那么您添加了错误的 URL。不要使用相对路径,例如../admin.php,而是使用绝对路径。 url: '/path/to/admin.php'。当以/ 开始路径时,它将来自文档根目录。相对路径的问题在于它们与您所在的页面相关,而不是与实际文件位置相关。
  • 当您似乎定位(或试图定位)与要显示地图的页面相同的页面时,您可以选择使用location.href 而不是../admin.php,它应该没问题。向同一页面发送 ajax 请求的警告同样适用
  • @ProfessorAbronsius 感谢您的提醒!这听起来更有效率。我应该如何传递变量?

标签: javascript php jquery google-maps


【解决方案1】:

404-Error 表示您在 jQuery 代码中使用了错误的 URL 来获取数据。尝试不仅输入文件名,还输入整个 URL,例如 https://example.com/admin.php 作为 url 参数。

除了通过 jQuery 获取数据的问题之外,当您直接在浏览器中打开 admin.php 时会发生什么?你得到 $data 和你的 HTML 代码了吗?如果是这样,我建议您将整个 PHP 代码包装在 if 语句中:

if($_SERVER['REQUEST_METHOD'] === 'POST'){
    header('Content-Type: application/json');
    require 'private/database.php';

    $sql = "SELECT * FROM latlng";
    $result = mysqli_query($conn, $sql);

    $data = array();
    if (mysqli_num_rows($result) > 0) {
        while ($row = mysqli_fetch_assoc($result)) {
            $data[] = $row;
        }
    }
    die(json_encode($data));
}
else{ ?>
<!DOCTYPE html>
<html>
  <head>
    <link type="text/css" rel="stylesheet" href="css/admin.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <script type="text/javascript" src="js/admin.js"></script>
    <script type="text/javascript" src="js/maps.js"></script>
    <script defer 
      src="https://maps.googleapis.com/maps/api/js?key=(mykey)&callback=initMap&libraries=places&v=weekly"
    ></script>
  </head>
  <body>
    <div id="map"></div><br>
  </body>
</html>
<? } ?>

现在,如果它是来自您的 js 的 POST-Request,PHP 将以 JSON 格式返回数据。还将设置正确的标题。如果它不是 POST 请求,PHP 将返回您的 HTML。

对于您的另一个问题:是的,可以在普通的 JavaScript 函数中使用 jQuery。

【讨论】:

  • 谢谢! 404 错误消失了,但又弹出了一个:“JSON.parse:JSON 数据的第 1 行第 146 列的 JSON 数据后出现意外的非空白字符”。这是指什么?我没有使用 JSON.parse()
  • 嗯..尝试使用 die(json_encode($data) 而不是 echo json_encode($data)。