0

对于一个学校项目,我正在创建一个虚构的在线银行网站,该网站可以访问学校的数据库以获取虚构的帐户信息。每次查看帐户时,我都会收到两个 mysqli 错误。一个在 person.class.php 的第 26 行,另一个在 veiwaccounts.php 的第 52 行 我在我的 person 类中追踪了该错误的主要原因,但似乎无法以任何方式修复它。错误是

警告:mysqli_query() 期望参数 1 为 mysqli,在第 26 行的 .../person.class.php 中给出 null
警告:mysqli_fetch_assoc() 期望参数 1 为 mysqli_result,在 .../viewaccounts.php 中给出 null第 52 行

以下是 viewaccounts.php 文件中的一些代码示例:

if($currentMember)
{
    $currentMember = new Person($memberid);
    $accounts =  $currentMember->retrieve_all_accounts();

    //HERE IS WHERE THE PROBLEM IS $accounts = $currentMember->retrieve_all_accounts(); 

    //Loop through accounts
    while($account = mysqli_fetch_assoc($accounts)) {
        //Retrieve balance
        $bankaccount = new Bankaccount($account['BankAccountID']);
        $bankaccount->connection = $conn;
        $balance = mysqli_fetch_assoc($bankaccount->retrieve_current_balance());

以下是人员类文件的代码:

public function retrieve_all_accounts() {
    $accounts_query = "SELECT BankAccountID FROM BankAccount WHERE UserID = " .$this->memberid;
    $result = mysqli_query($this->connection, $accounts_query);
    return $result;
}
4

3 回答 3

1

您正在使用变量person中的成员 id实例化您的类。$memberid尝试在$memberid此处传递一个值[在其中传递一个值以实例化类的对象person]并用于var_dump调试它是否真的返回任何值。并$currentMember->connection = $conn;在实例化对象后放置。很可能您的问题是在这里引起的。您试图person在实例化它之前访问该类的公共变量连接。

于 2012-06-09T22:08:01.157 回答
1

改变

    //Accounts
    $currentMember->connection = $conn;

    //instantiating class here since suggested code from video fails to do it.


if($currentMember)
{
    $currentMember = new Person($memberid);
    $accounts =  $currentMember->retrieve_all_accounts();

}else
{
    echo "<p>not working</p>";
}

if(!$currentMember) {
  $currentMember = new Person($memberid);
}
$currentMember->connection = $conn;
$accounts =  $currentMember->retrieve_all_accounts();

为了便于阅读,我还将它转移到第一个 PHP 代码块中。

Person只有在$currentMember评估为时才实例化一个新对象TRUE- 如果unserialize()调用失败$currentMember将评估为FALSE,那就是您应该创建一个新对象的时候。

此外,您首先分配了connection属性,当您创建 new 时,该属性将被销毁,Person您可能每次都会这样做,否则您会看到更多警告。

Person您还应该重构测试是否保存在- 中的整个逻辑,$_SESSION首先,会话将序列化对象本身,因此您不需要调用serialize()/ unserialize()。相反,您应该做的是定义一个__autoload()函数并将对象实例存储在$_SESSION.

我还注意到您的开发服务器似乎已short_open_tag打开 - 将其关闭,使用它是不好的做法,因为它在现实世界中几乎无处不在。

于 2012-06-09T22:12:32.863 回答
1

看起来您的Database对象初始化连接有问题。它可能没有连接,因为错误表明您没有mysqlimysli_query().

尝试查看班级中的mysqli_connect_error()mysqli_connect_errno()Database确定在连接和从那里工作时是否出现错误。

于 2012-06-09T22:17:41.280 回答