mysqli错误fetch_assoc()

时间:2013-07-19 18:22:51

标签: php mysql mysqli

我第一次使用PHP和MySQL工作。我遇到了mysqli的一个问题,我无法弄清楚我做错了什么。

我收到的错误您可以在此处查看:http://www.polancophp.com/polanco-oop.php OR

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>

非常感谢任何帮助。

5 个答案:

答案 0 :(得分:2)

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

执行此操作时,您将数据库结果分配给名为$businessname的局部变量;这与类的属性不同。您需要将其指定为:

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

此外 - 您正在重新生成get_data内的数据库连接;在创建对象时创建连接会更有效,并将连接变量分配给类中的私有变量,这样每次运行查询时都可以引用相同的连接。

答案 1 :(得分:2)

您的查询失败,因此$result实际上是false而不是mysql结果对象。您可以通过类似的方式检查错误。

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

你真的不应该在你的对象中建立你的连接,这应该在整个应用程序的某个地方处理。

答案 2 :(得分:2)

如果出现任何SQL错误, mysqli_query()将返回 false ,并且当您尝试在 false 值上调用fetch_assoc()方法时会导致致命的PHP错误。

您需要检查query()是否返回错误,每次运行查询。如果它返回 false ,请报告错误,不要尝试使用该结果。

另外,在将变量插入SQL字符串之前,请确保变量是一个正确的整数,您很容易受到经典的安全攻击。见How to prevent SQL injection in PHP?

$InMemberID = (int) $InMemberID;
$query_str = 'SELECT * FROM members WHERE MemberID = $InMemberID';
if (($result = $connect_str->query($query_str)) === false) {
  trigger_error($connect_str->error, E_USER_ERROR);
  die();
}

答案 3 :(得分:2)

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

要进行调试,请尝试

echo "query text=".$query_str;

在执行查询之前。这将显示发送到mysql的查询(如果连接有效。)

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

这不是写这篇文章的最好方法,但这可以让你知道需要做什么:

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

答案 4 :(得分:1)

对于查询,您应该输入:

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

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