我正在使用PHP开展项目。我有一个php页面,在网页中显示两行单行。而数据库表中没有重复数据。 Plz帮帮我!!!!! 这是两个表和PHP代码...
maincat_desktop -------------------- maincat_id maincat_nm 1 Desktop 2 Leptop
**subcat_desktop** -------------------- subcat_id maincat_id subcat_nm1 subcat_disc subcat_amt subcat_prod_img subcat_nm 1 1 Acer123 ABCEDFG 25000 NULL Acer 2 1 Dell123 ABCEDFG 8000 NULL Dell 3 1 ompaq123 ABCEDFG 12000 NULL Compaq 4 1 Lenovo123 ABCEDFG 32000 NULL Lenovo 5 1 HP123 ABCEDFG 18000 NULL HP 6 1 Toshiba123 ABCEDFG 45000 NULL Toshiba
<html>
<?php
$query = mysql_query("select c.maincat_nm,c.maincat_id,s.subcat_nm1,s.subcat_disc,s.subcat_id,s.subcat_amt,s.subcat_prod_img from maincat_desktop c, subcat_desktop s where s.subcat_nm like '%Acer%'");
while ($row = mysql_fetch_array($query))
{
if(mysql_affected_rows()<0)
{
echo "No data found";
}
else
{
echo "<table border=0 width=80% style='border-bottom:1px solid grey' align=center>";
echo "<tr height='80px'>";
echo "<td rowspan=20 width='80px'><img src='admin/upload/".$row['subcat_prod_img']."' width='70' heigth='70' style='vertical-align:middle'>";
echo "</td>";
echo "<td>";
echo "<a href='acer_desktop_discription.php?subcat_id=$row[subcat_id]' style=color:blue><b>".$row['subcat_nm1']."</b></a>";
echo "</td>";
echo "</tr>";
echo "</table>";
}
}
echo "<br>";
?> </html>
答案 0 :(得分:3)
修改选择
select c.maincat_nm,c.maincat_id,s.subcat_nm1,s.subcat_disc,s.subcat_id,s.subcat_amt,s.subcat_prod_img from maincat_desktop c, subcat_desktop s where c.maincat_id=s.maincat_id and s.subcat_nm like '%Acer%'
一点解释:当你从table1中选择table2时,它就像table1内连接table2 所以你必须提到一个附加条款
答案 1 :(得分:2)
值得注意的问题:
a)您的查询不正确。您正在进行连接操作(从多个表中进行选择),但未指定如何关联表。因此MySQL正在进行笛卡尔联接,它会产生所有可能的结果,然后您可以使用'like'子句进行一些小的过滤。你应该:
SELECT
c.maincat_nm, c.maincat_id, s.subcat_nm1, s.subcat_disc, s.subcat_id, s.subcat_amt, s.subcat_prod_img
FROM
maincat_desktop c, subcat_desktop s
WHERE
(c.maincat_id = s.parent_cat_id) AND (s.subcat_nm like '%Acer%');
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -- the join clause
如果您有10个maincats和50个子类,则笛卡尔连接将生成500个候选行,然后将其缩减为subcat_nm
包含'Acer'的行 - 在您的情况下,这是两行。通过指定显式连接子句,可以强制MySQL仅考虑实际存在主/子关系的主要猫/子猫。
b)在尝试获取之前,您必须检查是否有任何结果行:
$results = mysql_query(...) or die(mysql_error());
if (mysql_num_rows($results) == 0) {
echo "No results";
} else {
while($row = mysql_fetch_assoc($results)) {
...
}
}
此外,mysql_affected_rows()
用于插入/更新查询。 mysql_num_rows()
用于选择查询,并告诉您可以提取多少行。这将始终为0或更多 - MySQL查询结果将从不返回负数行。它是0(没有行),正数( 1行或更多行)或布尔FALSE
(错误发生 )。
答案 2 :(得分:1)
有几件事是错的,但最重要的是你选错了。您正在从maincat_desktop
中选择多个“列”,但选择所有行(因此,该表没有where
- 子句)并且您也从subcat_desktop
中选择一个(这个是有限的)。由于您的maincat_desktop
表中有两行,因此您可以获得两次结果。您应该使用 Greenisha 查询(或 Marc B 以更好地了解笛卡尔联接)。
此外,您使用的mysql_affected_rows()
不在此处工作,您可以说mysql_num_rows()
。更重要的是 mysql_num_rows()
错误的地方。如果没有结果,则无法进入while循环,并且您将收到错误(没有显示任何内容),表示您没有数据,您需要执行以下操作:
if(mysql_num_rows() > 0)
{
while(...)
{ /* normal code */ }
}
else
{
// No results;
}
如果你修复了这些错误,你应该留下一个只显示一行的工作代码。
答案 3 :(得分:0)
mysql_affected_rows()
用于插入/更新操作。使用mysql_num_rows()
。另外,当没有结果时,这将是= 0而不是&lt; 0.你应该在进入循环之前做if。所以先检查mysql_num_rows()
,然后再进行获取。在执行查询后,检查结果是否为FALSE
(如果是这种情况,请检查mysql_error()
以获取错误)。