【问题标题】:Getting parameter value from $resource in Angular using PHP使用 PHP 从 Angular 中的 $resource 获取参数值
【发布时间】:2016-12-25 11:57:15
【问题描述】:

我正在尝试使用 Angular 工厂从我的 Wordpress 数据库中检索数据。使用ng-click="updateCommentsById(v.id.videoId)" 我调用以下函数:

$scope.updateCommentsById = function(id) {
    commentRepository.query(({videoId: id}), function (data) {
        $scope.comments = data;
    });
}

对应于以下工厂定义:

angular.module("app")
    .factory("commentRepository",
        function($resource) {
            return $resource("/wp-content/themes/zerif-lite-child/inc/get_comments.php/:videoId",
            {
                videoId:"@id"
            });
        });

问题是如何将videoId 参数放入我在get_comments.php 内的PHP 函数中:

<?php
require_once($_SERVER["DOCUMENT_ROOT"]."/wp-load.php");
function get_comments_by_id($id)
{
    echo $id;
    if (!is_user_logged_in()) {
        echo json_encode("Not Authorised");
    } else {
        global $wpdb;
        $result = $wpdb->get_results("SELECT * FROM analyser_posts WHERE video_id = $id", OBJECT);
        echo wp_json_encode($result);
    }
}
get_comments_by_id(videoId);

编辑:

原来 get_results() 方法不允许在 SQL 语句中使用变量,我应该使用 prepare() (无论如何更安全)。我还更改了请求 URL。新代码变为:

angular.module("app")
    .factory("commentRepository",
        function ($resource) {
            return $resource("/wp-content/themes/zerif-lite-child/inc/get_comments.php?video_id=:videoId");
        });

和 PHP:

<?php
require_once($_SERVER["DOCUMENT_ROOT"]."/wp-load.php");
function get_comments_by_id($id)
{
    var_dump($id);
    if (!is_user_logged_in()) {
        echo json_encode("Not Authorised");
    } else {
        global $wpdb;
        $result = $wpdb->prepare("SELECT * FROM analyser_posts WHERE video_id = $id", OBJECT);
        var_dump($result);
        $result_array = array();
        if($result){
            foreach($result_array as $r){
                $result_array[] = $r;
            }
        }
        var_dump($result_array);
        echo json_encode($result_array);
    }
}
get_comments_by_id($_GET["video_id"]);

然而 var_dumps 显示 id 被正确传递,只有 prepare() 实际上并没有执行任何操作。我应该将其包装在 get_results 中吗?

【问题讨论】:

    标签: php mysql angularjs json wordpress


    【解决方案1】:

    您可以从 URI 中提取它:

    //$args is an array of every part separated by `/` (ignoring the query string)
    $args = explode('/',strtok(trim($_SERVER['REQUEST_URI'],'/'),'?'));
    
    //the last element is the video id
    $video_id = end($args);
    

    Live demo

    【讨论】:

    • 查询返回一个空数组。可能是因为它在$request 调用中添加了所需的冒号?
    • 视频ID捕获成功了吗?如果你 var_dump($_SERVER['REQUEST_URI']var_dump($video_id) 看到什么?
    • 当我添加 var_dump 时,控制器函数不再接受响应 (error)
    • @SjorsHijgenaar 这是有道理的。您需要直接在浏览器地址栏中输入目标 URL 才能看到响应。这是您可以测试服务器发送控制器的内容的方法。
    • 我明白了。我按照你说的做了,让我看到了 var_dumps。我将编辑问题,我可以说我快到了。
    【解决方案2】:

    使用答案(包括现在已删除的答案)和 cmets 使其工作。我的 Angular 控制器代码中的函数:

    $scope.updateCommentsById = function(id) {
        commentRepository.query(({videoId: id}), function (data) {
            $scope.comments = data;
        });
    }
    

    存储库:

    angular.module("app")
        .factory("commentRepository",
            function ($resource) {
                return $resource("/wp-content/themes/zerif-lite-child/inc/get_comments.php?video_id=:videoId");
            });
    

    get_cmets.php:

    <?php
    require_once($_SERVER["DOCUMENT_ROOT"]."/wp-load.php");
    function get_comments_by_id($id)
    {
        if (!is_user_logged_in()) {
            echo json_encode("Not Authorised");
        } else {
            global $wpdb;
            $sql = $wpdb->prepare("SELECT * FROM `analyser_posts` WHERE `video_id` = '$id'", OBJECT);
            $result = $wpdb->get_results($sql);
            echo json_encode($result);
        }
    }
    get_comments_by_id($_GET["video_id"]);
    

    【讨论】:

      猜你喜欢
      • 2013-10-09
      • 2014-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多