- I have two MySQL tables in the same database, each with data.
- I have a PHP results page that shows the data from the first MySQL table in a dynamic PHP table.
- One of the fields in the first MySQL table is a comma-separated list of IDs that relate to data in the second MySQL table.
- I have a second, nested/embedded dynamic PHP table within the first dynamic PHP table that pulls the data from the second MySQL table when the row ID appears in the comma-separated field of the first MySQL table. (i.e. one of the columns in the first dynamic PHP table contains the second, nested dynamic PHP table with data from the second MySQL table
See the PHP/HTML below:
<?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> </p>
<p> </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> </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);
?>
Now, when ever I run the page the following happens:
- If there is only one item in the nested table (i.e. only one ID from
the second table appears in the comma-separated field of the first
table), then it renders perfectly. - However, if there is more than one (i.e. multiple IDs in the
comma-separated field), then it renders the first item out to
infinity (and crashes the browser).
What am I doing wrong? Clearly, nested tables is not the right way of doing what I am trying to do! n00b But what is?
Remove the fav_food column from the first table, then add a 3rd table – fav_food:
Then, use a JOIN to select all of John’s favorite foods, with details:
(use a different query to select John’s details)
In general, as you said, nested tables is not the best idea when you can use a regular table with JOIN.