将 PHP Array 推送到 AJAX 响应中 JQuery 数组

Push PHP Array into AJAX response into JQuery array

本文关键字:响应 JQuery 数组 AJAX PHP Array      更新时间:2023-09-26

我在将MySQL查询的结果输出为图形数据集时遇到问题。我不确定如何将我得到的结果作为一个简单的数组传递。它在 php 中回显得很好,并且 ajax 请求可以工作,但是(我假设)它无法格式化为数组的正确 jquery/javascript 格式。这是我的代码的要点:

主页上绘制图形的 JavaScript 部分:

<script>
    var randomScalingFactor = function(){ return Math.round(Math.random()*100)};
    var lineChartData = {
        labels : ["January","February","March","April","May","June","July"],
        datasets : [
            {
                label: "Fast Signal",
                fillColor : "rgba(220,220,220,0.2)",
                strokeColor : "rgba(220,220,220,1)",
                pointColor : "rgba(220,220,220,1)",
                pointStrokeColor : "#fff",
                pointHighlightFill : "#fff",
                pointHighlightStroke : "rgba(220,220,220,1)",
                data : getFast()
            },
            {
                label: "Slow Signal",
                fillColor : "rgba(151,187,205,0.2)",
                strokeColor : "rgba(151,187,205,1)",
                pointColor : "rgba(151,187,205,1)",
                pointStrokeColor : "#fff",
                pointHighlightFill : "#fff",
                pointHighlightStroke : "rgba(151,187,205,1)",
                data : getSlow()
            }
        ]
    }
window.onload = function(){
    var ctx = document.getElementById("canvas").getContext("2d");
    window.myLine = new Chart(ctx).Line(lineChartData, {
        responsive: true
    });
}

</script>

在主页上加载图形时调用的 AJAX:

<script type="text/javascript">
function test(){
    alert("test");
    }
function getAll(){
            $.ajax({
                type:"POST",
                url:"dataproc.php",
                data:{  action: true,
                        all: true
                },
                success:function(data){
                     $("#dataDiv").html(data);
                }
            });
        }
function getFast(){
            $.ajax({
                type:"POST",
                url:"dataproc.php",
                data:{  action: true,
                        fast: true
                },
                success:function(data){
                     $("#fastDiv").html(data);
                     return data;
                }
            });
        }
function getSlow(){
            $.ajax({
                type:"POST",
                url:"dataproc.php",
                data:{  action: true,
                        slow: true
                },
                success:function(data){
                     $("#slowDiv").html(data);
                     return data;
                }
            });
        }
function getHisto(){
            $.ajax({
                type:"POST",
                url:"dataproc.php",
                data:{  action: true,
                        histo: true
                },
                success:function(data){
                     $("#histoDiv").html(data);
                     return data;
                }
            });
        }
</script>

以及 AJAX 调用的远程页面:

<?php
if(isset($_POST['action'])){
    if(isset($_POST['all'])){
        define("DB_DSN", "mysql:host=localhost;dbname=BTCUSD"); //db conn
        define("DB_USERNAME","prices"); //db user
        define("DB_PASSWORD","********"); // db pass
        try {
            //echo "Current Price: $".$current;
            $con = new PDO(DB_DSN, DB_USERNAME, DB_PASSWORD);
            $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $sql = "SELECT * FROM 5Minute ORDER BY timestamp ASC";
            $stmt = $con->prepare($sql);
            $stmt->execute();
            $valid = $stmt->fetchAll();
            $con = null;
            if($valid){
                foreach($valid as $res){
                    $prices[] = (float)$res["price"];
                }
                $macdArr = trader_macd($prices,12,26,9);
                if(end($macdArr[0]) &&  end($macdArr[1]) && end($macdArr[2])){
                    echo json_encode($macdArr, JSON_NUMERIC_CHECK);

                }
            }
        }catch(PDOException $e){
            echo "Error: ".$e->getMessage();
        }
        $con = null;
    }
    if(isset($_POST['fast'])){
        define("DB_DSN", "mysql:host=localhost;dbname=BTCUSD"); //db conn
        define("DB_USERNAME","prices"); //db user
        define("DB_PASSWORD","*******"); // db pass
        try {
            //echo "Current Price: $".$current;
            $con = new PDO(DB_DSN, DB_USERNAME, DB_PASSWORD);
            $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $sql = "SELECT * FROM 5Minute ORDER BY timestamp ASC";
            $stmt = $con->prepare($sql);
            $stmt->execute();
            $valid = $stmt->fetchAll();
            $con = null;
            if($valid){
                foreach($valid as $res){
                    $prices[] = (float)$res["price"];
                }
                $macdArr = trader_macd($prices,12,26,9);
                if(end($macdArr[0]) &&  end($macdArr[1]) && end($macdArr[2])){
                    $fastArr = array();
                    foreach($macdArr[0] as $fastVal){
                        $fastArr[] = $fastVal;
                    }
                    echo json_encode($fastArr, JSON_NUMERIC_CHECK);;
                }
            }
        }catch(PDOException $e){
            echo "Error: ".$e->getMessage();
        }
        $con = null;
    }
    if(isset($_POST['slow'])){
        define("DB_DSN", "mysql:host=localhost;dbname=BTCUSD"); //db conn
        define("DB_USERNAME","prices"); //db user
        define("DB_PASSWORD","********"); // db pass
        try {
            //echo "Current Price: $".$current;
            $con = new PDO(DB_DSN, DB_USERNAME, DB_PASSWORD);
            $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $sql = "SELECT * FROM 5Minute ORDER BY timestamp ASC";
            $stmt = $con->prepare($sql);
            $stmt->execute();
            $valid = $stmt->fetchAll();
            $con = null;
            if($valid){
                foreach($valid as $res){
                    $prices[] = (float)$res["price"];
                }
                $macdArr = trader_macd($prices,12,26,9);
                if(end($macdArr[0]) &&  end($macdArr[1]) && end($macdArr[2])){
                    $slowArr = array();
                    foreach($macdArr[1] as $slowVal){
                        $slowArr[] = $slowVal;
                    }
                    echo json_encode($slowArr, JSON_NUMERIC_CHECK);;
                }
            }
        }catch(PDOException $e){
            echo "Error: ".$e->getMessage();
        }
        $con = null;
    }
    if(isset($_POST['histo'])){
        define("DB_DSN", "mysql:host=localhost;dbname=BTCUSD"); //db conn
        define("DB_USERNAME","prices"); //db user
        define("DB_PASSWORD","*******"); // db pass
        try {
            //echo "Current Price: $".$current;
            $con = new PDO(DB_DSN, DB_USERNAME, DB_PASSWORD);
            $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $sql = "SELECT * FROM 5Minute ORDER BY timestamp ASC";
            $stmt = $con->prepare($sql);
            $stmt->execute();
            $valid = $stmt->fetchAll();
            $con = null;
            if($valid){
                foreach($valid as $res){
                    $prices[] = (float)$res["price"];
                }
                $macdArr = trader_macd($prices,12,26,9);
                if(end($macdArr[0]) &&  end($macdArr[1]) && end($macdArr[2])){
                    $histoArr = array();
                    foreach($macdArr[2] as $histoVal){
                        $histoArr[] = $histoVal;
                    }
                    echo json_encode($histoArr, JSON_NUMERIC_CHECK);;
                }
            }
        }catch(PDOException $e){
            echo "Error: ".$e->getMessage();
        }
        $con = null;
    }
}
?>

当我将输出作为成功的 AJAX 查询回显到div 中时,它显示的完全是这样的:

[-1.066,-0.995,-0.927,-0.863,-0.804,-0.746,-0.739,-0.687]

这是图表脚本中数据字段的正确格式,但图形不会绘制。

假设"返回数据;"是在ajax调用后将数组结果传递回jquery/javascript的正确方法,我错了吗?

任何帮助将不胜感激,谢谢!

你应该在

ajax 调用结束后初始化图形。

例如:

var data1;
var data2;
$(document).ready(function() {
    //get the first data
    .ajax({
        type:"POST",
        url:"dataproc.php",
        data:{  action: true,
                slow: true
        },
        success:function(data){
             data1 = data;
             getSecondData(); //call to get second data
        }
    }
});
function getSecondData()
{
    .ajax({
        type:"POST",
        url:"dataproc.php",
        data:{  action: true,
                histo: true
        },
        success:function(data){
             data2 = data;
             drawGraph(); //now draw
        }
    }
}
function drawGraph()
{
    //draw graph with data 1 and data2
}