我想制作一个自动表格来显示数据库中的所有产品,在那里你可以点击它的名称并查看产品的全部细节。我的想法是,它不会让你看到另一个.php文件,但你仍然会在同一个页面上,这样你就不会浪费时间为每个产品创建多个.php文件。问题是,每当我点击一个产品时,它都不会加载该产品的信息(顺便说一句,唯一的细节是描述)。
错误
致命错误:无法在第56行的C:\wamp\www\goldenrod\index.php中将mysqli_result类型的对象用作数组
这是数据库连接:
<?php
//Database Connections
$dbc = mysqli_connect('localhost', 'root', '', 'lionsierra_db') or die("Cannot find specified server");
//Product Database
$db_products = "SELECT * FROM `products`";
$products = mysqli_query($dbc, $db_products);
?>
这就是功能:
<?php
//View product
if(isset($_GET['view_product'])) {
while($product=mysqli_fetch_assoc($products)) {
$products['ID'] = $_GET['view_product'];
//Display a product
echo "<p><span>
<span style='font-weight:bold;'>" . $products['ID']['name'] . "</span><br/>
<span>$" . $products['ID']['price'] . "</span><br/>
<span>" . $products['ID']['category'] . "</span><br/>
<span>" . $products['ID']['description'] . "</span>
</p>";
}
}
//View all products
echo '<table width="600" border="1" cellpadding="1" cellspacing="1">
<tr>
<th>Name</th>
<th>Price</th>
<th>Category</th>
</tr>';
while($product=mysqli_fetch_assoc($products)) {
echo "<tr>
<td><a href='./index.php?view_product=" . $product['ID'] . "'>". $product['name'] . "</a></td>
<td>" . $product['price'] . "</td>
<td>" . $product['category'] . "</td>
</tr>";
$ID = $product['ID'];
}
?>
我对PHP和SQL还很陌生,如果你们能帮我,我将不胜感激。
问题存在于此处:
if(isset($_GET['view_product'])) {
while($product=mysqli_fetch_assoc($products)) {
看起来您只是在这里重新使用MySQLI
查询。相反,您应该根据productID
来更改查询。让我们看看它是什么样子的:
if(isset($_GET['view_product'])) {
//now let's build out our query
$view_product_statement = mysqli_prepare($conn, "SELECT * FROM products WHERE ID = ?");
mysqli_stmt_bind_param($view_product_statement, 'i', $_GET['view_product']);
mysqli_stmt_execute($view_product_statement);
mysqli_stmt_bind_result($view_product_statement);
while($product=mysqli_fetch_assoc($view_product_statement)){
//now $product holds reference to the one we're trying to view.
}
mysqli_stmt_close($view_product_statement);
}
我在上面的文章中使用了prepared statements
来帮助净化用户输入,从而避免使用SQL Injection
。