我有一个简单的php脚本,它可以执行两次简单的SQL查询。查询第一次运行良好,但第二次出现错误;
注意:在第48行的C:''apache''localhost''www''study.kg''webstore''web_store.php中尝试获取非对象的属性
致命错误:在第80行的C:''apache''localhost''www''study.kg''webstore''web_store.php中的非对象上调用成员函数free()
首先,我们对"categories"表进行查询。一切都很好。其次,我们对"鞋"表进行同样的查询。一切都很糟糕,因为
$query = "SELECT * FROM shoes";
$result = $db->query($query);
返回FALSE
值。
但为什么呢?第一次它运行得很好。如果你指的是编码等,这些表是一样的。所以,正如你所猜测的,我的第一个表完美地显示了自己,第二个表根本没有显示任何数据。这是一个完整的片段。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Лабораторная: интернет-магазин обуви</title>
</head>
<body>
<?php
@$db = new mysqli('localhost', 'dzhakipov', 'asd12345', 'webshop');
if (mysqli_connect_errno()) {
echo 'Error: could not connect to database. Please try again later.';
exit;
}
$query = "SELECT * FROM categories";
$result = $db->query($query);
$num_results = $result->num_rows;
?>
<table>
<tr>
<td>id</td>
<td>Название</td>
<td>Описание</td>
<td>Поставщик</td>
<td>Продавец</td>
<td>Адрес склада</td>
</tr>
<?php
for ($i = 0; $i < $num_results; $i++) {
$row = $result->fetch_assoc();
echo "<tr>";
echo "<td>" .stripslashes($row['id']). "</td>";
echo "<td>" .htmlspecialchars(stripslashes($row['name'])). "</td>";
echo "<td>" .stripslashes($row['description']). "</td>";
echo "<td>" .stripslashes($row['supplier']). "</td>";
echo "<td>" .stripslashes($row['salesman']). "</td>";
echo "<td>" .stripslashes($row['storage_address']). "</td>";
echo "</tr>";
}
echo "</table>";
$query = "SELECT * FROM shoes";
$result = $db->query($query);
$num_results = $result->num_rows; // LINE 48 #############################
?>
<table>
<tr>
<td>id</td>
<td>categoryid</td>
<td>Название</td>
<td>Пол</td>
<td>Размер</td>
<td>Сезон</td>
<td>Внешний материал</td>
<td>Внутренний материал</td>
<td>Цвет</td>
<td>Описание</td>
</tr>
<?php
for ($i = 0; $i < $num_results; $i++) {
$row = $result->fetch_assoc();
echo "<tr>";
echo "<td>" .stripslashes($row['id']). "</td>";
echo "<td>" .stripslashes($row['categoryid']). "</td>";
echo "<td>" .htmlspecialchars(stripslashes($row['name'])). "</td>";
echo "<td>" .stripslashes($row['sex']). "</td>";
echo "<td>" .stripslashes($row['size']). "</td>";
echo "<td>" .stripslashes($row['season']). "</td>";
echo "<td>" .stripslashes($row['inner_material']). "</td>";
echo "<td>" .stripslashes($row['outer_material']). "</td>";
echo "<td>" .stripslashes($row['colour']). "</td>";
echo "<td>" .stripslashes($row['price']). "</td>";
echo "</tr>";
}
echo "</table>";
$result->free(); // LINE 80 #############################
$db->close();
?>
</body>
</html>
感谢关注。
请参阅http://php.net/manual/en/function.mysql-free-result.php在第二次使用结果之前。
您也可以将第二个$result更改为$result2以使其工作。
在查询第二个之前,我会尝试释放第一个结果
$result->free();
$query = "SELECT * FROM shoes";
$result = $db->query($query);
其次,虽然我不熟悉mysqli(这里是PDO的铁杆粉丝),但我认为查询可能会导致false,所以应该将遍历结果封装在if块中。
if($result) {
$num_results = $result->num_rows;
...
$result->free();
}
当您将MySQL查询作为字符串存储在$query变量中时,php现在需要使用mysqli_query()来执行此查询,它将从DB 中检索数据