1. table : kgroup - 아이돌그룹

 

 

2. table : album - 아이돌 노래명

 

 

1. kgroup 의 아이돌들이 부른 노래들을 보고싶다면 left join을 이용한다.

select a.name, a.agency, b.title
from kgroup a
left join album b
on a.name = b.name

 

album 테이블에 러블리즈가 부른 노래가 없으므로 러블리즈의 title컬럼은 null이다.

 

2. album 의 노래를 부른 가수들의 소속사를 보고싶다면 right join을 이용한다.

select a.agency, b.name, b.title
from kgroup a
right join album b
on a.name = b.name;

 

3. 전체 목록을 출력하고 싶다면 full outer join을 사용할 수 있다.

 

mysql 의 경우 full outer join을 지원하지 않으므로

 

"select * from a left join b on a.no = b.no

union

select * from a right join b on a.no = b.no"

의 형식을 사용하면 된다.

select a.name, a.agency, b.title
from kgroup a
left join album b
on a.name = b.name
union
select b.name, a.agency, b.title
from kgroup a
right join album b
on a.name = b.name;

 

 

 

 

3_2. 비교 : union all 을 사용할 경우 

select a.name, a.agency, b.title
from kgroup a
left join album b
on a.name = b.name
union all
select b.name, a.agency, b.title
from kgroup a
right join album b
on a.name = b.name;

 

이 때 union 과 union all의 차이점을 알아야 한다.

left join과 right join을 합할 경우 가운데 inner join 부분이 중복된다.

union의 경우 중복값을 제거해주고 union all은 중복값을 포함한 결과값들이 출력되므로

중복되는 inner join 결과들을 제거해주는 union을 사용해야 한다.

 


WRITTEN BY
beautifulhill

,

 

1. 문제: workbench에서 mysql 데이터값을 수정, 삭제, 입력 등을 시행하려고 하는데,

readonly여서 못할 때가 있다.

 

 

이는 table에서 pk(primary key)가 지정돼있지 않아서 발생하는 문제이다.

 

해결법

Primary Key를 지정한다.

 

ALTER TABLE `test`.`readonly` 
ADD PRIMARY KEY (`no`);

 


WRITTEN BY
beautifulhill

,

datepicker란 jQuery에서 제공하는 위젯 중 하나이다. 

사용법은

 

1. import

<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<link rel="stylesheet" href="http://code.jquery.com/ui/1.8.18/themes/base/jquery-ui.css">

 

2. script

<script>
$(document).ready(function() {
    $("#datepicker").datepicker();
});
</script>

 

3. html

<body>
    날짜 선택: <input type="text" id="datepicker">
</body>

 

datepicker 기본

 

가장 기본 형태의 datepicke이다.

 

 

여기서 옵션을 추가할 수 있다. 

 

1. showOn

showOn: "button" ->button 클릭 시 날짜 위젯을 보여준다.

showOn:"both" => button이나 text상자 클릭 시 날짜 위젯을 보여준다.

    $("#datepicker").datepicker({
        showOn:"button"
    });

 

2. buttonImage

버튼 이미지

    $("#datepicker").datepicker({
        showOn:"button"
        , buttonImage: "http://jqueryui.com/resources/demos/datepicker/images/calendar.gif"
    });

 

3. buttonImageOnly

버튼 이미지만 보이게 하기

    $("#datepicker").datepicker({
        showOn:"button"
        , buttonImage: "http://jqueryui.com/resources/demos/datepicker/images/calendar.gif"
        ,buttonImageOnly: true
    });

4. changeMonth, changeYear

년, 월을 셀렉트박스로 변경

 $("#datepicker").datepicker({
        showOn:"button"
        , buttonImage: "http://jqueryui.com/resources/demos/datepicker/images/calendar.gif"
        ,buttonImageOnly: true
        ,changeMonth:true
        ,changeYear:true 
    });

 

5. yearRange

연도의 선택 범위

$("#datepicker").datepicker({
        showOn:"button"
        , buttonImage: "http://jqueryui.com/resources/demos/datepicker/images/calendar.gif"
        ,buttonImageOnly: true
        ,changeMonth:true
        ,changeYear:true
        ,yearRange:"-10:+100" /*2009 ~ 2119*/
        ,yearRange:"2009:9999" /*2009 ~ 9999*/
         /*위의 방식 아래 방식 둘다 가능*/
    });

 

 

 

 

6. nextText, prevText 

화살표의 툴팁내용

$("#datepicker").datepicker({
        showOn:"button"
        , buttonImage: "http://jqueryui.com/resources/demos/datepicker/images/calendar.gif"
        ,buttonImageOnly: true
        ,changeMonth:true
        ,changeYear:true
        ,nextText:"다음"
        ,prevText:"이전"
        
    });

 

7. numberOfMonths:[n,m]

n X m 으로 달력을 보여줌

$(document).ready(function() {
    $("#datepicker").datepicker({
        showOn:"button"
        , buttonImage: "http://jqueryui.com/resources/demos/datepicker/images/calendar.gif"
        ,buttonImageOnly: true
        ,changeMonth:true
        ,changeYear:true
        ,nextText:"다음"
        ,prevText:"이전"
        ,numberOfMonths:[2,3]
    });
});

 

8. dateFormat

날짜 형식

$("#datepicker").datepicker({
        showOn:"button"
        , buttonImage: "http://jqueryui.com/resources/demos/datepicker/images/calendar.gif"
        ,buttonImageOnly: true
        ,changeMonth:true
        ,changeYear:true
        ,dateFormat:"dd-mm-yy"
    });

 

9. dayNames, dayNamesMin,monthNamesShort

dayNames: 요일 툴팁

dayNamesMin: 표시되는 요일

monthNamesShort : 표시되는 월

 $("#datepicker").datepicker({
        showOn:"button"
        , buttonImage: "http://jqueryui.com/resources/demos/datepicker/images/calendar.gif"
        ,buttonImageOnly: true
        ,changeMonth:true
        ,changeYear:true
        ,dateFormat:"dd-mm-yy"
        ,dayNames : ['월요일','화요일','수요일','목요일','금요일','토요일','일요일']
        ,dayNamesMin : ['월','화','수','목','금','토','일']
        ,monthNamesShort:  [ "1월", "2월", "3월", "4월", "5월", "6월","7월", "8월", "9월", "10월", "11월", "12월" ]
    });

 

10. showOtherMonths

이전달, 다음달의 날짜 표시여부

$("#datepicker").datepicker({
        showOn:"button"
        , buttonImage: "http://jqueryui.com/resources/demos/datepicker/images/calendar.gif"
        ,buttonImageOnly: true
        ,changeMonth:true
        ,changeYear:true
        ,dateFormat:"dd-mm-yy"
        ,dayNames : ['월요일','화요일','수요일','목요일','금','토','일']
        ,dayNamesMin : ['월','화','수','목','금','토','일']
        ,monthNamesShort:  [ "1월", "2월", "3월", "4월", "5월", "6월","7월", "8월", "9월", "10월", "11월", "12월" ]
        ,showOtherMonths:true
    });

 

 

이 외에도 여러가지 옵션들이 있으니, 직접 실행해보면 된다. 

'프로그래밍 > 기타' 카테고리의 다른 글

select 박스와 input의 위치가 다를때  (1) 2019.11.28

WRITTEN BY
beautifulhill

,

기존의 디자인에 맞춰 새로운 페이지를 만들거나, 수정할 때

select box와 input의 위치가 미묘하게 다를 때가 있다.

 

이렇게 selectbox가 올라가 있는경우, 혹은 그 반대의 경우가 보인다.

 

이럴 때

1. 높이를 확인한다.

아무런 css를 주지 않은 input의 경우 padding:1px 0px, border-with: 2px 이고

selectbox의 경우 padding: 0; border-width: 1px;이다.

그러므로 높이가 같은지 확인하는 것이 우선이다.

input의 디폴트 css값
select 의 디폴트 css값

 

 

2. vertical-align을 확인한다.

대부분의 문제는 vertical-align이 달라서 생기는 일이다.

위의 예시도 input 은 vertical-align: middle

select는 vertical-align: top으로 주어 발생한 문제이다.

 

vertical-align을 같은 값으로 주면 해결!!

input[type="text"]{
  line-height: 16px;
  vertical-align: middle;
}
select{
  height: 20px;
  vertical-align: middle;
}

 

'프로그래밍 > 기타' 카테고리의 다른 글

jQuery 달력 위젯 datepicker 사용하기  (1) 2019.11.28

WRITTEN BY
beautifulhill

,

before

SELECT * from(
(
SELECT 
  a.no,
  a.code,
  b.price,
  b.start_date,
  b.end_date
FROM product a
left join sale b
on a.code = b.code
)
Union
(
SELECT 
  a.no,
  a.code,
  b.price,
  b.start_date,
  b.end_date
FROM product a
right join sale b
on a.code = b.code
order by no desc
)
)
where code not in ('9001')
order by code, start_date

 

이 때 Error Code: 1248 Every derived table must have its own alias 오류가 발생한다.

 

파생테이블에 명칭( alias )가 있어야한다.

 

after

SELECT * from(
(
SELECT 
  a.no,
  a.code,
  b.price,
  b.start_date,
  b.end_date
FROM product a
left join sale b
on a.code = b.code
)
Union
(
SELECT 
  a.no,
  a.code,
  b.price,
  b.start_date,
  b.end_date
FROM product a
right join sale b
on a.code = b.code
order by no desc
)
)as c
where code not in ('9001')
order by code, start_date

WRITTEN BY
beautifulhill

,

before

SELECT 
  a.no,
  a.code,
  b.price,
  b.start_date,
  b.end_date
FROM product a
left join sale b
on a.code = b.code
Union
SELECT 
  a.no,
  a.code,
  b.price,
  b.start_date,
  b.end_date
FROM product a
right join sale b
on a.code = b.code
order by no desc

Error Code : 1221 Incorrect usage of UNION and ORDER BY

 

오류 발생

- union과 order by를 같이 사용할 때에는 select 문을 괄호로 감싸줘야 한다.

 

after

(
SELECT 
  a.no,
  a.code,
  b.price,
  b.start_date,
  b.end_date
FROM product a
left join sale b
on a.code = b.code
)
Union
(
SELECT 
  a.no,
  a.code,
  b.price,
  b.start_date,
  b.end_date
FROM product a
right join sale b
on a.code = b.code
)
order by no desc;​

 


WRITTEN BY
beautifulhill

,

아주 간단하게 메일을 보낼 수 있지만

예쁘게 꾸민 html 코드로 메일을 보낼 수도 있다.

 

1. mailtest.php

$to      = '받는사람@gmail.com';
$subject = 'html을 보냈습니다.';
$fp = fopen('mailtest.html',"r");
$message = fread($fp,filesize('mailtest.html'));

$name = '김광인';
$age = '21';
$gender = '남자';
$message = str_replace('{name}', $name, $message);
$message = str_replace('{age}', $age, $message);
$message = str_replace('{gender}', $gender, $message);
echo $message;


// html 메일을 보낼 때 꼭 이헤더가 붙어야한다.
$headers[] = 'MIME-Version: 1.0';
$headers[] = 'Content-type: text/html; charset=utf-8';

// Additional headers
$headers[] = 'To: Kim<받는사람@gmail.com>';
$headers[] = 'From: Admin<test@naver.com>';
$headers[] = 'Cc: Kim1<참조인1@naver.com>,Kim2<참조인2@gmail.com>';
$headers[] = 'Bcc: 숨은참조인3@gmail.com';


$result =mail($to, $subject, $message, implode("\r\n", $headers));
echo "메일 성공여부 : ";
if($result){echo "성공";}else{echo "실패";}

2_1. mailtest.html

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
<style type="text/css">
table tr td{
border: 1px solid #5da399;
text-align: center;
padding: 10px;
}
</style>
</head>

<body>
	<table>
		<tr>
			<td>이름</td>
			<td>{name}</td>
		</tr>		
		<tr>
			<td>나이</td>
			<td>{age}</td>
		</tr>		
		<tr>
			<td>성별</td>
			<td>{gender}</td>
		</tr>
	</table>
</body>
</html>

 

 

이렇게 하면, mailtest.html은

 

다음과 같이 출력된다.

 

메일을 보낸 후

메일함을 확인해보면

 

다음과 같이 스타일이 적용이 하나도 안된 상태로 온다.

따라서 html의 스타일을 inline방식으로 바꾼다.

 

2_2. mailtest.html

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
<style type="text/css">

</style>
</head>

<body>
	<table style="border-collapse: collapse;text-align: center;">
		<tr>
			<td style="border: 1px solid #5da399;padding: 10px;">이름</td>
			<td style="border: 1px solid #5da399;padding: 10px;">{name}</td>
		</tr>		
		<tr>
			<td style="border: 1px solid #5da399;padding: 10px;">나이</td>
			<td style="border: 1px solid #5da399;padding: 10px;">{age}</td>
		</tr>		
		<tr>
			<td style="border: 1px solid #5da399;padding: 10px;">성별</td>
			<td style="border: 1px solid #5da399;padding: 10px;">{gender}</td>
		</tr>
	</table>
</body>
</html>

 

 

스타일이 잘 적용된 상태로 메일이 보내진다.

 

다 끝난 것 같지만 아직 문제가 하나 남았다.

 

잘 살펴보자

 

 

분명 받는 사람은 나 하나고 참조인이 2명인데, 왜 받는사람이 두명인 것인가?

 

이는 mailtest.php에서 $to 와 $headers[] = 'To: Kim<받는사람@gmail.com>';

때문인다. to를 두번 지정해준 것이므로 "$headers[] = 'To: Kim<받는사람@gmail.com>';" 지워줘야 한다.

 

그럼 다음과 같이 받는 사람이 한명으로 제대로 나온다.


WRITTEN BY
beautifulhill

,

mail()함수를 사용하여 php로도 간단한 메일을 전송할 수 있다.

단, mail()함수는 리눅스에서만 사용가능하다는 단점

 

매뉴얼을 보면

mail ( string $to , string $subject , string $message [, mixed $additional_headers [, string $additional_parameters ]] ) : bool

라고 나와있다.

 

mail(받는 사람의 이메일, 제목, 메시지 [, 헤더 [, 파라미터]]) 이며 성공시 true, 실패시 false를 반환한다.

 

1. 받는사람주소, 제목, 메시지는 mail함수의 필수 파라미터이다. 이것만을 사용하여 간단히 메일을 보낼 수 있다.

$message는 70자를 초과할 경우 자동 줄바꿈을 하도록 wordwrap() 함수를 사용하도록 권한다.

$message = "안녕하세요. 이 메일은 1992년 영국으로부터 시작된 메일이며 확인 즉시 10명에게 전달해야합니다. 그렇지 않으면....";
$message = wordwrap($message, 70, "\r\n");

$result = mail('받을사람이메일@gmail.com', '제목입니다.', $message);
echo "메일 성공여부 : ";
if($result){echo "성공";}else{echo "실패";}

 

 

2. 헤더를 추가해보자.

헤더에는 From(보내는 사람), Cc : 참조할 사람, Bcc: 숨은 참조 Reply-To: 답장할 메일주소 등을 추가할 수 있으며,

헤더는 CRLF(\r\n)로 구분해야한다.

$to      = '받는사람이메일@gmail.com';
$subject = '제목입니다.';
$message = '안녕하세요. 이 메일은 1992년 영국으로부터 시작된 메일이며 확인 즉시 10명에게 전달해야합니다. 그렇지 않으면....';

$headers = 'From: 보내는 메일주소@naver.com' . "\r\n" .
    'Reply-To: 답장 누르면 답메일 보낼 주소(보통은 from과 같음)@naver.com' . "\r\n" .
    'X-Mailer: PHP/' . phpversion();
    
$result =mail($to, $subject, $message, $headers);
echo "메일 성공여부 : ";
if($result){echo "성공";}else{echo "실패";}

 

2-1. 헤더는 배열로도 가능하다.

$to      = '받는사람이메일@gmail.com';
$subject = '제목입니다.';
$message = '안녕하세요. 이 메일은 1992년 영국으로부터 시작된 메일이며 확인 즉시 10명에게 전달해야합니다. 그렇지 않으면....';

$headers = array(
    'From' => '보내는 메일주소@naver.com',
    'Reply-To' => '답장 누르면 답메일 보낼 주소(보통은 from과 같음)@naver.com',
    'X-Mailer' => 'PHP/' . phpversion()
);

$result =mail($to, $subject, $message, $headers);
echo "메일 성공여부 : ";
if($result){echo "성공";}else{echo "실패";}

 

 

이렇게 보낼 경우 '메일을 보내는 페이지.php'에서는 

 

 

메일함에 가면 메일이 잘 도착해 있다.

 

 

 


WRITTEN BY
beautifulhill

,