0

所以我在从 AJAX 请求调用的 PHP 页面上包含一个文件时遇到了问题:

$(document).ready(function() {
$("#image-status").html('Processing images...');
});

function process_images(files) {
$.ajax ({
    type: "POST",
    url: "includes/imageprocessor.php",
    data: {files: JSON.stringify(files)},
    success: function(data){  
        $("#image-status").html(data);
    }
});
}

我在 imageprocessor.php 上尝试这个 require_once:

require_once("db_connect.php");

它也在包含目录中,并且有效:我只是在另一个页面上使用它来运行一个工作正常的插入。但是当我尝试运行时:

function get_files($id) {
$query = $db->prepare("SELECT * FROM files INNER JOIN file_profile_join ON files.id = file_profile_join.file_id WHERE file_profile_join.profile_id = " . $id . " GROUP BY files.id");
try {
    $query->execute();
    $rows = $query->fetch();
} catch (PDOException $e) {
    die($e->getMessage());
}
}

稍后在 imageprocessor.php 中,它会出错:

Fatal error: Call to a member function prepare() on a non-object in /home/yogabopvolume26/theprivatesector.org/epic/includes/imageprocessor.php on line 90

就像它首先不需要 db_connect 一样(这就是声明 $db 的地方)。但它也没有返回找不到 db_connect.php 的错误。

basename(__DIR__) 

在 imageprocessor.php 上(通过 AJAX 请求回显)返回“include”。

我已经尝试在 require_once 中同时使用绝对 URL 和根路径,但它既不会出错,也不会继续使用 imageprocessor.php:在返回 require_once 后,该文件没有回显。我也无法从 session_start 获取当前会话(我可以从原始页面 [profile.php] 打印_r $_SESSION,因此会话处于活动状态)。也许他们有关系?我不知道出了什么问题。

4

2 回答 2

0

在一个非对象上调用成员函数 someFunc()......

当您想使用任何对象的 someFunc() 方法时会发生这种类型的错误,但不幸的是您的对象不是对象。

认为

$obj = New SomeObj();
$nextObj = $obj->someMethod(); // << Suppoes someMethod() returns a object if successfull
$nextObj->newMethod();

在这段代码中,$nextObj->newMethod()只有当$nextObj是一个对象时才会起作用。但是我们不能确定这一点,因为$obj->someMethod();只有在成功时才会返回一个对象,否则在不成功时返回。

防止这种情况的好方法是。

$nextObj = $obj->someMethod(); // << Suppoes someMethod() returns a object if successfull
if(is_object($nextObj)){
    $nextObj->newMethod();
} else {
    //Now you know that there is error while executing $obj->someMethod();
}

另一件事: 既然你有一个功能function get_files($id)。您自己可以看到该$db变量未在您的函数范围内定义。所以,$db 现在什么都不包含。在其他答案中,您应该使用global $db或可以将$db对象作为参数传递给您的函数。

于 2013-11-02T04:12:10.257 回答
0

希望你db_connect.php的东西链接:

try {
    $db = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}

如果您在外部使用连接对象作为连接文件,那么您必须使用global

据我所知,您收到此错误是因为您没有$db在文件中调用该对象,请imageprocessor.php尝试以下操作:

function get_files($id) {
    global $db;
    $query = $db->prepare("SELECT * FROM files INNER JOIN file_profile_join ON files.id = file_profile_join.file_id WHERE file_profile_join.profile_id = " . $id . " GROUP BY files.id");
    try {
        $query->execute();
        $rows = $query->fetch();
    } catch (PDOException $e) {
        die($e->getMessage());
    }
}
于 2013-11-02T04:06:46.070 回答