2

私は、ウェブサイトにPHPを使用して簡単なeコマースエンジンを構築するための小さな大学の課題に取り組んでいます。

現在、カテゴリ内の製品を表示するために次のスクリプトを設定しています。これらはすべてMySQLデータベースから取得されます。

http://example.com/category.php?id=2

私が現在抱えている問題は、表示されている各製品について、スクリプトがそれぞれを並べて新しいテーブルエントリにエコーしているだけであるということです。これにより、垂直方向ではなくページを横切って移動します。

このコードを変更して、たとえば行ごとに最大3つの製品を含めるための最良の方法は何でしょうか。それらの線に沿ったIfループまたは何か?サポートをいただければ幸いです!

<?php

//Create Session
   session_start();

//Connect to database
   include "conn.php";

//Retrieve Header
   include "header.php";

//Get Category ID 
if (isset($_GET['id'])){
    $CategoryID = $_GET['id'];

//QUERY collects product name, and product ID.
    $q="SELECT ProductID, ProductName, Price,img FROM Products WHERE CategoryID=$CategoryID";

//QUERY collects Product Category descriptions
    $d="SELECT `Desc` FROM ProductCategories WHERE CategoryID=$CategoryID";

//retrive and execute SQL query results and save into a variable
    $result = mysqli_query($_SESSION['conn'],$q);
    $result2 = mysqli_query($_SESSION['conn'],$d) or die(mysql_error());

//Retrieve Product Category Description
    echo "<div>";
    while ($myResult = mysqli_fetch_row($result2)){ //Create an array
        echo "<p>".$myResult[0]."</p>";
    }
    echo "</div>";

//Retrieve Products in category
    echo "<div align='center'><table border='1px' bordercolor='#000000' width='200px'><tr>"; //Define table, row and div containing each product

    while ($row = mysqli_fetch_row($result)){ //Create an array

        echo "<td>"; //Create table cell
        echo "<p><img src=".$row[3]."></p>"; //product image small (250x250 Pixels)
        echo "<p  align='center'><a href='product.php?id=".$row[0]."'>".$row[1]." </a></p>"; //Product ID Link and Name
        echo "<p align='center'>&#163; ".$row[2]."</p>";
        echo "</td>"; //Close table cell
    }
    echo "</tr></table></div>";//Close table, div and row
    mysqli_free_result($result);
}

// Retireve Footer
include "footer.php";
?>

私はどんな種類のプログラミングに関しても新しいので、あなたが私に与えることができる忍耐/どんなサポートにも感謝します。また、SQLインジェクションの問題を認識しており、後日修正する予定です。

4

4 に答える 4

5

while イテレーションをカウンターで追跡し、ヒットするたびに$counter%3 === 0(3 を行ごとに必要なものに置き換えます)、 を閉じてtr新しいものを開始します。

$counter = 0;
$perRow = 3;
while ($row = mysqli_fetch_row($result)){ //Create an array
    if($counter === 0) {
        echo '<tr>';
    } else if ($counter%$perRow === 0 ) {
        echo '</tr><tr>';
    }
    echo "<td>"; //Create table cell
    echo "<p><img src=".$row[3]."></p>"; //product image small (250x250 Pixels)
    echo "<p  align='center'><a href='product.php?id=".$row[0]."'>".$row[1]." </a></p>"; //Product ID Link and Name
    echo "<p align='center'>&#163; ".$row[2]."</p>";
    echo "</td>";
    $counter++;
}
于 2013-03-12T14:37:55.663 に答える
2

どうぞ

while ($row = mysqli_fetch_row($result)){ //Create an array

    echo "<tr><td>"; //Create table cell
    echo "<p><img src=".$row[3]."></p>"; //product image small (250x250 Pixels)
    echo "<p  align='center'><a href='product.php?id=".$row[0]."'>".$row[1]." </a></p>"; //Product ID Link and Name
    echo "<p align='center'>&#163; ".$row[2]."</p>";
    echo "</td></tr>"; //Close table cell
}
echo "</table></div>";//Close table, div and row

trは行であるため、TRはしばらくの間中にある必要があります

于 2013-03-12T14:36:07.863 に答える
2

テーブルと反復カウンターを使用して、昔ながらの方法でそれを行うことができます。より CSS ベースのアプローチを使用することもできます。

結果セットをループし、内側の HTML 部分 (行、列) を構築します。

$rows = '';
while ($myResult = mysqli_fetch_row($result2)){ //Create an array
    $rows .= '<div class="inner">'.$myResult[0].'</div>';
}

内側の列 x の幅を決めて左右にフロートさせます. そして外側の div の幅を x にします.

<style type="text/css">
div.box {
  width:900px;
}

div.inner {
  float:left;
  width:300px;
}
</style>

そして最後にHTMLをエコーし​​ます

<div class="box"><?php echo $rows; ?></div>
于 2013-03-12T14:45:12.817 に答える
1

必要なのは、現在の位置を追跡することです。行ごとに3列が必要な場合は、次のようになります。

$count = 1;

echo '<table>';

while ($row = mysqli_fetch_row($result)) {
  $tmp = $count % 3; //get the remainder

  if ($tmp==1) {
    if ($count!=1) {
      //not the first row so close the last one
      echo "</tr>";
    }

    //start row
    echo "<tr>";
  }

  //show your <td> info

  $count++;
}
echo '</tr></table>';
于 2013-03-12T14:42:55.317 に答える