【问题标题】:Dynamic tables within dynamic tables (PHP/MySQL)动态表中的动态表 (PHP/MySQL)
【发布时间】:2013-01-21 17:25:15
【问题描述】:
  1. 我在同一个数据库中有两个 MySQL 表,每个表都有数据。
  2. 我有一个 PHP 结果页面,它显示动态 PHP 表中第一个 MySQL 表的数据。
  3. 第一个 MySQL 表中的一个字段是以逗号分隔的 ID 列表,这些 ID 与第二个 MySQL 表中的数据相关。
  4. 我在第一个动态 PHP 表中有第二个嵌套/嵌入的动态 PHP 表,当行 ID 出现在第一个 MySQL 表的逗号分隔字段中时,它会从第二个 MySQL 表中提取数据。 (即第一个动态 PHP 表中的一个列包含第二个嵌套动态 PHP 表,其中包含来自第二个 MySQL 表的数据

请参阅下面的 PHP/HTML:

<?php
if (!function_exists("GetSQLValueString")) {
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "") 
{
  if (PHP_VERSION < 6) {
    $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
  }

  $theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);

  switch ($theType) {
    case "text":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;    
    case "long":
    case "int":
      $theValue = ($theValue != "") ? intval($theValue) : "NULL";
      break;
    case "double":
      $theValue = ($theValue != "") ? doubleval($theValue) : "NULL";
      break;
    case "date":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
    case "defined":
      $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
      break;
  }
  return $theValue;
}
}

mysql_select_db($database_TravelSite, $TravelSite);
$query_Route = "SELECT * FROM SavedRoutes WHERE RouteCode = '".$_GET['rc']."'";
$Route = mysql_query($query_Route, $TravelSite) or die(mysql_error());
$row_Route = mysql_fetch_assoc($Route);
$totalRows_Route = mysql_num_rows($Route);
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Untitled Document</title>
</head>

<body>
<p>&nbsp;</p>
<p>&nbsp;</p>
<table border="0">
  <tr>
    <td>ID</td>
    <td>StartPoint</td>
    <td>StartPointLatLng</td>
    <td>EndPoint</td>
    <td>EndPointLatLng</td>
    <td>Waypoints</td>
    <td>Name</td>
    <td>Details</td>
    <td>RouteCode</td>
  </tr>
  <?php do { ?>
    <tr>
      <td><?php echo $row_Route['ID']; ?></td>
      <td><?php echo $row_Route['StartPoint']; ?></td>
      <td><?php echo $row_Route['StartPointLatLng']; ?></td>
      <td><?php echo $row_Route['EndPoint']; ?></td>
      <td><?php echo $row_Route['EndPointLatLng']; ?></td>
      <td><p><?php echo $row_Route['Waypoints']; ?></p>
    <?PHP  $string = $row_Route['Waypoints'];
$slashstring = stripslashes($string);
$trimstring = rtrim($slashstring, "', '");
mysql_select_db($database_TravelSite, $TravelSite);
?>
        <p>echo $trimstring = <?PHP echo $trimstring; ?></p>
        <table border="0">
          <tr>
            <td>id</td>
            <td>Lng</td>
            <td>Lat</td>
            <td>Name</td>
          </tr>
          <?php
          mysql_select_db($database_TravelSite, $TravelSite);
$query_Markers = "SELECT * FROM markers WHERE ID IN('".$trimstring."')";
$Markers = mysql_query($query_Markers, $TravelSite) or die(mysql_error());
$row_Markers = mysql_fetch_assoc($Markers);
$totalRows_Markers = mysql_num_rows($Markers);
           do { ?>
            <tr>
              <td><?php echo $row_Markers['id']; ?></td>
              <td><?php echo $row_Markers['Lng']; ?></td>
              <td><?php echo $row_Markers['Lat']; ?></td>
              <td><p>
                <select multiple name="waypoints" id="waypoints">
                  <?php
do {  
?>
                  <option selected value="<?php echo $row_Markers['Lat'] . ", " . $row_Markers['Lng']?>"><?php echo $row_Markers['Lat'] . ", " . $row_Markers['Lng']?></option>
                  <?php
} while ($row_Markers = mysql_fetch_assoc($Markers));
  $rows = mysql_num_rows($Markers);
  if($rows > 0) {
      mysql_data_seek($Markers, 0);
      $row_Markers = mysql_fetch_assoc($Markers);
  }
?>
                </select>
              </p>
                <p><?php echo $row_Markers['Name']; ?></p></td>
            </tr>
            <?php } while ($row_Markers = mysql_fetch_assoc($Markers)); ?>
        </table>
<p>&nbsp;</p></td>
      <td><?php echo $row_Route['Name']; ?></td>
      <td><?php echo $row_Route['Details']; ?></td>
      <td><?php echo $row_Route['RouteCode']; ?></td>
    </tr>
    <?php } while ($row_Route = mysql_fetch_assoc($Route)); ?>
</table>
</body>
</html>
<?php
mysql_free_result($Markers);

mysql_free_result($Route);
?>

现在,当我运行该页面时,会发生以下情况:

  • 如果嵌套表中只有一项(即只有一个 ID 第二个表格出现在第一个表格的逗号分隔字段中 表),然后完美呈现。
  • 但是,如果有多个 ID(即 逗号分隔的字段),然后它将第一项呈现给 无穷大(并使浏览器崩溃)。

我做错了什么?显然,嵌套表不是做我想做的事情的正确方法! n00b 但究竟是什么?

【问题讨论】:

  • 能否提供相关的PHP代码?
  • 请同时提供所需查询结果的方案
  • 好吧,你说得对——与其泛泛而谈,不如说具体更容易——我会编辑原帖

标签: php mysql filter dynamic-tables


【解决方案1】:

从第一个表中删除 fav_food 列,然后添加第三个表 - fav_food:

ID | fav_Food
1  | 2
1  | 4
1  | 5
1  | 12

然后,使用 JOIN 选择 John 最喜欢的所有食物,并附上详细信息:

SELECT *
FROM `fav_food` JOIN `food`
ON `food`.`ID`=`fav_food`.`fav_food`
WHERE `fav_food`.`ID`=1

(使用不同的查询来选择约翰的详细信息)

一般来说,正如您所说,当您可以使用带有 JOIN 的常规表时,嵌套表并不是最好的主意。

【讨论】:

  • 但是在创建最喜欢的食物表时,John 是否必须为他最喜欢的每种食物创建一个新条目?在创建数据时,它基本上是一个复选框(其详细信息输入到逗号分隔的字段中),而不是一个接一个地添加每个收藏夹
  • 不,用户体验将保持不变。您必须将用户的输入存储为数组,然后使用 INSERT INTO ... VALUES(此处为数组)将其传递给数据库。有关这方面的更多详细信息,请参阅手册。
  • 对于如何在同一个按钮下创建两个“插入”功能,您不会有什么聪明的想法吧?似乎无法找到一种方法来做到这一点。尝试将其写入“BEGIN ... ...COMMIT”语句,但这似乎也不起作用。
  • 该按钮应该通过 ajax 或表单操作触发服务器端脚本(php、asp 等)。在那里,您可以接受用户想要的所有变量,并将它们用于任意数量的 INSERTS。
【解决方案2】:

更好的解决方案可能是为 Fav_foods 设置一个单独的表。比如:

ID | UserID | FoodID
 1 |   1    |    2
 2 |   1    |    4
 3 |   1    |    5

这就像:约翰最喜欢的食物是 ID 为 2、4、5、...的食物

【讨论】:

  • 但是在创建最喜欢的食物表时,John 是否必须为他最喜欢的每种食物创建一个新条目?在创建数据时,它基本上是一个复选框(其详细信息输入到逗号分隔的字段中),而不是一个接一个地添加每个收藏夹
  • 是的,每种喜爱的食物都会有一个新条目。你可以做一些小的迭代,一旦 form(?) 提交就添加所有新行。
  • @Kride 这是错误的.. 用户仍然可以勾选框并一次发送他的所有选择。同样将数据插入数据库只需要一个查询,使用 INSERT...VALUES(several values)
猜你喜欢
  • 1970-01-01
  • 2014-06-28
  • 1970-01-01
  • 1970-01-01
  • 2017-11-28
  • 1970-01-01
  • 1970-01-01
  • 2011-12-16
  • 2016-10-25
相关资源
最近更新 更多