2013-07-19 94 views
0

我的工作在PHP和MySQL的第一次。我遇到了mysqli的问题,我无法弄清楚我做错了什么。mysqli的错误FETCH_ASSOC()

我得到其中您可以查看这里的错误:http://www.polancophp.com/polanco-oop.php

Fatal error: Call to a member function fetch_assoc() on a non-object in E:\HostingSpaces\jacobspd\polancophp.com\wwwroot\polanco-oop.php on line 37 

下面是代码:

<?php 
class Member { 

    public $memberid; 
    public $businessname; 
    public $username; 
    public $email; 
    public $memberurl; 
    public $addr1; 
    public $addr2; 
    public $city; 
    public $state; 
    public $country; 
    public $postalcode; 
    public $domain; 
    public $firstname; 
    public $lastname; 

    public function __construct($InMemberID) 
    { 
     $this->get_data($InMemberID); 
    } 

    public function get_data($InMemberID){ 
     $connect_str = new mysqli('xxx','xxx','xxx','xxx'); 

     /* check connection */ 
     if (mysqli_connect_errno()) { 
      printf("Connect failed: %s\n", mysqli_connect_error()); 
      exit(); 
     } 

     $query_str = 'SELECT * FROM members WHERE MemberID = $InMemberID'; 
     $result = $connect_str->query($query_str); 
     echo $result; 

     while (($row = $result->fetch_assoc()) !== null) { 
      $businessname = $row["BusinessName"]; 
      $username = $row["UserName"]; 
      $email = $row["LoginEmail"]; 
      $memberurl = ""; 
      $addr1 = $row["Address1"]; 
      $addr2 = $row["Address2"]; 
      $city = $row["City"]; 
      $state = $row["State"]; 
      $country = $row["Country"]; 
      $postalcode = $row["PostCode"]; 
      $domain = "polancophp.com"; 
      $firstname = $row["FirstName"]; 
      $lastname = $row["LastName"]; 
     } 

     /* close connection */ 
     mysqli_close($connect_str); 
    } 

    public function get_member_url(){ 
     echo $this->domain.'/'.$this->memberurl; 
    } 

    public function get_member_email(){ 
     echo $this->email; 
    } 

    public function get_member_address(){ 
     echo $this->addr1.' '.$this->city.', '.$this->state.' '.$this->country.' '.$this->postalcode; 
    } 

    public function get_member_fullname(){ 
     echo $this->firstname.' '.$this->lastname; 
    } 

} 
$Member = new Member(2); 
?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
<head> 
<title>Polanco's First Object Orientated Programming</title> 
<link rel="stylesheet" type="text/css" href="common.css" /> 
<style type="text/css"> 
.pll {padding-left:10px} 
</style> 
</head> 
<body> 
<h1>Member Details</h1> 
<table cellspacing="0" cellpadding="0" border="0"> 
    <tr> 
    <td>Name:</td> 
    <td class="pll"><?php $Member->get_member_fullname(); ?></td> 
    </tr> 
    <tr> 
    <td>Email:</td> 
    <td class="pll"><?php $Member->get_member_email(); ?></td> 
    </tr> 
    <tr> 
    <td>Profile URL:</td> 
    <td class="pll"><a href="<?php $Member->get_member_url(); ?>"><?php $Member->get_member_url(); ?></a></td> 
    </tr> 
    <tr> 
    <td>Profile Address:</td> 
    <td class="pll"><?php $Member->get_member_address(); ?></td> 
    </tr> 
</table> 
</body> 
</html> 

任何帮助将不胜感激。

+1

错误提示$ result不是mysqli_result,它通常意味着查询失败。尝试使用mysqli_error()打印错误,看看你是否得到了:'$ result = $ connect_str-> query($ query_str)或者die('Error:'。$ connect_str-> error());' – 3ventic

+4

感谢分享你的mysql登录凭证。您可能想要更改您的服务器上的**现在** ... –

+0

我已更改服务器凭据.. :) – neojakey

回答

2
while (($row = $result->fetch_assoc()) !== null) { 
     $businessname = $row["BusinessName"]; 

当您这样做时,您将数据库结果分配给称为$businessname的局部变量;这与班级的属性不一样。您需要将其指定为:

while (($row = $result->fetch_assoc()) !== null) { 
     $this->businessname = $row["BusinessName"]; 

而且 - 你再生里面get_data数据库连接;这将是更有效的,当你创建对象创建连接,并连接变量分配给类中的一个私有变量,因此您可以在每次运行查询时引用相同的连接。

+0

非常感谢您的帮助..! – neojakey

+0

不错,很好。但是,这是否会解释'致命错误:调用一个成员函数fetch_assoc()在一个非对象...在第37行?似乎错误将来自'$ result-> fetch_assoc()',其中$ result不是结果集对象。 – spencer7593

+0

@ spencer7593 - 再看一遍,我不确定。我想这是因为正在创建的查询无效,因为字段值没有被填充,并且这是该答案修复的问题。另一方面,再看一遍,它的fetch_assoc在这个代码之前运行,所以它可能不会修复它。在握紧的手中,OP接受了这一点,所以推测其有所帮助。基本上 - 我不知道:) – andrewsi

2

您的查询失败使$result实际上是虚假的,而不是一个MySQL的结果对象。你可以用这样的东西检查你的错误。

if(!$result) { 
    echo $connect_str->error; 
    die(); 
} 

你真的不应该设置你的对象内的连接,应在整个应用程序的某个地方进行处理。

2

mysqli_query()返回如果有任何SQL错误,并且致命PHP的错误造成当您尝试调用一个值FETCH_ASSOC()方法。

您需要检查query()返回错误,每次运行您都会查询。如果返回,报告错误并不会尝试使用这一结果。

同时请确保该变量是插值到您的SQL字符串之前,一个适当的整数,你很容易受到经典的安全攻击。见How to prevent SQL injection in PHP?

​​
2

最有可能的解释是,$result不是一个结果集。这可能是因为查询失败,并且没有创建结果集。

进行调试本,关于执行查询之前尝试的

echo "query text=".$query_str; 

如何。这将显示查询被发送到MySQL(如果连接有效)。

执行查询后,检查它是否成功。 (如果查询失败,查询方法返回FALSE。)

这不是写这个的最佳方式,但是这应该给你需要做的事情的想法:

if ($result == false) { 
    echo "query failed: ".$connect_str->error; 
} else { 
    //continue 
0

对于查询,你应该把:

$query_str = "SELECT * FROM members WHERE MemberID = '$InMemberID'"; 

您看到单引号$InMemberID。 这阻止了数据库正确查询它。我遇到了同样的问题,并解决了这个问题。