【问题标题】:Ionic, PHP, MySQL and JSONP with Angular带有 Angular 的 Ionic、PHP、MySQL 和 JSONP
【发布时间】:2015-11-01 03:59:24
【问题描述】:

我试图从我的 php 页面获取参数到 android 应用程序,

这里是 js.php

上的代码
<?php header('content-type: application/json; charset=utf-8');
$rest=$_GET['rest'];

if ($rest=="query"){
$sql = "SELECT * FROM post";
$result = $conn->query($sql);

$emparray = array();
    while($row =mysqli_fetch_assoc($result))
    {
        $emparray['posts'] = $post;
        $post[] = str_replace('"', "'", $row);
    }
    $json = json_encode($emparray);

echo isset($_GET['callback'])
    ? "{$_GET['callback']}($json)"
    : $json;
}
?>

我在我的服务器上使用 .htaccess

RewriteEngine On
Options +FollowSymLinks -MultiViews
RewriteRule    ^rest/([A-Za-z]+)/?$    js.php?rest=$1    [NC,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

RewriteCond %{HTTP_HOST} !^www.domain.com$ [NC]
RewriteRule ^(.*)$ http://www.domain.com/$1 [L,R=301] 

最后,我在 ionic 上的 js www\js\app.js

var App = angular.module('App', ['ionic']);


App.service("Robo", ["$http", "$log", Robo])
App.controller("AppCtrl", ["$scope", "Robo", "$log", AppCtrl]);


function AppCtrl($scope, Robo, $log){
    $scope.posts = [];
    $scope.refresh = function(){
        Robo.getBlogs($scope);
    }
} 
   function Robo($http, $log) {
        this.getBlogs = function($scope){
                $http.jsonp("http://www.domain.com/rest/query?callback=JSON_CALLBACK")
                    .success(function(result){
                        $scope.posts = result.posts;
                        $scope.$broadcast("scroll.refreshComplete");
                    });
        }
    }

在 index.html 上

<html lang="en" data-ng-app="App">
<ion-content>
                <ion-refresher on-refresh="refresh()"></ion-refresher>
                <div data-ng-show="!posts.length">
                    <br><br>
                    <center>
                        <h1>Pull to Refresh</h1>
                    </center>
                </div>
.
.
.

我被困在这里,数组 $scope.posts 上没有数据,所以当我拉动刷新时,加载永远不会结束。请帮助并建议我解决此问题

【问题讨论】:

  • 查看开发者工具的网络窗格中的内容 - 请求状态和响应正文对于检查问题的来源很重要。
  • content-type: application/json — JSONP 不是 JSON,正确的内容类型是 application/javascript
  • 我已经更改为 app;ication/javascript 但帖子仍然无法在我的 Android 应用上显示

标签: javascript php mysql angularjs .htaccess


【解决方案1】:

您没有进行任何适当的错误处理。 mysqli::query 很可能是FALSE。

您最大的问题似乎是您不了解变量的生命周期。一个典型的变量被声明,然后实例化,然后以某种方式使用,最后被删除。 PHP 不是强类型的,因此通常同时声明和实例化一个变量。一旦变量超出范围,PHP 也会为您删除。

现在让我们看看您的代码。我在每行之后添加了每个变量包含的内容:

/* $emparray = NULL */
$emparray = array();
/* $emparray = Array() */
while($row =mysqli_fetch_assoc($result))
{
    /* $post = NULL
     * $emparray = Array() (1st time) or...
     * $emparray = Array( "posts" => NULL )
     * $row = Array( content )
     */
    $emparray['posts'] = $post;
    /* $post = NULL
     * $emparray = Array( "posts" => NULL )
     * $row = Array( content )
     */
    $post[] = str_replace('"', "'", $row);
    /* $post = Array( 0 => content_with_quotes_replaced )
     * $emparray = Array( "posts" => NULL )
     * $row = Array( content )
     */
}
/* $emparray = Array( "posts" => NULL */
$json = json_encode($emparray);

那不是很有用,是吗?您正在为$post 分配一个值,然后让它超出范围。每次通过循环时,您还将用 $post 变量的内容替换 $emparray 中的关键“帖子”。由于未定义$post 变量,因此它的值将始终为NULL。

您的代码存在的另一个问题是,如果查询没有返回任何结果,则循环将不会运行,因此您最终会得到一个完全没有“posts”键的数组。

一个更模糊的问题是,通过将$row 中的双引号替换为单引号,您最终可能会得到一些没有意义的东西。您可能想转义引号。


那么,您如何改进这一点?首先为$emparray 选择一个更好的名称。它没有传达这个变量的含义。将 posts-key 添加到该数组,并使用一个空数组作为值。在$row 上执行您需要执行的任何操作,并将结果放入它自己的变量中。然后使用您已经使用的语法 ($variable['posts'][] = ...) 将其添加到结果数组中。最后将其转换为 json 格式的字符串。

【讨论】:

  • 嗨Sumurai8,我上面提到的编码,如果我使用浏览器打开php页面,它会显示数据。但问题是,我在我的角度控制器上使用了 $http.jsonp,但我无法获取变量 $scope.posts = result.posts; 上的数据
猜你喜欢
  • 1970-01-01
  • 2019-06-24
  • 2018-07-09
  • 2017-09-16
  • 2015-11-04
  • 2020-05-30
  • 1970-01-01
  • 2016-08-10
  • 2017-04-08
相关资源
最近更新 更多