我第一次使用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>
非常感谢任何帮助。
答案 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)
您需要检查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
周围看到单引号。
这会阻止数据库正确查询它。我遇到了同样的问题,这解决了它。