0

立ち寄ってくれてありがとう!

学校のプロジェクトで電子商取引のウェブサイトを作ろうとしています。目的は、データベースのコンテンツを Web ページに入力することであり、DB からデータを引き出して Web サイトに表示できるようにするために、1 つの特定の条件が記録されていないようです。

私のメイン ページの 1 つで、サイドバーに次のコードを配置しています。これにより、製品カテゴリに基づいてすべての製品を取得するための php ページが表示されます。

  <ul class="left_menu">
    <li class="odd"><a href="categories.php?catno=10familia">Familia Originals</a></li>
    <li class="even"><a href="categories.php?catno=20familia">Ready to Cook</a></li>
    <li class="odd"><a href="categories.php?catno=30familia">Siomai and Buns</a></li>
    <li class="even"><a href="categories.php?catno=40familia">Pork Snacks</a></li>
    <li class="odd"><a href="categories.php?catno=50familia">Ready Made Dishes</a></li>
  </ul>

(id)catno= を使用して、表示するカテゴリを参照することにより、製品カテゴリに基づいて製品を表示するこのコード/ページがあります。

// Sanitize the $_GET['catno'] and match with the correct category:
$sanitize = mysqli_real_escape_string($dbc, $_GET['catno']);

//match cases according to the product category
if ($sanitize == '10familia') {
$catid = 1;
} elseif ($sanitize == '20familia') {
$catid = 2;
} elseif ($sanitize == '30familia') {
$catid = 3;
} elseif ($sanitize == '40familia') {
$catid = 4;
} elseif ($sanitize == '50familia') {
$catid = 5;
} else {
$cat_error = '<div class="center"><h2>There are no products in this category. Please try again later.</h2></div>';
}
?>
<div class="center_content">
<div class="center_title_bar">Latest Products</div>
<div class="scroll_box_tall">
    <?
    $query = "SELECT product_id, name, price, thumbnail FROM products WHERE category_id = '$catid' ORDER BY product_id ASC";
    $request = mysqli_query($dbc, $query);

    if (mysqli_affected_rows($dbc) == 1) {
        while ($row = mysqli_fetch_array($request, MYSQLI_NUM)) {
            $item_id = $row[0]; // Assign product_id to $item_id to be passed on the href
            $item_name = $row[1]; // Assign name to var $item_name
            $item_price = $row[2]; // Assign price to var $item_price
            $item_thumb = $row[3]; // Assign thumbnail to $item_thumb
            // echo item name
            $div1 = '<div class="prod_box"><div class="top_prod_box"></div><div class="center_prod_box"><div class="product_title">' . $item_name . '</div>';
            // echo the thumbnail
            $div2 = '<div class="product_img"><a href="show_product.php?idno=' . $item_id . '"><img src="product/thumb/' . $item_thumb . '" alt="' . $item_name . '"/></a></div>';
            // echo the price
            $div3 = '<div class="prod_price"><span class="price">RRP &pound; ' . $item_price . '</span></div></div><div class="bottom_prod_box"></div></div>';
            echo "$div1$div2$div3";
        }
    } else { // Say an error message if there is no products in the category or the query is unsuccessful
        echo '<div class="center"><h2>There are no products in this category. Please try again later.</h2></div>';
    } ?>
</div>

if/else の条件は正常に機能しており、製品を取得してページに表示する際に完全に機能します。(categories($catid) 2,3,4,5 - それぞれのリンクがクリックされた場合、正常に動作しています) 私の主な問題は、すべての条件 if/else が最初のものを除いて値を記録することです:

if ($sanitize == '10familia') {
$catid = 1;
}

データベース内のカテゴリ 1 からすべての製品を取得するクエリに対して、値 $catid= 1 が記録されていません。

この特定の条件が機能しない理由はわかりませんが、他の 4 つの同一の機能は機能します。

注: php を開始したばかりで、if-else を実行するためのより良い方法があればお詫びします。if/elseif アプローチで実行しました。

皆さんありがとうございます。:)

4

2 に答える 2

2

mysqli_real_escape_string($dbc,$string)入力時のクリーニング用です。PHP で何かを行う前に、それを使用したくありません。これは特にMySQL専用であるため、DB接続が必要です。

 $catno = $_GET['catno'];

if (それでも問題ありません) の代わりに、次のswitch()ステートメントを使用できます。

switch($catno){

  case '10familia':
    $catid = 1;
  break;

  case '20familia':
    $catid = 2;
  break;

  case '30familia':
    $catid = 3;
  break;

  case '40familia':
    $catid = 4;
  break;

  case '50familia':
    $catid = 5;
  break;

  default:
  $cat_error = '<div class="center"><h2>There are no products in this category. Please try again later.</h2></div>';
  $cat_id=-1;
  echo $cat_error;
}

簡潔にするために、ここではコードの HTML 部分を省略します。

$catnoDB のクエリにも使用していないため、自分で設定した DB の SQL ステートメントに潜在的に挿入されるmysqli_real_escape_string()var () があるため、これを実行する必要はありません。$cat_idただし、これは通常、ユーザーが提供した変数を挿入用に消去する場所です。

次に、その var が正かどうかを確認します。前の var が正しく渡されなかった場合、負になると予想されます。

if($cat_id > -1){

単なる好みとして、テーブルの存在などの単純なことを確認するカウント クエリを取得してから、MySQL に多くのフープをジャンプさせて、結合が途中で失敗するかどうかを確認するのが好きです。これは余分なクエリですが、不適切なステートメントが渡された大規模なクエリのオーバーヘッドを大幅に節約できます。また、クロス テーブルの失敗をあまり追跡していない場合は、探し出すのも簡単です。

$count = mysql_result(mysqli_query($dbc, "select count(*) from products where category_id='$catid'"),0);

if ($count == 1){
$query = "SELECT product_id, name, price, thumbnail FROM products WHERE category_id = '$catid' ORDER BY product_id ASC";
$request = mysqli_query($dbc, $query);
while ($row = mysqli_fetch_array($request)) {

これらで、プルしている列の名前を実際に設定するのが好きです。大きなテーブルに慣れたら、これが役立つので、列 45 が何をするのかを理解する必要はありません。また、あなたと一緒にこれに取り組んだり、プロジェクトを継承したりする可能性のある人々にとって、より簡単になります。

        $item_id = $row['product_id']; // Assign product_id to $item_id to be passed on the href
        $item_name = $row['name']; // Assign name to var $item_name
        $item_price = $row['price']; // Assign price to var $item_price
        $item_thumb = $row['thumbnail']; // Assign thumbnail to $item_thumb
        // echo item name

習慣化すべきことは、div などの後に新しい行を作成することです。これにより、フロント エンドで HTML コードのトラブルシューティングを行うことができます。

        $nl = "\n";

        $div1 = '<div class="prod_box">'.$nl.'<div class="top_prod_box"></div>'.$nl.'<div class="center_prod_box">'.$nl.'<div class="product_title">'.$item_name.'</div>'.$nl;
        // echo the thumbnail
        $div2 = '<div class="product_img"><a href="show_product.php?idno='.$item_id.'"><img src="product/thumb/'.$item_thumb.'" alt="'.$item_name.'"/></a></div>'.$nl;
        // echo the price
        $div3 = '<div class="prod_price"><span class="price">RRP &pound; ' . $item_price . '</span></div>'.$nl.'</div>'.$nl.'<div class="bottom_prod_box"></div>'.$nl.'</div>'.$nl;
        echo "$div1$div2$div3";
    }

} else { // Say an error message if there is no products in the category or the query is unsuccessful
    echo '<div class="center"><h2>There are no products in this category. Please try again later.</h2></div>';
} ?>
于 2013-04-20T02:46:55.043 に答える
0

テストデータに関する情報がないため、推測ですが、これは疑わしいようです:

if (mysqli_affected_rows($dbc) == 1) {

これにより、クエリによって正確に 1 つの行が返されたかどうかが確認されます。テスト データにカテゴリ 2 から 5 の行が 1 つあり、カテゴリ 1 の行が複数ある可能性はありますか? ロジックを次のように変更してみてください。

if (mysqli_affected_rows($dbc) > 0) {
于 2013-04-20T02:19:31.753 に答える