2013-05-01 97 views
1

我有一个Club {}类,它有几个公共函数和私有函数。我有三个私有函数用于从我的数据库获取数据。这是下面的代码:PHP - 在类中调用私有函数显示MySQL数据

private function Get_Members_From_DB() 
    { 
     $sql = "SELECT 
        Email, FirstName, LastName, Gender 
       FROM 
        member"; 

     $result = mysqli_query($this->Con, $sql); 

     $arrayResult = array(); 

     while($row = mysqli_fetch_array($result)) 
     { 
      $arrayResult[] = $row; 
     } 

     return ($arrayResult); 
    } 

    private function Get_Members_Interests_From_DB($MemberEmail) 
    { 
     $sql = "SELECT 
        interest_type.InterestDescription 
       FROM 
        member, member_interests, interest_type 
       WHERE 
        member.Email = '$MemberEmail' 
       AND 
        member.Email = member_interests.Email 
       AND 
        member_interests.InterestID = interest_type.InterestID"; 

     $result = mysqli_query($this->Con, $sql); 

     while($row = mysqli_fetch_array($result)) 
     { 
      $arrayResult[] = $row; 
     } 

     return ($arrayResult); 
    } 

    private function Get_Interests_Types_From_DB() 
    { 
     $sql = "SELECT 
        InterestID, 
        InterestDescription 
       FROM 
        interest_type"; 

     $result = mysqli_query($this->Con, $sql); 

     while($row = mysqli_fetch_array($result)) 
     { 
      $arrayResult[] = $row; 
     } 

     return ($arrayResult); 
    } 

当我把这些,我得到警告:mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given上线406,这是while($row = mysqli_fetch_array($result))。我也行48这是echo("<tr><td>" . $row1['FirstName'] . " " . $row1['LastName'] . "</td><td>" . $row1['Email'] .

我已经试过这几个版本得到Fatal error: Cannot use object of type Club as array in,我似乎无法得到的数据进行工作分为以下几个功能:

public function DisplayMembers() 
    { 
     //$members[] = array(); 
     $interests[] = array(); 
     $members = new Club(); 
     $members->Get_Members_From_DB(); 

     echo ("<table id='membertable'><tr><td colspan='4'>Informatics Club Members</td></tr> 
       <tr><td width='130px'>Name</td><td width='170px'>Email</td><td width='60'>Gender</td> 
       <td width='280px'>Interests</td></tr>"); 

     while($row1 = $members) 
     { 
      echo("<tr><td>" . $row1['FirstName'] . " " . $row1['LastName'] . "</td><td>" . $row1['Email'] . 
        "</td><td>" . $row1['Gender'] . "</td><td><ul>;"); 

      $results2 = new Club; 
      $results2->Get_Members_Interests_From_DB($row1['Email']); 

      while($row2 = mysqli_fetch_array($results2)) 
      { 
       $interests[] = $row2; 
       echo("<li>" . $row2['InterestDescription'] . "</li>"); 
      } 

      echo("</ul></td></tr>"); 
     }; 

     echo "</table><br>"; 
} 

我改变了private function Get_Members_From_DB()到:

$sql = "SELECT 
        Email, FirstName, LastName, Gender 
       FROM 
        member"; 

     $result = mysqli_query($this->Con, $sql); return ($result); 

,它仍然没有在DisplayMembers()功能与出得到的第一个错误我张贴以上,但它会是第46行,这将改变工作:while($row1 = mysqli_fetch_array($members))如果我拿上面的代码,并直接粘贴到DisplayMembers()我可以得到正确显示为HTML表格的功能。我不明白为什么当我将代码分离到私有函数时出现错误。有任何想法吗?

编辑:我从SAME类中的一个公共函数调用这些私有函数。

+0

你试过公共函数Get_Interests_Types_From_DB()吗? – Simon 2013-05-01 08:43:53

+0

你没有对你的查询结果做任何事情?你从你的函数中返回它们,但是不要把它们放在任何地方? – 2013-05-01 08:48:19

+0

问题是他想访问一个私有函数,并且这不是由PHP中的可见性授权的。他必须通过公共职能来完成这项工作,或者如果这项工作得到延伸,并且具有受保护的职能。私人总是会返回致命的错误,除非在课堂内使用它。 – Simon 2013-05-01 08:50:10

回答

3

我会帮你分析一下你的代码。第一部分看起来像这样...

$members = new Club(); 
$members->Get_Members_From_DB(); 

Get_Members_From_DB()返回一个值,但你不存储在任何地方该值。而且,你已经属于俱乐部级别,所以我们不需要新的俱乐部。相反,试试这个...

$members = $this->Get_Members_From_DB(); 

接下来,你有...

while($row1 = $members) 

但你已经分配(复制)$members$row1这里。只要$members是真的,这将永远循环。相反,考虑这...

foreach ($members as $member) 
{ 
    // Do something with $member 
} 

最后,你有一个类似的问题得到你的兴趣结果。您的代码是...

$results2 = new Club; 
$results2->Get_Members_Interests_From_DB($row1['Email']); 

while($row2 = mysqli_fetch_array($results2)) 
{ 
    $interests[] = $row2; 
    echo("<li>" . $row2['InterestDescription'] . "</li>"); 
} 

再次,Get_Members_Interests_From_DB()正在恢复的东西,但你不存储值。如何改为...

$interests = $this->Get_Members_Interests_From_DB($member['Email']); 
foreach ($interests as $interest) 
{ 
    echo '<li>', $interest['InterestDescription'], '</li>'; 
} 
+0

谢谢菲尔。你是冠军! – charlwillia6 2013-05-01 15:40:22

+0

$ myClub =新俱乐部(“localhost”,“A340User”,“Pass123Word”,“info_club”); \t \t \t \t \t \t $ date = date(“Y/m/d”); \t \t \t \t \t \t $ SQL =“INSERT INTO构件 \t \t \t \t \t \t('FirstName','LastName','Gender','Email','MemberSince') \t \t \t \t \t VALUES \t \t \t \t \t \t('$ fname','$ lname','$ gender','$ email','$ date');“; \t \t \t \t \t \t \t $结果= mysqli_query($这 - > CON,$ SQL); – charlwillia6 2013-05-01 15:40:38

+0

这对我刚刚发布的代码有效吗?这是班上的另一个功能。编辑:其实从来没有。现在这个工作正常,我不会去修复它。 – charlwillia6 2013-05-01 15:41:35

1

您不能在他们定义的类之外访问'私人'功能。正如Simon所评论的,您需要将这些功能公开化。

您应该在PHP手册中阅读关于visibility的内容,它会教您如何区分公共,受保护和私有功能。这里有一个简短的例子:

class Example { 

    public function aPublicMethod() 
    { 
     return 'public'; 
    } 

    private function aPrivateMethod() 
    { 
     return 'private'; 
    } 

} 

$example = new Example; 
// $aPublicString will become 'public' 
$aPublicString = $example->aPublicMethod(); 
// error, you cannot see private functions outside of a class 
$aPrivateString = $example->aPrivateMethod(); 
+0

你不明白我在说什么。我试图从课堂内给他们打电话!我正试图在班级中将他们称为公共职务。该功能也必须保持私密,我不能将其改为公开。我不需要阅读能见度手册。我已经有了。 – charlwillia6 2013-05-01 15:18:34

+0

我们深表歉意,从粘贴的代码中我不清楚什么是什么类。 – 2013-05-01 15:22:09

+0

没关系。我只是一直在为此工作了三天,并且无法理解如何让这个工作没有私有函数的参数,只能使用return语句,而且我已经多次阅读了可见性手册和返回信息。我只是不明白。 – charlwillia6 2013-05-01 15:24:31

1

在php7中引入了匿名类。 所有你需要的是创建一个扩展类与私人功能的类。 然后,您可以添加任何功能,并为事件创建私人功能的访问器。您还需要创建一个转换器,将旧类的对象转换为新类的对象,就是这样。

这就是你所需要的。

你可以在没有php7的情况下做到,但是使用php7你可以避免在其他地方创建类定义。使用php7,您可以在一个函数或一个类的方法中进行所有转换。不是很酷吗?