感谢您的光临!
我正在为我的学校项目做一个电子商务网站。目的是使用数据库中的内容填充我的网页,并且似乎没有记录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 £ ' . $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工作正常,可以很好地检索产品并在页面上显示。 (类别($ catid)2,3,4,5 - 如果点击各自的链接,则工作正常)我的主要问题是所有条件if / else记录除第一个之外的值:
if ($sanitize == '10familia') {
$catid = 1;
}
没有为查询记录值$ catid = 1以从数据库中的类别1中提取所有产品。
我不知道为什么这个特定的条件不会起作用,但其他四个相同的条件都有效。
注意:我刚开始使用php而且我很抱歉,如果有更好的方法来执行if-else,我会使用if / elseif方法。
谢谢大家。 :)
答案 0 :(得分:2)
mysqli_real_escape_string($dbc,$string)
用于清理输入。你不想在用PHP做任何事情之前使用它。它专门针对MySQL,这就是它需要数据库连接的原因。
$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部分。
由于我们甚至没有使用$catno
来查询数据库,因此我们现在有一个可能插入的var(mysqli_real_escape_string()
),因此无需在其上执行$cat_id
到我们自己设置的数据库的SQL语句中。这通常是您清理任何用户提供的vars以进行插入的地方。
现在我们要看看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 £ ' . $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>';
} ?>
答案 1 :(得分:0)
只是猜测,因为没有关于您的测试数据的信息,但这看起来很可疑:
if (mysqli_affected_rows($dbc) == 1) {
这将检查查询是否返回恰好一行。是否有可能您的测试数据对于类别2到5有一行而对于类别1有多行?尝试将逻辑更改为:
if (mysqli_affected_rows($dbc) > 0) {