[Javascript] let - 변수 스코프를 조절하는 키워드.

웹 & 안드로이드/HTML5|2014. 5. 29. 09:51
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(function(){
    
    var total = 0;
    for(var i = 1; i < 11; i++){
        var temp = i;
        total += temp;
    }
    
    console.log("total : " + total);
    
   //블록 내에 선언된 변수들이지만 호출이 가능하다..
    console.log("temp : " + temp);
    console.log("i : " + i);
    
})();

결과 :

total : 55

temp : 10

i : 11

 

자바스크립트는 함수 내의 블록내(if문이나 for문 등)에 선언되어도 변수의 스코프가 함수 전체로 되어버린다. 

그러나 var대신 let이라는 키워드를 사용하면 일반 자바나 c#처럼 블록내에서만 사용할 수 있는 변수가 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
(function(){
    
    var total = 0;
    for(let i = 1; i < 11; i++){
        let temp = i;
        total += temp;
    }
    
    console.log("total : " + total);
    
   //밖에서는 정의되지 않았기 때문에 호출하려고 하면 에러가 난다..
    console.log("temp : " + temp);
    console.log("i : " + i);
    
})();

결과 :

total : 55

error! : 'temp'이(가) 정의되지 않았습니다.

 

let keyword refference - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let 

댓글()

값 추가삭제변경이 불가능한 컬렉션 계열 클래스

리스트나 맵등 Collection과 Map계열 클래스들은 앞에 final을 붙혀주면 일반 변수와 마찬가지로 초기 선언한 값 외에 수정이 불가능 하다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Main {
    public static void main(String[] args) {
          
          System.out.println(A.list.toString());
        
        A.list.add("d"); //변경하려고 하면 java.lang.UnsupportedOperationException이 발생한다.        
        System.out.println(A.list.toString());
                
    }
}
 
class A{
    public static final List<String> list = Arrays.asList(new String[] {"a""b""c"});
}

 

결과 :

[a, b, c]

Exception in thread "main" java.lang.UnsupportedOperationException
 at java.util.AbstractList.add(Unknown Source)
 at java.util.AbstractList.add(Unknown Source)
 at a.Main.main(Main.java:6)
 

- Collections.unmodifiable... 메소드를 이용하는 방법도 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Main {
    public static void main(String[] args) {
        
        System.out.println(A.list.toString());
 
        A.list.add("d");
        System.out.println(A.list.toString());
        
    }
}
 
class A{
    public static List<String> list = Collections.unmodifiableList(Arrays.asList(new String[] {"a""b""c"}));
}

결과는 위와 동일.

 

댓글()

[에러].submit() is not function - form 객체 submit()이 안될 때

웹 & 안드로이드/HTML5|2014. 5. 18. 10:00
<script type="text/javascript">
    window.onload = function(){
        document.querySelector("input[type=button]#button1")
        .addEventListener("click", function(){
            var pw = document.querySelector("input[type=password]#pw").value;
            var pw2 = document.querySelector("input[type=password]#pw2").value;
            
            console.log(pw + pw2);
              
            if(pw == pw2){
                document.form1.submit();
            }
        });
    }
</script>

<form name="form1" action="${contextPath}/member/join" method="post">
    id : <input type="text" name="id" required="required"/>
    pw : <input type="password" id="pw" name="pw" required="required"/>
    pw 확인 : <input type="password" id="pw2" required="required"/>
    <input type="button" id="submit" value="입력"/>
</form>

비밀번호 두개를 비교하여 같으면 submit하는 스크립트이다.

하지만 이 상황에서는 submit이 함수가 아니라며 submit이 되지 않는다..

그 이유는 20번 줄에 버튼의 id에 submit이라는 값을 주었기 때문... submit이라는 값을 주지 않으면 정상적으로 동작한다..

댓글()

[Javascript] querySelector

웹 & 안드로이드/HTML5|2014. 5. 18. 09:51

jquery와 같이 css 선택자로 html 엘레멘트를 선택할 수 있으며 사용방법은

document.querySelector("선택자")

로 선택할 수 있다.

댓글()

대충 만들어본 로그 클래스

Logger.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
public class Logger {
    
    public static final int NO = LoggerConfigLoader.NO_STATUS;
    public static final int INFO = LoggerConfigLoader.INFO_STATUS;
    public static final int DEBUG = LoggerConfigLoader.DEBUG_STATUS;
        
    private int status = Logger.NO;
    private String className = "";
        
    public Logger(){};    
    
    public Logger(int status){
        this.status = status;
    }
    
    public Logger(Class<?> clazz, int status){
        this.className = clazz.getCanonicalName();
        this.status = status;
    }
    
    public void info(String text){ infoPrint(text); }
    public void info(Object text){ infoPrint(text.toString()); }
    public void info(boolean text){ infoPrint(String.valueOf(text)); }
    public void info(double text){ infoPrint(String.valueOf(text)); }
    public void info(short text){ infoPrint(String.valueOf(text)); }
    public void info(float text){ infoPrint(String.valueOf(text)); }
    public void info(long text){ infoPrint(String.valueOf(text)); }
    public void info(char text){ infoPrint(String.valueOf(text)); }
    public void info(byte text){ infoPrint(String.valueOf(text)); }
    public void info(int text){ infoPrint(String.valueOf(text)); }
    
    public void debug(String text){ debugPrint(text); }
    public void debug(Object text){ debugPrint(text.toString()); }
    public void debug(boolean text){ debugPrint(String.valueOf(text)); }
    public void debug(double text){ debugPrint(String.valueOf(text)); }
    public void debug(short text){ debugPrint(String.valueOf(text)); }
    public void debug(float text){ debugPrint(String.valueOf(text)); }
    public void debug(long text){ debugPrint(String.valueOf(text)); }
    public void debug(char text){ debugPrint(String.valueOf(text)); }
    public void debug(byte text){ debugPrint(String.valueOf(text)); }
    public void debug(int text){ debugPrint(String.valueOf(text)); }
    
    private void infoPrint(String text){
        if(((status & Logger.INFO) == Logger.INFO) || (status >= Logger.INFO)){
            printText(Logger.INFO, text);
        }
    }
    
    private void debugPrint(String text){
        if((status & Logger.DEBUG) == Logger.DEBUG){
            printText(Logger.DEBUG, text);
        }
    }
    
    private void printText(int status, String text){
        String statusString = "";
        
        switch(status){
        case Logger.INFO:
            statusString = "[info]";
            break;
        case Logger.DEBUG:
            statusString = "[debug]";
            break;
        }
        
        System.out.println(statusString + ((status >= 2)?this.className + " - " : "") + text); 
        
    }
 
}
 

 

- LoggerFactory.java(LoggerConfig.class, Wk5LoggerConfigLoadException.class 포함)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
package com.wakeup.module.commons.log;
 
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
 
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;
 
public class LoggerFactory {
    private LoggerFactory(){}
    
    public static Logger getLogger(Class<?> clazz){
        
        LoggerConfigLoader l = LoggerConfigLoader.getAndLoadLoggerConfig();
        
        return new Logger(clazz, l.getLogStatus());
    }
}
 
class LoggerConfigLoader{
    /* 설정 파일 값들 */
    /* 값 */
    protected static final int NO_STATUS = 0b00000000;
    protected static final int INFO_STATUS = 0b00000001;
    protected static final int DEBUG_STATUS = 0b00000010;
    
    /* 이름 */
    private final String NO_STATUS_NAME = "no";
    private final String INFO_STATUS_NAME = "info";
    private final String DEBUG_STATUS_NAME = "debug";
    
    /* 설정파일 이름 */
    private final String LOGGER_XML_CONFIG_NAME = "wk5logger.xml";
 
    
    /* 싱글턴을 위함. */
    private static LoggerConfigLoader instance = null;
    
    /* 설정 상태 값. */
    private int logStatus = NO_STATUS;
    
    /* 내부 작동을 위한 변수들 */
    private List<String> statusNameList = 
                Arrays.asList(new String[]{NO_STATUS_NAME, INFO_STATUS_NAME, DEBUG_STATUS_NAME});
    private List<Integer> statusValueList = 
                Arrays.asList(new Integer[]{NO_STATUS, INFO_STATUS, DEBUG_STATUS});
    private final Map<String, Integer> statusMap = new HashMap<String, Integer>();
    
    /* 생성자 */
    private LoggerConfigLoader(){
        /* 상태값을 맵에 넣음 */
        for(int i = 0; i < statusNameList.size(); i++){
            statusMap.put(statusNameList.get(i), statusValueList.get(i));
        }
        
        loadConfig();
    }
    
    /* 싱글턴을 위함. */
    protected static LoggerConfigLoader getAndLoadLoggerConfig(){
        
        synchronized (LoggerConfigLoader.class) {
            
            if(instance == null){
                instance = new LoggerConfigLoader();
            }
            
        }
        
        return instance;
    }
    
    /* xml설정파일을 로드하여 설정된 값을 logStatus에 넣음. */
    private void loadConfig(){
 
        try {
            
            File xmlConfigFile = getXmlConfigFile(LOGGER_XML_CONFIG_NAME);
                 //Wk5LoggerConfigLoadFailedException
            
            String getLogStatusString = getStatusAtConfigXmlfile(xmlConfigFile);
            
            if(statusNameList.contains(getLogStatusString)){
                logStatus = statusMap.get(getLogStatusString).intValue();
            }else{
                logStatus = NO_STATUS;
            }
            
        } catch (Wk5LoggerConfigLoadException e) {
            
            System.out.println(e.getMessage());
            logStatus = NO_STATUS;
        }
    }
    
    private File getXmlConfigFile(String xmlFileName) throws Wk5LoggerConfigLoadException{
        
        URL configPath = this.getClass().getClassLoader().getResource(xmlFileName);
            
        if(configPath == nullthrow new Wk5LoggerConfigLoadException();
        
        File xmlFile = new File(configPath.getFile());
        
        return xmlFile;
    }
    
    private String getStatusAtConfigXmlfile(File xmlConfigFile){
        
        try {
            DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance()
                      .newDocumentBuilder();
            Document xmlConfig = documentBuilder.parse(xmlConfigFile);
            
            xmlConfig.getDocumentElement().normalize();
            
            Node rootNode = xmlConfig.getFirstChild();
            
            String LogStatusString = rootNode.getOwnerDocument()
                      .getElementsByTagName("status").item(0).getTextContent();
            
            return LogStatusString;
            
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
            return NO_STATUS_NAME;
        } catch (SAXException e) {
            e.printStackTrace();
            return NO_STATUS_NAME;
        } catch (IOException e) {
            e.printStackTrace();
            return NO_STATUS_NAME;
        }
        
    }
 
    public int getLogStatus() {
        return logStatus;
    }
    
}
 
class Wk5LoggerConfigLoadException extends Exception{
    private static final long serialVersionUID = 1L;
 
    public Wk5LoggerConfigLoadException(){
        super("wk5logger error! - "
                + "Set the log file does not exist or the file location is incorrect. "
                + "Set file at top-level source directory.");
    }
    
    public Wk5LoggerConfigLoadException(String messege){
        super(messege);
    }
    
}
 

-wk5logger.xml

1
2
3
4
<?xml version="1.0" encoding="UTF-8"?>
<logger>
    <status>debug</status>        
</logger>

  -Main.java

1
2
3
4
5
6
7
8
9
10
11
public class Main{
   Logger log = new Logger(Main.class);
//Logger log = new Logger(Logger.INFO);
//Logger log = new Logger();
 
   public static void main(String arg[]) {
      log.info("인포 로그입니다");
      log.debug("디버그 로그입니다");
   }
}
 

 

-출력

 [info] - 인포 로그입니다

[debug] Main - 디버그 로그입니다

 

- 클래스 이름을 생략 할 수도 있고, 인포로그만 혹은 출력안하게 할 수도 있다.

 

- 5. 17수정 인포로그는 클래스 이름 표시 안하도록 수정, 카운터 없앰

- 5. 31수정 외부 xml 설정파일를 통해 인포, 디버그 표시를 설정하도록 수정...

 

소스 파일을 볼 수 있도록 깃허브에 올려놓음.. https://github.com/wakeup5/module_git

댓글()

SQL 기본 - 윈도우 함수, WINDOW FUNCTION

윈도우 함수, WINDOW FUNCTION

 

 윈도우 함수는 부분적으로 행과 행간의 관계를 쉽게 정의하기 위한 함수. 분석함수, 순위함수라고도 한다.

 일정 범위내의 행들 사이에 순위를 나타내거나 집계, 순서, 비율, 통계를 낼 수 있다.

 

윈도우 함수 명령어의 기본 구조

 

1
2
3
SELECT 윈도우 함수(인수) OVER(
    [PARTITION BY 컬럼명] [ORDER BY 절] [WINDOWING 절])
FROM 테이블명

 

※ MYSQL에서는 OVER함수를 지원하지 않는다.  

 

 

윈도우 함수의 종류

 

- 순위 관련 함수

* RANK : 일정 범위 내의 순위를 정한다. 동일한 값에 대해서는 동일한 순위를 나타낸다.

* DENSE_RANK : RANK함수와 비슷하나 동일한 순위를 하나의 건수로 취급. 2등이 여러개 나와도 다음 순위는 3등이 된다.

* ROW_NUMBER : 일정 범위 내의 순위를 지정하나 RANK함수와는 다르게 동일한 값이 나와도 고유한 순위를 부여한다.

 

- 집계 관련 함수

* SUM : 일정 범위내의 합계를 구한다.

* MAX : 일정 범위내의 최댓값을 구한다.

* MIN : 최솟값을 구한다.

* AVG : 평균값을 구한다.

* COUNT : 갯수를 구한다.

 

- 순서 관련 함수

* FIRST_VALUE : 일정 범위 내(PARTITION BY 를 사용하여 그룹을 지정한 후)의 첫번째 행의 값을 구한다.

* LAST_VALUE : 마지막 행의 값을 구한다.

* LAG : 파티션별 윈도우에서 이전 몇번째 행의 값을 가져온다.

* LEAD : 이후 행의 값을 가져온다.

 

- 비율 관련 함수

* RATIO_TO_REPORT : 파티션 내의 전체값에 대한 행별 값의 백분율을 소수점으로 표현한다.

* PERCENT_RANK : 파티션 내의 순위를 백분율로 구한다.

* CUME_DIST : 파티션 내의 누적순위를 백분율로 구한다.

* NTILE : 입력된 인수 값만큼 그룹으로 나누고 순위를 나눈다.

 

PARTITION BY 절과 ORDER BY 절

일반적으로 GROUP BY와 같은 기능을 하고, 윈도우 함수 내의 ORDER BY절은 메인쿼리의 ORDER BY과 같은 기능을 한다. 

 

WINDOWING 절

 

WINDOWING 절은 함수의 대상이 되는 행 기준의 범위를 정할 수 있다.

 

ROWS는 값만큼 순서된 행을, RANGE는 비교하는 컬럼의 값의 범위에 해당하는 행을 지정.

일반적으로 BETWEEN ~ AND ~ 를 사용할 수 있다.

 

BETWEEN을 사용할 경우,

 

1
2
3
4
5
ROWS 혹은 RANGE 
BETWEEN 
[UNBOUNDED PRECENDING  |  (임의의 값) ROW  |  (값) PRECENDING(RANGE의 경우 FOLLOWING 사용 가능) ]
AND
[UNBOUNDED FOLLOWING  |  (임의의 값) ROW  |  (값) FOLLOWING(RANGE의 경우 PRECENDING 사용 가능) ]

 

 

사용하지 않을 경우,

 

1
2
3
ROWS 혹은 RANGE 
[UNBOUNDED PRECENDING  |  (임의의 값) ROW  |  (값) PRECENDING]
 

 

식으로 사용할 수 있다.

 

 PRECENDING는 해당하는 행의 이전 범위, FOLLOWING는 이후의 범위를 지정하며, UNBOUNDED와 같이 사용할 경우 끝까지 범위를 지정하라는 뜻.

 RANGE를 사용할 경우 값의 범위를 지정한다.

 

PRECENDING, FOLLOWING는 상대적인 위치를 지정하는 것이라면, ROW는 절대위치를 지정한다.

 

예) ROWS BETWEEN UNBOUNDED PRECENDING AND 1 FOLLOWING

(해당하는 행으로 부터 처음까지, 그리고 다음 1개 행까지 지정.)

 

RANGE BETWEEN 100 PRECENDING AND 50 FOLLOWING

(해당하는 행의 컬럼에 해당하는 값의 -100부터 +50까지 해당하는 행을 지정.)

 

ROWS 10 ROW

(10번째 행부터 해당하는 행까지를 지정.)

 

 

모든 내용은 'SQL 전문가 가이드, 한국데이터베이스진흥원'에서 인용, 발췌하였습니다.

댓글()

SQL 기본 - 데이터 조작어, DML(INSERT, UPDATE, DELETE, SELECT)

웹 & 안드로이드/DataBase|2014. 2. 28. 21:33

INSERT

: 테이블에 데이터를 입력한다.

 

* 일부 필드에 데이터를 입력하는 경우

 

1
2
3
4
5
6
7
8
9
10
11
12
INSERT INTO 테이블명
(
    컬럼명1,
    컬럼명2,
    ..
)
VALUES
(
    데이터1,
    데이터2,
    ..
);

 

※ 컬럼명1에 데이터1, 컬럼명2에 데이터2 이런식으로 순서대로 입력된다. 입력되지 않은 필드는 NULL값 혹은 디폴트값으로 채워진다.

 

* 필드 전체에 데이터를 입력하는 경우

 

1
2
3
4
5
6
7
INSERT INTO 테이블명
VALUES
(
    데이터1,
    데이터2,
    ..
);

     

※ 테이블 컬럼 순서대로 데이터가 입력된다.

 

 

UPDATE

: 이미 입력되어 있는 데이터를 변경, 수정한다.

 

1
2
3
4
5
6
UPDATE 테이블명
SET 
컬럼명1 = 수정할 데이터1,
컬럼명2 = 수정할 데이터2,
...
WHERE [조건식];

 

※ 모든 행의 컬럼의 데이터를 일괄 수정시 WHERE절을 제외하면 된다.

 

 

DELETE

: 입력되어있는 데이터를 삭제한다.

 

1
2
DELETE FROM 테이블명
WHERE [조건식];

 

※ 모든 행의 데이터를 일괄 삭제할 시 WHERE절을 제외.

 

 

SELECT

: 데이터를 조회하기 위한 명령어이다.

 

1
2
SELECT [ALL/DISTINCT] 조회할 컬럼명1, 컬럼명2, ...
FROM 테이블 명;

※ ALL/DISTINCT : ALL은 데이터 중복에 상관없이 모두 출력(디폴트), DISTINCT는 중복된 데이터를 제외하여 1건으로 처리.

 

* 모든 컬럼을 조회하고 싶을땐 *(애스터리스크)를 사용한다.

 

1
2
SELECT *
FROM 테이블 명;

 

 

* ALIAS : 조회된 결과의 컬럼에 별명을 붙임.

 

1
2
SELECT 컬럼명1 AS '별명1', 컬럼명2 AS '별명2', ..
FROM 테이블 명;

 

 

※ 기본적으로 작은따옴표(')를 생략 가능하나 별명에 공백이 있을 경우에는 반드시 사용한다. 


 

댓글()

SQL 기본 - 데이터 정의어, DDL(CREATE, ALTER, DROP)

웹 & 안드로이드/DataBase|2014. 2. 28. 16:30

 

 

CREATE TABLE

* 테이블을 생성하는 명령어.

 

* 기본적인 생성 sql문장

1
2
3
4
5
6
7
8
9
10
11
12
CREATE TABLE 테이블명
(
컬럼명1    데이터유형    [디폴트 값],
컬럼명2    데이터유형    [디폴트 값],
컬럼명3    데이터유형    [디폴트 값]
...
..
.
컬럼명n    데이터유형    [디폴트 값],
CONSTRAINT    제약조건 명     제약조건 종류     해당 컬럼명
);
 

 

* 제약조건의 종류

- PRIMARY KEY : 테이블에 저장된 행을 고유하게 식별하기 위한 기본 키. 하나의 테이블에 하나의 기본키 제약만 정의할 수 있다. UNIQUE KEY + not null과 같은 형태.

 

- UNIQUE KEY :  행을 고유하게 식별 할 수 있는 키. 기본키와 다르게 NULL이 허용.

 

- NOT NULL :  NULL값 입력을 금지. 입력 필수인 필드를 만든다.

 

- CHECK : 입력할 수 있는 값의 범위 등을 지정. TRUE, FALSE로 평가할 수 있는 논리식을 지정.

 

- FOREIGN KEY : 외래키. 다른 테이블의 기본키를 참조하는 키.

 

※ NULL의 의미는 공백(" "), 숫자 0과는 전혀 다른 값. 아직 정의되지 않은 미지의 값이나 현재 데이터를 입력하지 못하는 경우를 뜻함.

 

* SELECT 문장을 통해 테이블 생성이 가능하다.

1
2
3
CREATE TABLE 복사한 테이블 명
AS SELECT * FROM 원본 테이블 명;
 

 

 

 

ALTER TABLE

* 정의한 테이블 구조를 수정.

 

* ADD COLUMN, 컬럼 추가

: 기존의 테이블에 컬럼을 추가한다.

 

1
2
ALTER TABLE 테이블 명
ADD (추가할 컬럼명    데이터 유형    [제약조건]);

※ 이 경우 추가한 컬럼은 무조건 마지막에 붙는다. 순서를 조정 할 수 없다.

 

*  DROP COLUMN, 컬럼 삭제

: 기존에 존재한 컬럼을 삭제한다.

1
2
ALTER TABLE 테이블 명
DROP 컬럼명;

 

* MODIFY COLUMN, 컬럼 수정

: 기존의 컬럼의 정의 조건을 수정한다.

1
2
ALTER TABLE [테이블 명]
ALTER (컬럼명    데이터유형    [제약조건]); 

 

 

* RENAME COLUMN, 컬럼명 수정 (※ ANSI 표준이 아닌 ORACLE등의 일부 DBMS에만 적용.)

: 컬럼의 이름을 수정한다.

1
2
ALTER TABLE [테이블 명]
RENAME COLUMN    기존의 컬럼명    TO    수정할 컬럼명;

 

* DROP CONSTRAINT, 제약조건 삭제

: 테이블 생성시에 부여했던 제약조건을 삭제한다.

1
2
ALTER TABLE 테이블 명
DROP CONSTRAINT 제약조건 명;

 

 

* ADD CONSTRAINT, 제약조건 추가

: 제약조건을 추가한다

1
2
ALTER TABLE 테이블 명
ADD CONSTRAINT    제약조건 명   제약조건    컬럼명;

 

 

 

DROP TABLE

* 테이블을 완전히 삭제한다.

 

1
DROP TABLE 테이블명;

 

TRUNCATE TABLE

* 테이블 구조는 그대로 두고, 데이터 행만을 제거하는 명령어. 사용 후 테이블을 재사용 할 수 있다.

 

1
TRUNCATE TABLE 테이블 명;

 

 

모든 내용은 'SQL 전문가 가이드, 한국데이터베이스진흥원'에서 인용, 발췌하였습니다.

댓글()

나만의 쓰기 편한 db클래스 구현(2.17 수정)

웹 & 안드로이드/PHP|2014. 2. 14. 17:05

 

- 2.17 mysql함수로 쿼리 결과 나오도록 수정

 

- db클래스

: 객체를 여러개 만들 필요가 없기 때문에 싱글톤으로 구현.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
<?php 
class DB_mysql{
    /* singleton pattern. */
    private static $instance = null;
    
    private function __construct(){
    }
    public static function &getInstance(){
        if(self::$instance == null){
            self::$instance = new self();
        }
        return self::$instance;
    }
    
    /* Class start. */
    public $conn = null; #db connection info.
    
    //db connect.
    public function connect($host$id$pw$db_name){
        if(function_exists('mysqli_connect')){
            //mysqli function used.
            $this->conn = mysqli_connect($host$id$pw$db_name
                or die('error! db connect failed.<br />').mysqli_connect_error();
        }else{
            //mysql function used.
            $this->conn = mysql_connect($host$id$pw
                or die('error! db connect failed.<br />').mysql_error($this->conn);
            mysql_select_db($db_name$this->conn);
        }
    }
    
    //select query. $arr[row num][table field].
    public function query_of_select(&$sql){
 
        $arr = array();
        $result = $this->query($sql);
        
        if($result == ''return null;
        
        if(function_exists('mysqli_fetch_fields') and function_exists('mysqli_fetch_array')){
            $fieldsinfo = mysqli_fetch_fields($result);
            $row = null;
 
            $i = -1;
            do{
                foreach ($fieldsinfo as $field){
                    $arr[($i == -1)? 0: $i][$field->name] = ($i == -1)? 'null'$row[$field->name];
                }
                $i++;
            }while($row = mysqli_fetch_array($result));
            
            mysqli_free_result($result);
        
        }else{
            $fieldsinfo = array();
            $row = null;
 
            for($i = 0; $field = mysql_fetch_field($result); $i++){
                $fieldsinfo[$i] = $field;
            }
 
            $i = -1;
            do{
                foreach ($fieldsinfo as $field){
                    $arr[($i == -1)? 0: $i][$field->name] = ($i == -1)? 'null'$row[$field->name];
                }
                $i++;
            }while($row = mysql_fetch_array($result));
 
             mysql_free_result($result);#result 바로 자원 반납.
            
        }
        
        return $arr;
    }
    
    //insert, update, delete 나 create, alter, drop 등 결과가 없는 쿼리 전용.
    public function query_of_CUD(&$sql){
        return $this->query($sql);
    }
    
    //db에 쿼리 날림.
    private function query(&$sql){
        if(function_exists('mysqli_connect')){
            $result = mysqli_query($this->conn, $sql) and $sql = null; #db입력 후, sql변수 null로 초기화.
        }else{
            $result = mysql_query($sql$this->conn) and $sql = null;
        }
        return $result;
    }
    
    //db 접속 닫음.
    public function close(){
        function_exists('mysqli_close')
            ? mysqli_close($this->conn) 
            : mysql_close($this->conn);
    }
    
    //에러 출력.
    public function error(){
        echo function_exists('mysqli_error')
            ? mysqli_error($this->conn)
            : mysql_error($this->conn);
    }
 
    //테이블 형태로 출력.
    public static function print_result_totable($result){
        echo "<style>th{background-color:#aaaaaa;}td{border:black 1px solid;font-size:1em;}</style>";
        echo "<table>";
        echo "<tr><th></th>";
            foreach ($result[0] as $fieldname => $v){
                echo "<th>".$fieldname."</th>";
            }
            echo "</tr>";
        foreach ($result as $rownum => $row){
            echo "<tr><td>".($rownum+1)."</td>";
            foreach ($row as $value){
                echo "<td><center><xmp>".$value."</xmp></center></td>";
            }
            echo "</tr>";
        }
        echo "</table>";
    }
}
?>

 

-사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$db = DB_mysql::getInstance();
$db->connect('host''db_id''db_pw''db_name');
 
$sql = "select * from sboard";
 
$result = $db->query_of_select($sql);
echo "<table>";
foreach ($result as $rownum => $row){
    echo "<tr><td>".$rownum."행</td>";
    foreach ($row as $field => $value){
        echo "<td>".$field." : ".$value."</td>";
    }
    echo "</tr>";
}
echo "</table>";
 
$db->close();
?>

 

 

댓글()

[PHP] empty 함수

웹 & 안드로이드/PHP|2014. 2. 14. 11:17

empty함수를 통해 공백을 반환하는 경우

 

공백, 0(숫자든 문자든), null정도..

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
$t = '';//공백
echo empty($t)."<br />";//1 반환
 
$t = 0;//숫자 0
echo empty($t)."<br />";//1 반환
 
$t = null;//null
echo empty($t)."<br />";//1 반환
 
$t = '0';//문자 0
echo empty($t)."<br />";//1 반환
 
$t = "0";//문자 0
echo empty($t)."<br />";//1 반환
 
$t = 'null';//문자 null
echo empty($t)."<br />";//'' 반환
 
$t = "null";//문자 null
echo empty($t)."<br />";//'' 반환
 
$t = ' ';//문자 ' '
echo empty($t)."<br />";//'' 반환
 
$t = 1;//숫자 1
echo empty($t)."<br />";//'' 반환
 
$t = 's';//문자열
echo empty($t)."<br />";//'' 반환
?>

 

댓글()