티스토리 뷰


php에서 select문을 사용해 table에 저장된 값을 사용해 보는 예제를 써보자


이전 내용과 이어지도록, 셀렉트박스에서 선택한 값이 다음 화면으로 넘어가 그 값을 이용해 query문을 작성해보겠다.



그 전에 일단!


SELECT문은


SELECT column FROM 테이블 WHERE 조건;


의 형태로 쓸 수 있는 query문이다.



먼저, 동작 동영상부터.




이런식으로, 이전의 셀렉트박스들에서 값을 선택하고 submit Button을 클릭하면


그 조건에 맞는 비행기와 그에 대한 정보가 출력된다.


직항과 경유의 경우 두가지 다 표시된다.


위의 두 테이블은 선택 가능한 가는 비행기, 아래의 두 테이블은 선택 가능한 오는 비행기들이다.



그렇다면 여기서 코드,


<?php

$from = $_POST['From'];
$to = $_POST['To'];
$exit = $_POST['Exit'];
$enter = $_POST['Entry'];
$check = $_POST['oneway'];

$db_host="host=localhost";
$db_port="port=5432";

$db_passwd="user=postgres password=postgres";
$db_name="dbname=assignment";

$conn=pg_connect("$db_host $db_port $db_name $db_passwd");

if(!$conn){
  echo "db connect fail:<br />\n";
}

$query = "SELECT * FROM flightreserv WHERE from_c='".$from."' and to_c='".$to."' and date_t='".$exit."'";   
$query2 = "SELECT DISTINCT fr1.flightnum as firstpl, fr2.flightnum as secondpl, fr1.to_c as transfer, fr1.departure as deptime,fr1.arrival as transarrival, fr1.passenger as remainp1, fr2.passenger as remainp2, fr2.departure as transdepart, fr2.arrival as arrtime FROM flightreserv as fr1, flightreserv as fr2 WHERE (fr1.to_c=fr2.from_c and fr2.departure-fr1.arrival>'2 hours' and fr2.departure-fr1.arrival<'6 hours' and fr1.date_t=fr2.date_t and fr1.from_c='".$from."' and fr2.to_c='".$to."' and fr1.date_t='".$exit."')";
$query3 = "SELECT * FROM flightreserv WHERE to_c='".$from."' and from_c='".$to."' and date_t='".$enter."'";
$query4 = "SELECT DISTINCT fr2.flightnum as firstpl, fr1.flightnum as secondpl, fr2.to_c as transfer, fr2.departure as deptime,fr2.arrival as transarrival, fr2.passenger as remainp1, fr1.passenger as remainp2, fr1.departure as transdepart, fr1.arrival as arrtime FROM flightreserv as fr1, flightreserv as fr2 WHERE (fr2.to_c=fr1.from_c and fr1.departure-fr2.arrival>'2 hours' and fr1.departure-fr2.arrival<'6 hours' and fr2.date_t=fr1.date_t and fr2.from_c='".$from."' and fr1.to_c='".$to."' and fr2.date_t='".$exit."')";
$result = pg_exec($conn, $query); 
$result2 = pg_exec($conn, $query2);
$result3 = pg_exec($conn, $query3);
$result4 = pg_exec($conn, $query4);

$num=1;
?>
<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <meta name="Generator" content="EditPlus®">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
  <meta charset="utf-8">
  <title>PNU Air Reservation System</title>
 </head>
 <body>
<form action="./checheck.php" method="post">
<style>
.table3_2 table {
	width:100%;
	margin:15px 0
}
.table3_2 th {
	background-color:#ACF3FF;
	color:#000000
}
.table3_2,.table3_2 th,.table3_2 td
{
	font-size:0.95em;
	text-align:center;
	padding:4px;
	border:1px solid #90effe;
	border-collapse:collapse
}
.table3_2 tr:nth-child(odd){
	background-color:#e3fbfe;
}
.table3_2 tr:nth-child(even){
	background-color:#fdfdfd;
}
</style>
<table id="tata" class=table3_2 width="1200">
<tr>
	<th>Number</th><th>Flight Number</th><th>From</th><th>Destination</th><th>Exit Date</th><th>Departure Time</th><th>Arrival Time</th><th>Passenger</th><th>Reservation</th>
</tr>
<?php
	while($row = pg_fetch_assoc($result)){
		echo "<tr id=fir'".$num."'>";
		echo "<td> <div>".$num."</div></td>";
		echo "<td> <div name='".$row['flightnum']."'>".$row['flightnum']."</div></td>";
		echo "<td> <div name='".$row['from_c']."'>".$row['from_c']."</div></td>";
		echo "<td> <div name='".$row['to_c']."'>".$row['to_c']."</div></td>";
		echo "<td> <div name='".$row['date_t']."'>".$row['date_t']."</div></td>";
		echo "<td> <div name='".$row['departure']."'>".$row['departure']."</div></td>";
		echo "<td> <div name='".$row['arrival']."'>".$row['arrival']."</div></td>";
		echo "<td> <div name='".$row['passenger']."'>".$row['passenger']."</div></td>";
		echo "<td> <label for='".select."'/><input type='".radio."' name='".selair."' id='".$row['index']."' value='".$row['index']."'></td>";
		echo "</tr>";
		$num++;
	}
?>
</table>
<br/><br/>
<table id="tbtv" class=table3_2 width="1200">
<tr>
	<th>Number</th><th>Flight Number</th><th>From</th><th>Destination</th><th>Exit Date</th><th>Departure Time</th><th>Arrival Time</th><th>Passenger</th><th>Reservation</th>
</tr>
<?php
	while($row2 = pg_fetch_assoc($result2)){
		echo "<tr id=fir'".$num."'>";
		echo "<td rowspan='"."2"."'>".$num."</td>";
		echo "<td> <div name='".$row2['firstpl']."'>".$row2['firstpl']."</div></td>";
		echo "<td> <div name='".$from."'>".$from."</div></td>";
		echo "<td> <div name='".$row2['transfer']."'>".$row2['transfer']."</div></td>";
		echo "<td> <div name='".$exit."'>".$exit."</div></td>";
		echo "<td> <div name='".$row2['deptime']."'>".$row2['deptime']."</div></td>";
		echo "<td> <div name='".$row2['transarrival']."'>".$row2['transarrival']."</div></td>";
		echo "<td> <div name='".$row2['remainp1']."'>".$row2['remainp1']."</div></td>";
		echo "<td rowspan='"."2"."'> <label for='".select."'/><input type='".radio."' class='".radio."' name='".selair."' id='".$row2['index']."' value='".$row2['index']."'></td>";
		echo "</tr>";
		echo "<td> <div name='".$row2['secondpl']."'>".$row2['secondpl']."</div></td>";
		echo "<td> <div name='".$row2['transfer']."'>".$row2['transfer']."</div></td>";
		echo "<td> <div name='".$to."'>".$to."</div></td>";
		echo "<td> <div name='".$exit."'>".$exit."</div></td>";
		echo "<td> <div name='".$row2['transdepart']."'>".$row2['transdepart']."</div></td>";
		echo "<td> <div name='".$row2['arrtime']."'>".$row2['arrtime']."</div></td>";
		echo "<td> <div name='".$row2['remainp2']."'>".$row2['remainp2']."</div></td>";
		$num++;
	}

?>

</table>
</br>
</br>

<table id="tctc" class=table3_2 width="1200">
<tr>
	<th>Number</th><th>Flight Number</th><th>From</th><th>Destination</th><th>Enter Date</th><th>Departure Time</th><th>Arrival Time</th><th>Passenger</th><th>Reservation</th>
</tr>
<?php
	if($check=="round"){
		$num=1;
		while($row3 = pg_fetch_assoc($result3)){
			echo "<tr id=sec'".$num."'>";
			echo "<td> <div>".$num."</div></td>";
			echo "<td> <div name='".$row3['flightnum']."'>".$row3['flightnum']."</div></td>";
			echo "<td> <div name='".$row3['from_c']."'>".$row3['from_c']."</div></td>";
			echo "<td> <div name='".$row3['to_c']."'>".$row3['to_c']."</div></td>";
			echo "<td> <div name='".$row3['date_t']."'>".$row3['date_t']."</div></td>";
			echo "<td> <div name='".$row3['departure']."'>".$row3['departure']."</div></td>";
			echo "<td> <div name='".$row3['arrival']."'>".$row3['arrival']."</div></td>";
			echo "<td> <div name='".$row3['passenger']."'>".$row3['passenger']."</div></td>";
			echo "<td> <label for='".selair2."'/><input type='".radio."' name='".selair2."' id='".$row3['index']."' value='".$row3['index']."'></td>";
			echo "</tr>";
			$num++;
		}
	}
?>
</table>
<br/><br/>
<table id="tdtd" class=table3_2 width="1200">
<tr>
	<th>Number</th><th>Flight Number</th><th>From</th><th>Destination</th><th>Enter Date</th><th>Departure Time</th><th>Arrival Time</th><th>Passenger</th><th>Reservation</th>
</tr>
<?php
	if($check=="round"){
		while($row4 = pg_fetch_assoc($result4)){
			echo "<tr id=sec'".$num."'>";
			echo "<td rowspan='"."2"."'>".$num."</td>";
			echo "<td> <div name='".$row4['firstpl']."'>".$row4['firstpl']."</div></td>";
			echo "<td> <div name='".$to."'>".$to."</div></td>";
			echo "<td> <div name='".$row4['transfer']."'>".$row4['transfer']."</div></td>";
			echo "<td> <div name='".$enter."'>".$enter."</div></td>";
			echo "<td> <div name='".$row4['deptime']."'>".$row4['deptime']."</div></td>";
			echo "<td> <div name='".$row4['transarrival']."'>".$row4['transarrival']."</div></td>";
			echo "<td> <div name='".$row4['remainp1']."'>".$row4['remainp1']."</div></td>";
			echo "<td rowspan='"."2"."'> <label for='".selair2."'/><input type='".radio."' name='".selair2."' id='".$row4['index']."' value='".$row4['index']."'></td>";
			echo "</tr>";
			echo "<td> <div name='".$row4['secondpl']."'>".$row4['secondpl']."</div></td>";
			echo "<td> <div name='".$row4['transfer']."'>".$row4['transfer']."</div></td>";
			echo "<td> <div name='".$from."'>".$from."</div></td>";
			echo "<td> <div name='".$enter."'>".$enter."</div></td>";
			echo "<td> <div name='".$row4['transdepart']."'>".$row4['transdepart']."</div></td>";
			echo "<td> <div name='".$row4['arrtime']."'>".$row4['arrtime']."</div></td>";
			echo "<td> <div name='".$row4['remainp2']."'>".$row4['remainp2']."</div></td>";
			$num++;
		}
}
?>
</table>
<input type="submit" value="Submit">
</form>
</body>
</html>



200줄의 코드....지만 중복 중복이라 볼건 몇개 없다.


차근차근 뜯어보면,



일단,




$from = $_POST['From'];
$to = $_POST['To'];
$exit = $_POST['Exit'];
$enter = $_POST['Entry'];
$check = $_POST['oneway'];


요 부분은 이전 php로부터 변수 값을 받아온 부분이다.


 $새로운변수명 = $_POST['이전 php에서의 변수명'];


으로 선언하면, 새로운 변수명에 이전 php화면에서 넘어온 변수(value)값이 새로운 변수에 저장된다...!!


위의 코드 같은 경우는 from 변수에 SELECT 박스에서 선택된 공항 code,


to 변수에 SELECT 박스에서 선택된 공항 code,


exit과 entry 변수에 선택된 날짜 값이 들어가게 된다.



마지막 check 값은 앞의 oneway, return 중 어떤 값이 선택되었는지에 대한 값이 저장된다.




그리고 쭉 아랫부분은 postgresql에 로그인 및 DB와 연결하는 부분이다.


이부분은 계속 언급되었으니....넘어가겠다




$query = "SELECT * FROM flightreserv WHERE from_c='".$from."' and to_c='".$to."' and date_t='".$exit."'";   
$query2 = "SELECT DISTINCT fr1.flightnum as firstpl, fr2.flightnum as secondpl, fr1.to_c as transfer, fr1.departure as deptime,fr1.arrival as transarrival, fr1.passenger as remainp1, fr2.passenger as remainp2, fr2.departure as transdepart, fr2.arrival as arrtime FROM flightreserv as fr1, flightreserv as fr2 WHERE (fr1.to_c=fr2.from_c and fr2.departure-fr1.arrival>'2 hours' and fr2.departure-fr1.arrival<'6 hours' and fr1.date_t=fr2.date_t and fr1.from_c='".$from."' and fr2.to_c='".$to."' and fr1.date_t='".$exit."')";
$query3 = "SELECT * FROM flightreserv WHERE to_c='".$from."' and from_c='".$to."' and date_t='".$enter."'";
$query4 = "SELECT DISTINCT fr2.flightnum as firstpl, fr1.flightnum as secondpl, fr2.to_c as transfer, fr2.departure as deptime,fr2.arrival as transarrival, fr2.passenger as remainp1, fr1.passenger as remainp2, fr1.departure as transdepart, fr1.arrival as arrtime FROM flightreserv as fr1, flightreserv as fr2 WHERE (fr2.to_c=fr1.from_c and fr1.departure-fr2.arrival>'2 hours' and fr1.departure-fr2.arrival<'6 hours' and fr2.date_t=fr1.date_t and fr2.from_c='".$from."' and fr1.to_c='".$to."' and fr2.date_t='".$exit."')";
$result = pg_exec($conn, $query); 
$result2 = pg_exec($conn, $query2);
$result3 = pg_exec($conn, $query3);
$result4 = pg_exec($conn, $query4);



제에에에에일 중요한 쿼리문.


일단 query, query3은 쉽다.


앞에서 받아온 변수를 이용해 직항 항공편을 검색해주는 쿼리문이다.



간단히, flightreserv 테이블에서 출발지와 도착지, 출발날짜와 도착날짜가 저장된 변수값과 같은 것만 SELECT 해주면 된다.




그다음 문제는 query2와 query4인데...


경유지를 통해서 원하는 도착지로 갈 수 있는 경우를 검색하기 위해 self join을 사용했다.


변수명이 너무 복잡해서 as를 사용해 재정의해주었다...^^


조건은,


fr1.to와 fr2.from이 같고, fr의 출발시간에서 fr1의 도착시간을 뺀 것이 2시간 이상 6시간 이하여야 한다. 또한, fr1의 출발날짜와 fr2의 출발날짜 또한 같아야하고, fr1의 출발도시는 선택한 출발도시, fr2의 도착도시는 선택한 도착도시, 그리고 출국/입국날짜까지 맞는 조건을 찾아야 한다.



......


넘 복잡하네


더......더 간단하게 할 수 있.....으려나


어찌됐든 저런식으로 조건을 잡아주면, 해당하는 값들을 SELECT 할 수 있다.




이제 쿼리문까지 작성하면, 아래부분은 테이블 작성/테이블 채워주는 부분이다.



쿼리문이 네개니까, 테이블도 네개 작성했다.



<table id="tata" class=table3_2 width="1200">
<tr>
	<th>Number</th><th>Flight Number</th><th>From</th><th>Destination</th><th>Exit Date</th><th>Departure Time</th><th>Arrival Time</th><th>Passenger</th><th>Reservation</th>
</tr>
<?php
	while($row = pg_fetch_assoc($result)){
		echo "<tr id=fir'".$num."'>";
		echo "<td> <div>".$num."</div></td>";
		echo "<td> <div name='".$row['flightnum']."'>".$row['flightnum']."</div></td>";
		echo "<td> <div name='".$row['from_c']."'>".$row['from_c']."</div></td>";
		echo "<td> <div name='".$row['to_c']."'>".$row['to_c']."</div></td>";
		echo "<td> <div name='".$row['date_t']."'>".$row['date_t']."</div></td>";
		echo "<td> <div name='".$row['departure']."'>".$row['departure']."</div></td>";
		echo "<td> <div name='".$row['arrival']."'>".$row['arrival']."</div></td>";
		echo "<td> <div name='".$row['passenger']."'>".$row['passenger']."</div></td>";
		echo "<td> <label for='".select."'/><input type='".radio."' name='".selair."' id='".$row['index']."' value='".$row['index']."'></td>";
		echo "</tr>";
		$num++;
	}
?>
</table>


먼저 테이블의 맨 윗행을 채워주고,


쿼리문의 실행결과를 배열로 받아와서, while문을 돌면서 테이블을 채워준다.


비행기번호, 출발도시, 도착도시, 출국날짜, 출발시간, 도착시간, 남은 좌석수, 예약을 위한 라디오 버튼


의 순서대로 출력된다.



라디오버튼은 앞에서 얘기했던 것과 마찬가지로, name 값을 같게 해주어야 한다.




그리고 여기서 선택된 라디오버튼의 값이 다음 페이지로 넘어가서, 예약 과정이 진행되는 형식으로 구현 되겠...지....





오늘따라 설명이 좀....허술한것 같기도 하고....



쿼리문 짜는것만 복잡하지, 그 외의 테이블 채우기 같은 것은 이전에도 했던거니까 어렵지 않게 할 수 있었다.





다만 웹알못의 수난은....


여기서 넘어간 라디오버튼의 값을 어떻게 이용할 것인가가 문제였는데...^^

댓글