AngularJS .get方法导致内部错误500

时间:2015-03-03 21:02:35

标签: php angularjs sqlite pdo

我使用xampp在我的本地计算机上有一个工作版本的代码但是当我将它上传到我的Raspberry Pi时,它似乎变得混乱。

基本上我有一个angularjs脚本调用一个名为dbConn.php的文件,它位于同一目录下,可以在本地机器上运行,但在上传到Pi时却没有。

function raspberryController($scope, $http, $timeout) {
    var poll = function() {
        $timeout(function() {
            try{
                $http.get("dbConn.php")
                .success(function(response) {$scope.names = response;})
                .error(function(data, status, header, config) {
                    console.log(alert, status, header, config);
                });
            } catch (e) {
                console.log("Got an error!",e);
                throw e; 
                // rethrow to not marked as handled
            }
            poll();
        }, 1000);
    }
    poll();
}

dbConn.php

<?php
//$db = new SQLite3('system/modules/test.db'); 
header("Access-Control-Allow-Origin: *");
try{
    $dbh = new PDO('sqlite:system/test.db') or die("cannot open db");
} catch(Exception $e) {
    echo $e->getMessage(); 
}

$query = 'SELECT * FROM connected;';
$results = $dbh->query($query);

$outp = '[';

foreach($dbh->query($query) as $row){
    if ($outp != "[") {
        $outp .= ",";
    }
    $outp .= ' { "ID":"' . $row[0] .'",';
    $outp .= '"IP":"' . $row[1] .'",';
    $outp .= '"CONNECTED":"' . $row[2] .'",';
    $outp .= '"LEASE_TIME":"' .$row[3] .'" } ';
}

$outp .= ']';

echo($outp);
?>

1 个答案:

答案 0 :(得分:1)

你有:

try { $dbh = new PDO('sqlite:system/test.db') or die("cannot open db"); } catch(Exception $e) { echo $e->getMessage(); }

你试图在try之外的$ dbh对象上调用query()函数。

这里是PHP中变量作用域的链接:http://php.net/manual/en/language.variables.scope.php

要解决您的问题,请在try块外部使用空的$ dbh变量,然后在try中初始化它,例如:

$dbh = null;
try {
    $dbh = new PDO('sqlite:system/test.db') or die('cannot open db');
} catch (Exception $e) {
    //some code to handle it in here
    exit(); //to stop anything else from executing
}
$result = $dbh->query();

解决问题的另一种方法是将其余代码放在为$ dbh变量初始化而创建的try / catch块中。

try {
    $dbh = new PDO('sqlite:system/test.db') or die('cannot open db');
    $query = 'SELECT * FROM connected;';
    $results = $dbh->query($query);

    $outp = '[';
    foreach($results as $row){
        if ($outp != "[") {
            $outp .= ",";
        }
        $outp .= ' { "ID":"' . $row[0] .'",';
        $outp .= '"IP":"' . $row[1] .'",';
        $outp .= '"CONNECTED":"' . $row[2] .'",';
        $outp .= '"LEASE_TIME":"' .$row[3] .'" } ';
    }
    $outp .= ']';
    echo $outp;
} catch (Exception $e) {
    echo $e->getMessage();
}

最好将数据库逻辑抽象为一个单独的类,并将它像Singleton或静态类一样使用,详见另一篇文章:Best practices for a PDO class?

哦,为了将来参考,如果您遇到无用的错误500,找出问题的最简单方法是使用终端中的tail -f /var/log/apache2/error.log。重新使用像Raspbian这样的Debian发行版。