0

データベースからすべての製品を表示する自動テーブルを作成したいと思いました。ここで、その名前をクリックして、製品の詳細全体を表示できます。そして、私の考えでは、別の .php ファイルに移動するのではなく、同じページにとどまり、すべての製品の複数の .php ファイルを作成して時間を無駄にしないようにするというものでした。問題は、製品をクリックするたびに、製品の情報がロードされないことです (ちなみに、唯一の詳細は説明です)。

エラー
致命的なエラー: タイプ mysqli_result のオブジェクトを C:\wamp\www\goldenrod\index.php の 56 行目で配列として使用できません

これはデータベース接続です:

<?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 にかなり慣れていないので、助けていただければ幸いです。

4

1 に答える 1

1

問題はここにあります:

 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た。

于 2016-01-01T18:38:36.143 に答える