Php 使用subrow在表中显示mysql结果?

Php 使用subrow在表中显示mysql结果?,php,html,mysql,Php,Html,Mysql,我想我可能是一时糊涂。我在mysql中有两个带有公共字段的表。我想在一个表中显示一条记录,该表中有一行或一个列表,其中列出了公共字段所共有的所有记录 详细地说,我有一张带有图像的纱线表和一张带有图像的图案表。我想在一行中显示图案及其信息,然后在其下显示所有纱线图像,这些图像与子行中的公共重量字段相匹配 我还通过复选框组选择图案的颜色和类别 这是我的复选框组 这是我迄今为止的查询和显示结果表。我将所有图像名称保存在mysql表中,并链接到一个路径 extract($_GET); $query

我想我可能是一时糊涂。我在mysql中有两个带有公共字段的表。我想在一个表中显示一条记录,该表中有一行或一个列表,其中列出了公共字段所共有的所有记录

详细地说,我有一张带有图像的纱线表和一张带有图像的图案表。我想在一行中显示图案及其信息,然后在其下显示所有纱线图像,这些图像与子行中的公共重量字段相匹配

我还通过复选框组选择图案的颜色和类别

这是我的复选框组

这是我迄今为止的查询和显示结果表。我将所有图像名称保存在mysql表中,并链接到一个路径

extract($_GET);

$query = "(SELECT tblPatterns.PatternName, tblPatterns.Needlesize, tblPatterns.FinishedSize, tblPatterns.YardageNeeded, tblPatterns.PatternImage, tblYarn.YarnImage FROM tblYarn, tblPatterns WHERE tblYarn.WeightCategory=tblPatterns.WeightCategory && Color IN ('" . implode("','",$color) . "') && Category IN ('" . implode("','",$pattcat) . "') ORDER BY `tblPatterns`.`PatternName` ASC)" ;
$result = mysql_query($query) or die('Query failed: ' . mysql_error());

// Printing results in HTML
echo "<table border='1'>\n";
while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {
echo "\t<tr>\n";
foreach ($line as $col_value) {
echo "\t\t<td>$col_value</td>\n";
 }
echo "<td><img src=./images/$col_value width='150' height='150' border='3' ></td>";


echo "\t</tr>\n";
}
echo "</table>\n";

我想我可能不得不将foreach$行更改为$colu value部分。有没有一种方法可以构建一个表并准确地选择哪些数据去哪里以及是否重复?与行下重复的纱线及其对应图案数据的图像一样?

您需要将tblPatterns与tblYarn连接起来:


此外,图像TD位于foreach之外,因此它不会在前面循环$col_值。

我认为这就是您想要的:

$last_pattern = null;
while ($line = mysql_fetch_assoc($result, MYSQL_ASSOC)) {
  $col_count = count($line) - 1; // Subtract 1 because image isn't in a column
  if ($line['PatternName'] !== $last_pattern) {
    if ($last_pattern !== null) {
      echo "</td></tr>\n";
    }
    echo "<tr>\n  ";
    foreach ($line as $col_name => $col_value) {
      switch ($col_name) {
      case 'YarnImage':
        break;
      case 'PatternImage':
        echo "<td><image src='images/$col_value' /></td>";
        break;
      default:
        echo "<td>$col_value</td>";
      }
    }
    $last_pattern = $line['PatternName'];
    echo "</tr>\n  <tr><td colspan='$col_count'>\n";
  }
  $yarn_image = $line['YarnImage'];
  echo "    <img src='images/$yarn_image' width='150' height='150' border='3'/>\n";
}
if ($last_image !== null) {
  echo "</td></tr>";
}

为了代码的安全,请使用类似PDO的东西来降低代码的可注入性。就目前而言,这是在乞求有人做sql注入。哇。。。提取$\u-GET;我是个学生,所以请原谅我,我不是已经通过从tblPatterns,tblYarn中选择加入了tblPatterns和tblYarn吗?现在我没有得到图案的图像,每个纱线图像都有图案信息的重复记录。这仍然会给我每个纱线图像的每个图案的重复记录,我会得到一个mysqlresults列表,然后在每个下面有一个断开的图像。我真的不知道你的数据是什么。我假设PatternImage列是images目录中包含要显示的图像的文件名。也许它应该使用tblYarn.YarnImage。这些是文件名吗?您是说它不应该为查询返回的每一行显示一个表行,因为表行中有多个具有相同值的图像?所以你想把所有的图片合并到一个表行中,所有的图片都在下面?应该使用哪些列来确定它们是否相同,或者必须比较除映像之外的所有列?是的,tblPatterns.PatternImage和tblYarn.YarnImage都是文件名。它们现在都存储在/images目录中。我想将PatternImage与来自tblPatterns的所有其他信息一起显示,然后通过公共字段WeightCategory将其绑定到下面,我想将YarnImage显示为一行。每当PatternName更改时,它都会打印一行,其中包含值和PatternImage。在下面,它显示一行,其中包含该模式名称的所有码。
$last_pattern = null;
while ($line = mysql_fetch_assoc($result, MYSQL_ASSOC)) {
  $col_count = count($line) - 1; // Subtract 1 because image isn't in a column
  if ($line['PatternName'] !== $last_pattern) {
    if ($last_pattern !== null) {
      echo "</td></tr>\n";
    }
    echo "<tr>\n  ";
    foreach ($line as $col_name => $col_value) {
      switch ($col_name) {
      case 'YarnImage':
        break;
      case 'PatternImage':
        echo "<td><image src='images/$col_value' /></td>";
        break;
      default:
        echo "<td>$col_value</td>";
      }
    }
    $last_pattern = $line['PatternName'];
    echo "</tr>\n  <tr><td colspan='$col_count'>\n";
  }
  $yarn_image = $line['YarnImage'];
  echo "    <img src='images/$yarn_image' width='150' height='150' border='3'/>\n";
}
if ($last_image !== null) {
  echo "</td></tr>";
}