thoomaas
Goto Top

MySQL - Join

Hallo alle zusammen!

Ich habe zwei Tabellen in meiner Datenbank. Die eine beinhaltet Teams und einen Code zum Team und die andere beinhaltet Adressen und Informationen. In Zukunft soll über die Webapp ein Standort hinzugefügt werden und dem einem oder mehreren Teams zugeordnet werden.

Um die Suche möglichst komfortabel zu gestalten soll es zwei Formularfelder geben, eins um ein Team bzw. einen Code zu suchen und eines um die Straße zu suchen (Anzeige von Teams an diesem Standort).

Das erste funktioniert, die Straßensuche jedoch nicht.

Hier einmal mein Code.

view_team.php
<?php
	session_start();
	include ('config.php');  
	$_Session['site'] = "view_team.php";  
	if ($maintenance == 'true'){  
		include('maintenance.php');  
	}
	else{
?>
	<html>
		<head>
		<title><?php echo $webapp; ?> | Teamübersicht</title>
		</head>
		<body onload="initialize();codeAddress()">  
		<?php 
			include('header-m.php');  
		?>
		<div id="container">  
				<div class="row">  
				<?php
					include('search.php');  
				?>
					<div class="col s8 offset-s2">  
						<ul class="collapsible" data-collapsible="accordion">  
		<?php
					$searchoe = '';  
					$searchoe = $_GET['searchoe'];  
					$searchadd = '';  
					$searchadd = $_GET['searchadd'];  
					$ausgabeAnzahl = "SELECT count(nummer) AS anzahl FROM `team5-kundendb`.teams";  
					$db_ergAnzahl = mysql_query($ausgabeAnzahl);
					$anz = mysql_fetch_array($db_ergAnzahl, MYSQL_ASSOC);
					$anzahlDatensaetze = $anz['anzahl'];  
					
					$ausgabe = "SELECT * FROM `team5-kundendb`.teams WHERE nummer LIKE '%".$searchoe."%' OR name LIKE '%".$searchoe."%'";  
					$db_erg = mysql_query($ausgabe);
					if (!$db_erg){
						die(mysql_error());
					}
					if($anzahlDatensaetze > 0){
						while ($td = mysql_fetch_array($db_erg, MYSQL_ASSOC)){
							echo "<li>";  
								echo "<div class='collapsible-header'><b>";  
									echo $td['nummer']."</b> - ".$td['name'];  
								echo "</div>";  
								#echo $ausgabe;
								
								$aussenstelle = "SELECT * FROM `team5-kundendb`.aussenstelle WHERE teamnummer LIKE '".$td['nummer']."' AND strasse LIKE '%".$searchadd."%'";  
								$dberg = mysql_query($aussenstelle);
								if (!$dberg){
									die(mysql_error());
								}
								while ($erg = mysql_fetch_array($dberg, MYSQL_ASSOC)){
								?>
									<!--<link href="https://developers.google.com/maps/documentation/javascript/examples/default.css" rel="stylesheet">  
									<script src="https://maps.googleapis.com/maps/api/js"></script>  
									<script>
									  var geocoder;
									  var map;
									  var mapOptions = {
										  zoom: 17,
										  mapTypeId: google.maps.MapTypeId.ROADMAP
										}
									  var marker;
									  function initialize() {
										geocoder = new google.maps.Geocoder();
										map = new google.maps.Map(document.getElementById('map_canvas'), mapOptions);  
										codeAddress();
									  }
									  function codeAddress() {
										var address = document.getElementById('address').value;  
										geocoder.geocode( { 'address': address}, function(results, status) {  
										  if (status == google.maps.GeocoderStatus.OK) {
											map.setCenter(results.geometry.location);
											if(marker)
											  marker.setMap(null);
											marker = new google.maps.Marker({
												map: map,
												position: results.geometry.location,
												draggable: true
											});
											google.maps.event.addListener(marker, "dragend", function() {  
											  document.getElementById('lat').value = marker.getPosition().lat();  
											  document.getElementById('lng').value = marker.getPosition().lng();  
											});
											document.getElementById('lat').value = marker.getPosition().lat();  
											document.getElementById('lng').value = marker.getPosition().lng();  
										  } else {
											alert('Geocode was not successful for the following reason: ' + status);  
										  }
										});
									  }
									</script>-->
								<?php
									$db_id = $erg['nummer'];  
									#echo $aussenstelle;
									echo "<div class='collapsible-body'>";  
										echo "<div class='row'>";  
											echo "<div class='col s6 left'>";  
												echo "<br><u>".$erg['plz']." ";  
												echo $erg['ort']."</u><br>";  
												echo $erg['strasse']." ";  
												echo $erg['hausnummer']."<br>";  
												if ($erg['parken'] == '1'){  
													echo "<br><b>&#10003;</b> Parken<br>";  
													echo "<div style='font-size: 13px;'>".$erg['zufahrt']."</div>";  
												}else{
													echo "<br><b>&#10007;</b> Parken<br>";  
													echo "<div style='font-size: 13px;'>Es muss ein öffentlicher Parkplatz genutzt werden. Parkkosten werden im dienstlichen Interesse erstattet.</div>";  
												}
												if ($erg['fahrstuhl'] == '1'){  
													echo "<b>&#10003;</b> Fahrstuhl<b><br>";  
												}else{
													echo "<br><b>&#10007;</b> Fahrstuhl<b><br>";  
												}
												echo "<br>".$erg['etage']."</b> Etage<br>";  
											echo "</div>";  
											echo "<div class='col s6 right'>";  
												if ($erg['ansprechpartner'] != ''){  
													echo "<br><b>Ansprechpartner: </b><br>";  
													echo $erg['ansprechpartner'];  
												}
												if ($erg['telefon'] != ''){  
													echo "<br><b>Telefon: </b><br>";  
													echo $erg['telefon']."<br>";  
												}
												if ($erg['website'] != ''){  
													echo "<br><u><a href='http://".$erg['website']."' target=_blank>Website</a></u>";  
												}
												echo "<br><u><a href='https://www.google.de/maps/place/".str_replace(' ','+',$erg['strasse']).",+".$erg['hausnummer']."+".$erg['plz']."+".$erg['ort']."' target=_blank>Google Maps</a></u>";  
												#echo "<input class='hide' type='textbox' id='address' value='".$erg['plz']." ".$erg['ort'].", ".$erg['strasse']." ".$erg['hausnummer']."'>"; 
												?>
												<!--<div>
													<input type="button" value="Geocode" onclick="codeAddress()">  
													<input class="hide" type="text" id="lat"/>  
													<input class="hide" type="text" id="lng"/>  
													<div id="map_canvas" style="height:395px;width:100%;top: 10px;right: -3px;"></div>  
													<?php 
														#echo "<iframe src='https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d2436.400065346088!2d".$erg['maps_lng']."!3d".$erg['maps_lat']."55592416!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x47b00b354c8a706d%3A0x6ed124e9c6c2ac9d!2s".str_replace(' ','+',$erg['strasse'])."+".$erg['hausnummer']."%2C+".$erg['plz']."+".$erg['ort']."!5e0!3m2!1sde!2sde!4v1466148523622' style='width:100%; height:395px; top:10px; right:-3px;' frameborder='0' style='border:0' allowfullscreen></iframe>";  
													?>
												</div>-->
    
												<?php
											echo "</div>";  
											echo "<div class='col s12'>";  
												if ($erg['besonderheiten'] != ''){  
													echo "<br><b>Sonstiges: </b><br>";  
													echo $erg['besonderheiten'];  
												}
											echo "</div>";  
											?>
											<?php
										echo "</div>";  
									#echo $aussenstelle;
								}
							echo "</li>";  
						}
						flush();
					}
		?>
						</ul>
					</div>
				</div>
			</div>
		<?php
			include('footer-m_small.php');  
		?>
		</body>
	</html>
<?php
	}
?>

search.php
<div class="row">  
	<div class="col s8 offset-s2">  
		<ul class="tabs">  
			<li class="tab col s6"><a href="#oe" class="active">OE-Suche (Name oder Nummer)</a></li>  
			<li class="tab col s6"><a href="#strasse">Straßen-Suche</a></li>  
		</ul>
	</div>
	<div id="oe" class="col s12">  
	<?php
		$searchoe = '';  
		echo "<form action='view_team.php' method='get'>";  
	?>
			<div class="col s8 offset-s2">  
				<div class='row valign-wrapper'>  
					<div class='input-field col s10 center-align'>  
						<input id='searchoe' class='search validate valign' type='text' name='searchoe' ".$searchrows.">  
							<label for="searchoe">Volltextsuche wird unterstützt</label>  
					</div>
					<div class="col s2 valign center-align">  
						<button type='submit' class='btn-flat waves-effect waves-light' name='Suche' value='Suche'>Suche</button>  
					</div>
				</div>
			</div>
		<!--</form>-->
	</div>
	<div id="strasse" class="col s12">  
	<?php
		$searchadd = '';  
		#echo "<form action='view_team.php' method='get'>";  
	?>
			<div class="col s8 offset-s2">  
				<div class='row valign-wrapper'>  
					<div class='input-field col s10 center-align'>  
						<input id='searchadd' class='search validate valign' type='text' name='searchadd' ".$searchrows.">  
							<label for="searchadd">Volltextsuche wird unterstützt</label>  
					</div>
					<div class="col s2 valign center-align">  
						<button type='submit' class='btn-flat waves-effect waves-light' name='Suche' value='Suche'>Suche</button>  
					</div>
				</div>
			</div>
		</form>
	</div>
</div>

Wie man sieht, wird bei der Teamausgabe die DB erst nach Teams durchforstet und gleichzeitig ausgegeben. Mit jedem Schleifenaufruf werden die Inhalte unter die Teams aufgeschrieben. Das gleiche sieht aus wie eine Art Akkordeon zum aufklappen (Stichwort: FAQ zum aufklappen).

Ich gehe davon aus, dass man hier mit einem Join bei der ersten DB-Abfrage arbeiten muss um die Straße ($searchadd) und nicht das Team ($searchoe) zu suchen. Versteht ihr, was ich mir hier vorstelle?

Danke für eure Hilfe!!

Gruß
Thomas face-smile

Content-ID: 307471

Url: https://administrator.de/contentid/307471

Ausgedruckt am: 16.11.2024 um 17:11 Uhr

SlainteMhath
SlainteMhath 17.06.2016 um 11:38:49 Uhr
Goto Top
Moin,

zwar kein Beitrag zur Lösung deiner Frage, aber dein Code enthält einige SQL-Injection Lücken:
$aussenstelle = "SELECT * FROM `team5-kundendb`.aussenstelle WHERE teamnummer LIKE '".$td['nummer']."' AND strasse LIKE '%".$searchadd."%'";  
$dberg = mysql_query($aussenstelle);  

Frag dich mal was passiert, wenn $searchadd den Wert
%'; DROP TABLE aussenstelle; --  
hat.

Und: kannst du mal die nicht für das Problem relevanten Teile des Codes entfernen? 200 Zeilen Code is schon ne Menge, wenns um ein JOIN geht ;)
Verrat uns lieber wie die Tabellen aufgebaut sind.

lg,
Slainte
atze187
atze187 17.06.2016 aktualisiert um 12:24:24 Uhr
Goto Top
Hi,

was der Vorredner sagt plus...

Liest sich so als hättest du noch keinen Join geschrieben.

Sollte bei der DB in etwa so aussehen.

SELECT 
    t.*, a.* 
FROM 
    'team5-kundendb'.teams t  
INNER JOIN `
    team5-kundendb`.aussenstelle a ON t.nummer = a.teamnummer
WHERE
    a.strasse LIKE '%".$searchadd."%'  

Selber lesen macht schlau

Gruß,
André

PS: Abgesehen davon frage ich mich warum so viele PHP-Piepel ihren Code in direkt ins Markup stopfen müssen. Es gibt doch auch für PHP Viewengines.
SlainteMhath
SlainteMhath 17.06.2016 um 12:03:57 Uhr
Goto Top
warum die so viele PHP-Piepel ihren Code in direkt ins Markup stopfen müssen.
Quick'n'Dirty, that's why face-smile
atze187
atze187 17.06.2016 aktualisiert um 12:11:48 Uhr
Goto Top
Beim Tapezieren macht man doch auch immer ein Bahn neben der anderen und nicht kreuz und quer. Wenn man fertig ist ist man vielleicht froh dass man fertig ist, aber wenn man sich das 5 Minuten später anschaut schlägt man doch die Hände überm Kopf zusammen.