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

AngularJS .get Method Causing Internal Error 500

我在本地计算机上使用 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);
?>

你有:

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

您正在尝试在 try 之外调用 $dbh 对象上的 query() 函数。

link 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();
}

您最好将数据库逻辑抽象到一个单独的 class 中,并像单例或静态 class 一样使用它,如其他 post 中所述:Best practices for a PDO class?.

哦,为了将来参考,如果您遇到无用的错误 500,找出问题所在的最简单方法是在您的终端上使用 tail -f /var/log/apache2/error.log,如果您使用的是 Debian 发行版,例如作为 Raspbian.