[PHP] PDO 사용법 정리[PHP] PDO 사용법 정리

Posted at 2018. 3. 27. 09:26 | Posted in PHP
반응형

 

 

 

참고 : 바쁜 팀장님 대신 알려주는 신입 PHP 개발자 안내서

 

 

 

 

■ PDO(PHP Data Objects) 란?

 

 -. PDO(PHP Data Objects)는 여러 종류의 데이터베이스를 같은 방식으로 사용할 수 있게 해준다. 

 -. 그리고 PDOStatement와 데이터 바인딩을 통해 SQL 인젝션을 막아주고, 성능을 향상해준다.

 

 

 

 

■ PDO를 사용하면 좋은 점

 

 

 -. PDO(PHP Data Objects)는 같은 방법으로 여러 데이터베이스에 접근할 수 있게 해주는 PHP 확장 모듈입니다.

   (PHP는 데이터 베이스별로 확장 모듈을 가지고 있다.)

 -. PDO를 사용하면 MySQL, Oracle, MS SQL, PostgreSQL을 포함한 12개의 데이터 베이스를 같은 방식으로 다룰 수 있게 된다.

 

 

# 소스코드

<?php
    $dbHost = "localhost";      // 호스트 주소(localhost, 120.0.0.1)
    $dbName = "test_db";      // 데이타 베이스(DataBase) 이름
    $dbUser = "tester";          // DB 아이디
    $dbPass = "1q2w3e";        // DB 패스워드

    // PDO + MariaDB 연결하기
    $pdo = new PDO("mysql:host={$dbHost};dbname={$dbName}", $dbUser, $dbPass);
    $statement = $pdo -> query("SELECT CURDATE() AS date FROM DUAL");
    $row = $statement -> fetch(PDO::FETCH_ASSOC);
    echo htmlentities($row['date']);
?>

 

# 출력결과

 

 

 -. PDO를 사용하는 또 다른 이유는 준비 구문(Prepare Statements)을 활용할 수 있기 때문이다.

    준비 구문을 사용하면 SQL 인젝션 공격을 막을 수 있고, 애플리케이션의 성능이 향상된다.

 -. SQL 인젝션 취약점은 사용자 입력값과 함께 동적으로 쿼리를 만들 때 발생한다.

 

<?php
      $query = “UPATE tasks SET name = ‘{$name}’ WHERE id = ‘{$args[’id’]}’”;
?>

 

 -. 사용자가 입력한 $name과 $args[’id’]를 포함해서 동적으로 쿼리를 만들고 있다.

 -.  $name의 값에 해킹됐음’— 이 들어오면 ‘;—가 데이터가 이닌 SQL 코드로 인식되어 모든 데이터의 name 컬럼이 해킹됐음으로 변경된다.

 

<?php
$query = “UPATE tasks SET name = ‘해킹됐음’;—’ WHERE id = ‘{$args[’id’]}’”;
?>

 

 -. 준비 구문을 이용할 떄는 우선 SQL 코드를 정의하고 나중에 파라미터를 대입한다.

 

<?php
$stmt = $pdo -> prepare(”UPDATE tasks SET NAME = :name WHERE id = :id”);
$stmt = bindParam(”:name”, $name);
?> 

 

 -. 데이터베이스가 SQL 코드와 데이터를 명확히 구분할 수 있기 떄문에, 준비 구문을 쓰는 것만으로도 SQL인젝션 공격이 막힌다.

 -. 준비 구문을 만들고 값만 바꿔가며 여러 번 실행하는 경우 클라이언트와 서버 양쪽에서 쿼리 계획과 메타 정보를 캐시할 수 있게 되어

   애플리케이션 성능이 향상된다.

 

 

 

 

■ PDO 사용법

 

 

 

# 소스코드

<?php
    $dbHost = "localhost";      // 호스트 주소(localhost, 120.0.0.1)
    $dbName = "test_db";      // 데이타 베이스(DataBase) 이름
    $dbUser = "tester";          // DB 아이디
    $dbPass = "1q2w3e";        // DB 패스워드
    $dbChar = "utf8";            // 문자 인코딩

    // PDO 객체 생성 & DB 접속
    $dsn = "mysql:host={$dbHost};dbname={$dbName};charset={$dbChar}";
    $pdo = new PDO($dsn, $dbUser, $dbPass);

    // 쿼리를 담은 PDOStatement 객체 생성
    $stmt = $pdo -> prepare("SELECT * FROM girl_group WHERE name = :name");

    // PDOStatement 객체가 가진 쿼리의 파라메터에 변수 값을 바인드
    $stmt -> bindValue(":name", "나연");

    // PDOStatement 객체가 가진 쿼리를 실행
    $stmt -> execute();

    // PDOStatement 객체가 실행한 쿼리의 결과값 가져오기
    $row = $stmt -> fetch();

    echo "<pre>";
    print_r($row);
    echo "</pre>";
?>

 

 

 

# 출력결과

 

 

 

 

#01. 데이터베이스 연결

 

데이터베이스에 접속하기 위해서는 PDO 객체를 생성해야 한다. PDO 객체를 생성할 때는 데이터 소스 네임(DSN, Data Source Name)과

데이터 베이스 유저명 패스워드를 인자로 넘겨준다.

 

<?php
      $pdo = new PDO($dsn$dbUser$dbPass);
?>

 

일반적으로 DSN은 PDO 드라이버명:PDO 드라이버별 접속 문법의 형태로 구성된다.

각 PDO 드라이버별 접속 방법은 PDO 드라이버를 참고하면 된다.

 

<?php
      $dsn = "mysql:host={$dbHost};dbname={$dbName};charset={$dbChar}";
?>

 

 

 

 

#02. 쿼리 준비

 

쿼리 준비는 PDO::prepare 메소드를 이용한다.

PDO::prepare 메소드는 PDOStatement 객체를 반환한다.

 

<?php
      $pdoStatement = $pdo -> prepare("SELECT * FROM member WHERE name = :name OR email = :email");
?> 

 

① PDO::prepare로 준비하는 SQL구문은 파라미터를 가질 수 있다.
② 파라미터는 이름을 붙여주거나 물음표로 표시할 수 있다.
③ 이름을 붙인 파라미터는 위의 예제에서 보듯이 이름 앞에 를 붙여서 만든다.
④ 하나의 SQL 문장에 여러 파라미터가 있는 경우 모두 이름을 붙여주거나 모두 물음표로 표기해야 한다.
   (물음표보다는 이름을 붙인 파라미터가 내용을 이해하기 쉬우므로 될 수 있는대로 이름을 붙인 파라미터를 상용하는 것이 좋다.)

 

<?php
      $name = "이름";
      $email = "이메일";


      // 이름 붙인 파라미터를 사용할 때
      $pdoStatement = $pdo -> prepare("SELECT * FROM member WHERE name = :name OR email = :email");
      $pdoStatement = bindValue(":name", $name);
      $pdoStatement bindValue(":email", $email);


      // 물음표를 사용할때 파라미터가 많아지면 물음표(?)의 경우 순서를 파악하기 어려워 진다.
      $pdoStatement = $pdo -> prepare("SELECT * FROM member WHERE name =
OR email = ?");
      $pdoStatement bindValue(1, $name);
      $pdoStatement bindValue(2, $email);
?>

 

 

 

#03. 쿼리 파라미터에 값 배정(데이터 바인딩)

 

쿼리 파라미터에 값을 대입할 때는 PDOStatement:bindValue, PDOStatement::bindParam 두 가지 메소드를 이용한다.

binValue 메소드는 값을 집접 대입하고, bindParam은 변수를 대입한다.

 

 

# 소스코드 - bindValue를 사용한 경우

<?php
    $name = "Kei";


    $stmt = $pdo -> prepare("SELECT * FROM girl_group WHERE name = :name");


    $stmt -> bindValue(":name", $name); // 변수에 바인딩 하기 위해 bindValue을 사용
    $name = "서지수"; // 쿼리를 실행하기전에 $name 변수의 값을 변경한다.
    $stmt -> execute(); // WHERE name = "Kei"으로 실행된다.
    $row$stmt -> fetch(); // 객체가 실행한 쿼리의 결과값 가져오기


    echo "<pre>";
    print_r($row);
    echo "</pre>";
?>

 

 

 

# 출력결과 - bindValue를 사용한 경우

binvValue는 값 작체를 대입한다. 그래서 위와같이 변수에 새로운 값을 넣어도 반영되지 않는다.

 

 

# 소스코드 - bindParam를 사용한 경우

<?php
    $name = "유지애";


    $stmt = $pdo -> prepare("SELECT * FROM girl_group WHERE name = :name");


    $stmt -> bindParam(":name", $name); // 변수에 바인딩 하기 위해 bindParam을 사용
    $name = "정예인"; // 쿼리를 실행하기전에 $name 변수의 값을 변경한다.
    $stmt -> execute(); // WHERE name = "정예인"으로 실행된다.
    $row$stmt -> fetch(); // 객체가 실행한 쿼리의 결과값 가져오기


    echo "<pre>";
    print_r($row);
    echo "</pre>";
?>

 

 

 

# 출력결과 - bindParam를 사용한 경우

※ bindParam은 변수를 대입한것이기 때문에 대입한 이후에 값을 변경할 수 있다.

 

 

 

#04. 쿼리 실행

 

PDOStament 객체에 준비된 쿼리를 실행할 때는 PDOStatement::execute() 메소드를 사용한다.

 

<?php
    $pdoStatement = $pdo -> prepare("SELECT * FROM member WHERE name = :name OR email = :email");
    $pdoStatement -> bindValue(":name", $name);
    $pdoStatement -> bindValue(":email", $email);
    $pdoStatement -> execute();
?>

 

데이터 바인딩을 하지 않고, PDOStatment::execute() 메소드의 인수로 쿼리 파라미터에 사용할 값을 넘겨줄 수 있다.

 

<?php
    $pdoStatement = $pdo -> prepare("SELECT * FROM member WHERE name = ? OR email = ?");
    $pdoStatement -> execute([
    ":name" => $name
          , ":email" => $email
    ]);
?>

 

이렇게 쓸 경우에는 모든 데이터의 타입이 PDO::PARAM_STR로 처리된다.

데이터 타입을 지정하고 싶다면 PDOStatement::bindValue()나 PODStatement::bindParam()을 이용하면된다.

 

PDOStatement::execute() 메소드는 쿼리 실행이 성공했는지만 되돌려준다.

쿼리 실행 결과를 되돌려주지않는다는 점에 주의해야 한다.

 

추출한 데이터나 쿼리에 영향받은 행의 개수는 별도의 메소드를 이용해 조회해야 한다.

 

 

 

#05. 결과값 조회 - 데이터 가져오기

 

 

① PDOStatement:fetch()

 

쿼리 결과를 가져올 때는 PDOStatement:fetch() 메소드를 사용한다.

PDOStatement::fetch() 메소드를 한번 실행하면 쿼리 결과에서 한 행을 가져온다.

그래서 다음과 같이 반복문으로 모든 행을 가져와서 처리하는 경우가 많다.

 

# 소스코드

<?
    $dbHost = "localhost";
    $dbName = "test_db";
    $dbUser = "tester";
    $dbPass = "1q2w3e";
    $dbChar = "utf8";



    $dsn = "mysql:host={$dbHost};dbname={$dbName};charset={$dbChar}";
    $pdo = new PDO($dsn$dbUser$dbPass);



    $group = "REDVELVET";


    $stmt$pdo -> prepare("SELECT * FROM girl_group WHERE group_name = :group");
    $stmt -> bindValue(":group", $group);
    $stmt -> execute();


    $result = array();
    while($row$stmt -> fetch()) {
$result[] = $row;
    }


    echo "<pre>";
    print_r($result);
    echo "</pre>";
?>



 

# 출력결과

 

 

 

② PDOStatement:fetchAll()

 

한 번에 모든 행을 가져오고자 할 때는 PDOStatement::fetchAll() 메소드를 사용한다.

 

<?
    $dbHost = "localhost";
    $dbName = "test_db";
    $dbUser = "tester";
    $dbPass = "1q2w3e";
    $dbChar = "utf8";



    $dsn = "mysql:host={$dbHost};dbname={$dbName};charset={$dbChar}";
    $pdo = new PDO($dsn$dbUser$dbPass);



    $group = "REDVELVET";


    $stmt = $pdo -> prepare("SELECT * FROM girl_group WHERE group_name = :group");
    $stmt -> bindValue(":group", $group);
    $stmt -> execute();


    $result = $stmt -> fetchAll();


    echo "<pre>";
    print_r($result);
    echo "</pre>";
?>

 

 

 

 

PDOStatement::fetchAll()을 사용할 때 데어티베이스에서 조회한 값이 많으면 메모리 부족으로 웹 서버가 다운될 수 있다.

조회 결과가 적다는 확신이 있는 때에만 신중하게 사용해야 한다.

 

 

 

#06. 결과값 조회 - 모드 지정

 

 

결과를 가져오는 모드는 PDO::FETCH_로 시작하는 혜약 상수를 PDOStatement::fetch(), PDOStatment::fetchAll() 메소드의 인수로 넘겨주어 지정한다.

자주 사용하는 예약 상수는 아래와 같다.

 

 

① PDO::FETCH_BOTH

 

 -. PDOStatement::fetch(), PODStatement::fetchAll() 메소드에 가져오기 모드를 지정해주지 않으면 PDO:FETCH_BOTH 모드로 결과를 가져온다.

 -. PDO::FETCH_BOTH는 결과값을 가져올 때 데이터베이스의 칼럼 이름을 키로 사용하는 배열과 칼럼의 순서를 키로 사용하는 배열, 둘 다 만드는 방식이다.

 -. 두가지 배열을 만들기 때문에 당연히 성능은 좋지 않다.

 -. 될 수 있는대로 사용하고자 하는 모드를 지정해서 사용하는것이 좋다.

 

 

② PDO::FETCH_ASSOC

 

 -. 컬럼명을 키로 사용하는 연관 배열을 반환한다.

 -. 가져온 데이터는 $row['id']와 같은 식드로 사용한다.

 

 

# 소스코드

<?php
        $dbHost = "localhost";
        $dbName = "test_db";
        $dbUser = "tester";
        $dbPass = "1q2w3e";
        $dbChar = "utf8";

        $dsn = "mysql:host={$dbHost};dbname={$dbName};charset={$dbChar}";
        $pdo = new PDO($dsn$dbUser$dbPass);

        $stmt = $pdo -> prepare("SELECT * FROM girl_group WHERE name = :name");
        $stmt -> bindValue(":name", "사나");
        $stmt -> execute();


        $row = $stmt -> fetch(PDO::FETCH_ASSOC);


echo "그룹&nbsp;:&nbsp;".$row['group_name'];
echo "<br/>";
echo "이름&nbsp;:&nbsp;".$row['name'];
echo "<br/>";
echo "포지션&nbsp;:&nbsp;".$row['position'];
echo "<br/>";
echo "회사&nbsp;:&nbsp;".$row['company'];
?>

 

 

 

# 출력결과

 

 

 

PDO::FETCH_NUM

 

 -. 컬럼의 순서를 키로 사용하는 배여을 반환한다.

 -. 가져온 데이터는 $row[0] 과 같은 식으로 사용한다.

 

 

 PDO::FETCH_OBJ

 

 -. 객체로 반환한다.

 -. 반환된 객체는 데이터베이스 컬럼명에 해당하는 프로퍼티를 갖고 있다.

 -. 가져온 데이터는 $row - > id와 같이 사용할 수 있다.

 

 

 PDO::FETCH_CLASS

 

 -. 지정한 클래스의 객체로 반환한다.

 -. PDO::FETCH_OBJ와 마찬가지로 컬럼명에 해당하는 프로퍼티에 값을 가진다.

 

 

# 소스코드 - 클래스

<?php
class iDol {
private $idx;
private $name;
private $position;
private $group;
private $company;
private $birthDay;


public function getIdx() {
return $this -> idx;
}


public function getName() {
return $this -> name;
}


public function getPosition() {
return $this -> position;
}


public function getGroup() {
return $this -> group_name;
}


public function getCompany() {
return $this -> company;
}


public function getBirthDay() {
return $this -> birthDay;
}
}
?>

 

 

 

# 소스코드 - PDO::FETCH_CLASS를 사용한 출력

<?php
        $dbHost = "localhost";
        $dbName = "test_db";
        $dbUser = "tester";
        $dbPass = "1q2w3e";
        $dbChar = "utf8";

        $dsn = "mysql:host={$dbHost};dbname={$dbName};charset={$dbChar}";
        $pdo = new PDO($dsn$dbUser$dbPass);

        $stmt = $pdo -> prepare("SELECT * FROM girl_group WHERE name = :name");
        $stmt -> bindValue(":name", "다현");
        $stmt -> execute();

    
$stmt -> setFetchMode(PDO::FETCH_CLASS, "iDol");
$row = $stmt -> fetch();


echo $row -> getGroup();
echo "<br/>";
echo $row -> getName();
echo "<br/>";
echo $row -> getPosition();
echo "<br/>";
echo $row -> getCompany();
?>

 

 

 

# 출력결과

 

 

 

⑥ PDOStatement::fetchColumn() 

 

 -. PDOStatement::fetchColumn()은 결과값 중 하나의 컬럼값만 가져오는 메소드 이다.

 -. 데이터 수를 조회할 경우 처럼 단 하나의 컬럼값만 필요한 경우 유용하게 사용할 수 있다.

 

 

# 소스코드

<?php
        $dbHost = "localhost";
        $dbName = "test_db";
        $dbUser = "tester";
        $dbPass = "1q2w3e";
        $dbChar = "utf8";

        $dsn = "mysql:host={$dbHost};dbname={$dbName};charset={$dbChar}";
        $pdo = new PDO($dsn$dbUser$dbPass);



        $stmt = $pdo -> prepare("SELECT COUNT(*) AS count FROM girl_group WHERE group_name = :group");
        $stmt -> bindValue(":group", "TWICE");
        $stmt -> execute();


        $row = $stmt -> fetchColumn();


echo "트와이스&nbsp;인원&nbsp;:&nbsp;".$row;
?>

 

 

# 출력결과

 

 

 

⑦ PDO:lastInsertId()

 

  -. 데이터베이스에 새로운 데이터를 입력하고 id 혹은 index값을 바로 사용해야 하는경우가 있다.

  -. PDO::lastInsertId()를 객체를 이용하면 마지막으로 입력한 데이터의 id 혹은 index 값을 확인 할 수 있다.

  ※ PDOStatement가 아닌 PDO 객체를 사용하는것에 주의

 

 

 

# 소스코드

<?php
        $dbHost = "localhost";
        $dbName = "test_db";
        $dbUser = "tester";
        $dbPass = "1q2w3e";
        $dbChar = "utf8";



        $dsn = "mysql:host={$dbHost};dbname={$dbName};charset={$dbChar}";
        $pdo = new PDO($dsn$dbUser$dbPass);



        $stmt = $pdo -> prepare("
              INSERT INTO girl_group (name, position, group_name, company, birthday)
              VALUE (:name, :position, :group, :company:birthday)
        ");


$stmt -> bindValue(":name", "정채연");
$stmt -> bindValue(":position", "센터, 서브보컬");
        $stmt -> bindValue(":group", "DIA");
$stmt -> bindValue(":company", "MBK엔터테인먼트");
$stmt -> bindValue(":birthday", "1997-12-01 00:00:00");
        $stmt -> execute();


        $taskIdx$pdo -> lastInsertId();


echo "정채연&nbsp;등록번호&nbsp;:&nbsp;".$taskIdx;
?>

 

 

 

# 출력결과

 

 

 

 

 

☞ 관련 포스팅 : [PHP] PDO + SimpleSql 라이브러리를 이용한 쿼리사용

 

 

 

반응형
//

[Editor] Daum Open Editor 세팅하고 사용하기[Editor] Daum Open Editor 세팅하고 사용하기

Posted at 2018. 3. 26. 13:07 | Posted in API/DAUM 오픈 에디터
반응형




첨부파일 : editor.zip




■ 다음 오픈 에디터 세팅하고 사용하기




01. https://github.com/kakao/DaumEditor/tree/gh-pages/download/에 접속해서 다음에디터를 다운받자.




02. 화면 최하단을 보면 How to download 라고 적힌 유의사항이 적힌 부분이 있는데.

※ 이포스팅 에서는 작성시기의 안정화된 버저인 stable(7.4.X) 버전대를 사용하였다.




03. Stable(7.4.X)버전에서 가장 높은 버전대를 찾아 선택하고 클릭한다.




04. 해당 버전의 다운로드 페이지로 이동되면 아래 순서대로 작업을 수행한다.

 ① Download 버튼을 클릭한다.

 ② 확인 버튼을 클릭하여 daumeditor.zip 파일을 다운받는다.




05. 이제 다음 에디터 프로젝트를 수행할 폴더를 생성하고 아래 순서대로 작업을 진행한다.

 ① 다음 에디터 프로젝트를 진행할 editor 라는 폴더를 생성한다.

 ② 위에서 다운받은 daumeditor.zip 파일의 압축을 해제한다.

 ③ 압축해제된 폴더의 이름을 daumEditor로 변경하였다.





06. 이제 다음에디터를 불러와서 사용할 board.php 파일 생성한다.




07. 생성한 board.php 파일에 들어갈 소소는 아래와 같다.

 board.php

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>Daum 에디터</title>
<script src="https://code.jquery.com/jquery-1.12.4.min.js" type="text/javascript"></script>
<script type="text/javascript">
function saveContent() {
    if(jQuery("#title").val() == "") {
        alert("제목을 입력해 주세요.");
        jQuery("#title").focus();
        return;
    }

    Editor.save(); // 이 함수를 호출하여 글을 등록하면 된다.
}
</script>
</head>
<body>
<form name="tx_editor_form" id="tx_editor_form" action="view.php" method="post" enctype="multipart/form-data" accept-charset="utf-8">
&nbsp;<b>제목&nbsp;:</b>&nbsp;<input type="text" id="title" name="title" style="width:680px;"/>
<div style="height:10px;"></div>
<div style="width:750px;">
<?php
    include_once ("./daumEditor/editor.html");      // 다음 에디터를 include 한다.
?>
<div align="right"><input type="button" value="등록" onClick="saveContent();"/></div>
</div>
</form>
</body>
</html>




08. 다음으로 작성된 값을 출력할 view.php를 생성한다.




09. view.php에 들어갈 소스는 아래와 같다.

 view.php

<?php

    echo "<pre>";

    print_r($_POST);

    echo "</pre>";

?>




10. 이제 위에서 압축을 해제하 명칭을 변경한 daumEditor 폴더의 editor.html 파일을 수정한다.




11. editor.hml 파일을 수정한다. 아래 코드는 원래 적혀있던 주석들은 다 삭제해 두었다.
 ① 상대경로로 잡혀 있는 부분은 전부 절대경로로 변경하고 파란색 글씨로 표기하였다.

 ② 샘플로 들어가 있거나 board.php에서 미리 지정한기능 혹은 필요없어 삭제해도 되는 부분은 빨간색으로 표기하였다.

 editor.html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>Daum 에디터 - 등록화면 예제</title>


<!-- 절대 경로로 변경 -->

<link rel="stylesheet" href="http://localhost/editor/daumEditor/css/editor.css" type="text/css" charset="utf-8"/>

<script src="http://localhost/editor/daumEditor/js/editor_loader.js?environment=development" type="text/javascript" charset="utf-8"></script>


</head>

<body>

<div class="body">


<!-- form 태그 삭제 -->

<!-- <form name="tx_editor_form" id="tx_editor_form" action="http://posttestserver.com/post.php" method="post" accept-charset="utf-8"> -->


    <div id="tx_trex_container" class="tx-editor-container">

        <div id="tx_sidebar" class="tx-sidebar">

            <div class="tx-sidebar-boundary">

                <ul class="tx-bar tx-bar-left tx-nav-attach">

                    <li class="tx-list">

                        <div unselectable="on" id="tx_image" class="tx-image tx-btn-trans">

                            <a href="javascript:;" title="사진" class="tx-text">사진</a>

                        </div>

                    </li>

                    <li class="tx-list">

                        <div unselectable="on" id="tx_file" class="tx-file tx-btn-trans">

                            <a href="javascript:;" title="파일" class="tx-text">파일</a>

                        </div>

                    </li>

                    <li class="tx-list">

                        <div unselectable="on" id="tx_media" class="tx-media tx-btn-trans">

                            <a href="javascript:;" title="외부컨텐츠" class="tx-text">외부컨텐츠</a>

                        </div>

                    </li>

                    <li class="tx-list tx-list-extra">

                        <div unselectable="on" class="tx-btn-nlrbg tx-extra">

                            <a href="javascript:;" class="tx-icon" title="버튼 더보기">버튼 더보기</a>

                        </div>

                        <ul class="tx-extra-menu tx-menu" style="left:-48px;" unselectable="on"></ul>

                    </li>

                </ul>

                <ul class="tx-bar tx-bar-right">

                    <li class="tx-list">

                        <div unselectable="on" class="tx-btn-lrbg tx-fullscreen" id="tx_fullscreen">

                            <a href="javascript:;" class="tx-icon" title="넓게쓰기 (Ctrl+M)">넓게쓰기</a>

                        </div>

                    </li>

                </ul>

                <ul class="tx-bar tx-bar-right tx-nav-opt">

                    <li class="tx-list">

                        <div unselectable="on" class="tx-switchtoggle" id="tx_switchertoggle">

                            <a href="javascript:;" title="에디터 타입">에디터</a>

                        </div>

                    </li>

                </ul>

            </div>

        </div>

        <div id="tx_toolbar_basic" class="tx-toolbar tx-toolbar-basic"><div class="tx-toolbar-boundary">

            <ul class="tx-bar tx-bar-left">

                <li class="tx-list">

                    <div id="tx_fontfamily" unselectable="on" class="tx-slt-70bg tx-fontfamily">

                        <a href="javascript:;" title="글꼴">굴림</a>

                    </div>

                    <div id="tx_fontfamily_menu" class="tx-fontfamily-menu tx-menu" unselectable="on"></div>

                </li>

            </ul>

            <ul class="tx-bar tx-bar-left">

                <li class="tx-list">

                    <div unselectable="on" class="tx-slt-42bg tx-fontsize" id="tx_fontsize">

                        <a href="javascript:;" title="글자크기">9pt</a>

                    </div>

                    <div id="tx_fontsize_menu" class="tx-fontsize-menu tx-menu" unselectable="on"></div>

                </li>

            </ul>

            <ul class="tx-bar tx-bar-left tx-group-font">

                <li class="tx-list">

                    <div unselectable="on" class="tx-btn-lbg tx-bold" id="tx_bold">

                        <a href="javascript:;" class="tx-icon" title="굵게 (Ctrl+B)">굵게</a>

                    </div>

                </li>

                <li class="tx-list">

                    <div unselectable="on" class="tx-btn-bg tx-underline" id="tx_underline">

                        <a href="javascript:;" class="tx-icon" title="밑줄 (Ctrl+U)">밑줄</a>

                    </div>

                </li>

                <li class="tx-list">

                    <div unselectable="on" class="tx-btn-bg tx-italic" id="tx_italic">

                        <a href="javascript:;" class="tx-icon" title="기울임 (Ctrl+I)">기울임</a>

                    </div>

                </li>

                <li class="tx-list">

                    <div unselectable="on" class="tx-btn-bg tx-strike" id="tx_strike">

                        <a href="javascript:;" class="tx-icon" title="취소선 (Ctrl+D)">취소선</a>

                    </div>

                </li>

                <li class="tx-list">

                    <div unselectable="on" class="tx-slt-tbg tx-forecolor" id="tx_forecolor">

                        <a href="javascript:;" class="tx-icon" title="글자색">글자색</a>

                        <a href="javascript:;" class="tx-arrow" title="글자색 선택">글자색 선택</a>

                    </div>

                    <div id="tx_forecolor_menu" class="tx-menu tx-forecolor-menu tx-colorpallete" unselectable="on"></div>

                </li>

                <li class="tx-list">

                    <div unselectable="on" class="tx-slt-brbg tx-backcolor" id="tx_backcolor">

                        <a href="javascript:;" class="tx-icon" title="글자 배경색">글자 배경색</a>

                        <a href="javascript:;" class="tx-arrow" title="글자 배경색 선택">글자 배경색 선택</a>

                    </div>

                    <div id="tx_backcolor_menu" class="tx-menu tx-backcolor-menu tx-colorpallete" unselectable="on"></div>

                </li>

            </ul>

            <ul class="tx-bar tx-bar-left tx-group-align">

                <li class="tx-list">

                    <div unselectable="on" class="tx-btn-lbg tx-alignleft" id="tx_alignleft">

                        <a href="javascript:;" class="tx-icon" title="왼쪽정렬 (Ctrl+,)">왼쪽정렬</a>

                    </div>

                </li>

                <li class="tx-list">

                    <div unselectable="on" class="tx-btn-bg tx-aligncenter" id="tx_aligncenter">

                        <a href="javascript:;" class="tx-icon" title="가운데정렬 (Ctrl+.)">가운데정렬</a>

                    </div>

                </li>

                <li class="tx-list">

                    <div unselectable="on" class="tx-btn-bg tx-alignright" id="tx_alignright">

                        <a href="javascript:;" class="tx-icon" title="오른쪽정렬 (Ctrl+/)">오른쪽정렬</a>

                    </div>

                </li>

                <li class="tx-list">

                    <div unselectable="on" class="tx-btn-rbg tx-alignfull" id="tx_alignfull">

                        <a href="javascript:;" class="tx-icon" title="양쪽정렬">양쪽정렬</a>

                    </div>

                </li>

            </ul>

            <ul class="tx-bar tx-bar-left tx-group-tab">

                <li class="tx-list">

                    <div unselectable="on" class="tx-btn-lbg tx-indent" id="tx_indent">

                        <a href="javascript:;" title="들여쓰기 (Tab)" class="tx-icon">들여쓰기</a>

                    </div>

                </li>

                <li class="tx-list">

                    <div unselectable="on" class="tx-btn-rbg tx-outdent" id="tx_outdent">

                        <a href="javascript:;" title="내어쓰기 (Shift+Tab)" class="tx-icon">내어쓰기</a>

                    </div>

                </li>

            </ul>

            <ul class="tx-bar tx-bar-left tx-group-list">

                <li class="tx-list">

                    <div unselectable="on" class="tx-slt-31lbg tx-lineheight" id="tx_lineheight">

                        <a href="javascript:;" class="tx-icon" title="줄간격">줄간격</a>

                        <a href="javascript:;" class="tx-arrow" title="줄간격">줄간격 선택</a>

                    </div>

                    <div id="tx_lineheight_menu" class="tx-lineheight-menu tx-menu" unselectable="on"></div>

                </li>

                <li class="tx-list">

                    <div unselectable="on" class="tx-slt-31rbg tx-styledlist" id="tx_styledlist">

                        <a href="javascript:;" class="tx-icon" title="리스트">리스트</a>

                        <a href="javascript:;" class="tx-arrow" title="리스트">리스트 선택</a>

                    </div>

                    <div id="tx_styledlist_menu" class="tx-styledlist-menu tx-menu" unselectable="on"></div>

                </li>

            </ul>

            <ul class="tx-bar tx-bar-left tx-group-etc">

                <li class="tx-list">

                    <div unselectable="on" class="tx-btn-lbg tx-emoticon" id="tx_emoticon">

                        <a href="javascript:;" class="tx-icon" title="이모티콘">이모티콘</a>

                    </div>

                    <div id="tx_emoticon_menu" class="tx-emoticon-menu tx-menu" unselectable="on"></div>

                </li>

                <li class="tx-list">

                    <div unselectable="on" class="tx-btn-bg tx-link" id="tx_link">

                        <a href="javascript:;" class="tx-icon" title="링크 (Ctrl+K)">링크</a>

                    </div>

                    <div id="tx_link_menu" class="tx-link-menu tx-menu"></div>

                </li>

                <li class="tx-list">

                    <div unselectable="on" class="tx-btn-bg tx-specialchar" id="tx_specialchar">

                        <a href="javascript:;" class="tx-icon" title="특수문자">특수문자</a>

                    </div>

                    <div id="tx_specialchar_menu" class="tx-specialchar-menu tx-menu"></div>

                </li>

                <li class="tx-list">

                    <div unselectable="on" class="tx-btn-bg tx-table" id="tx_table">

                        <a href="javascript:;" class="tx-icon" title="표만들기">표만들기</a>

                    </div>

                    <div id="tx_table_menu" class="tx-table-menu tx-menu" unselectable="on">

                        <div class="tx-menu-inner">

                            <div class="tx-menu-preview"></div>

                            <div class="tx-menu-rowcol"></div>

                            <div class="tx-menu-deco"></div>

                            <div class="tx-menu-enter"></div>

                        </div>

                    </div>

                </li>

                <li class="tx-list">

                    <div unselectable="on" class="tx-btn-rbg tx-horizontalrule" id="tx_horizontalrule">

                        <a href="javascript:;" class="tx-icon" title="구분선">구분선</a>

                    </div>

                    <div id="tx_horizontalrule_menu" class="tx-horizontalrule-menu tx-menu" unselectable="on"></div>

                </li>

            </ul>

            <ul class="tx-bar tx-bar-left">

                <li class="tx-list">

                    <div unselectable="on" class="tx-btn-lbg tx-richtextbox" id="tx_richtextbox">

                        <a href="javascript:;" class="tx-icon" title="글상자">글상자</a>

                    </div>

                    <div id="tx_richtextbox_menu" class="tx-richtextbox-menu tx-menu">

                        <div class="tx-menu-header">

                            <div class="tx-menu-preview-area">

                                <div class="tx-menu-preview"></div>

                            </div>

                            <div class="tx-menu-switch">

                                <div class="tx-menu-simple tx-selected"><a><span>간단 선택</span></a></div>

                                <div class="tx-menu-advanced"><a><span>직접 선택</span></a></div>

                            </div>

                        </div>

                        <div class="tx-menu-inner"></div>

                        <div class="tx-menu-footer">

                            <!-- 이미지 파일 경로 수정 -->

                            <img class="tx-menu-confirm" src="http://localhost/editor/daumEditor/images/icon/editor/btn_confirm.gif?rv=1.0.1" alt=""/>

                            <img class="tx-menu-cancel" hspace="3" src="http://localhost/editor/daumEditor/images/icon/editor/btn_cancel.gif?rv=1.0.1" alt=""/>

                        </div>

                    </div>

                </li>

                <li class="tx-list">

                    <div unselectable="on" class="tx-btn-bg tx-quote" id="tx_quote">

                        <a href="javascript:;" class="tx-icon" title="인용구 (Ctrl+Q)">인용구</a>

                    </div>

                    <div id="tx_quote_menu" class="tx-quote-menu tx-menu" unselectable="on"></div>

                </li>

                <li class="tx-list">

                    <div unselectable="on" class="tx-btn-bg tx-background" id="tx_background">

                        <a href="javascript:;" class="tx-icon" title="배경색">배경색</a>

                    </div>

                    <div id="tx_background_menu" class="tx-menu tx-background-menu tx-colorpallete" unselectable="on"></div>

                </li>

                <li class="tx-list">

                    <div unselectable="on" class="tx-btn-rbg tx-dictionary" id="tx_dictionary">

                        <a href="javascript:;" class="tx-icon" title="사전">사전</a>

                    </div>

                </li>

            </ul>

            <ul class="tx-bar tx-bar-left tx-group-undo">

                <li class="tx-list">

                    <div unselectable="on" class="tx-btn-lbg tx-undo" id="tx_undo">

                        <a href="javascript:;" class="tx-icon" title="실행취소 (Ctrl+Z)">실행취소</a>

                    </div>

                </li>

                <li class="tx-list">

                    <div unselectable="on" class="tx-btn-rbg tx-redo" id="tx_redo">

                        <a href="javascript:;" class="tx-icon" title="다시실행 (Ctrl+Y)">다시실행</a>

                    </div>

                </li>

            </ul>

            <ul class="tx-bar tx-bar-right">

                <li class="tx-list">

                    <div unselectable="on" class="tx-btn-nlrbg tx-advanced" id="tx_advanced">

                        <a href="javascript:;" class="tx-icon" title="툴바 더보기">툴바 더보기</a>

                    </div>

                </li>

            </ul>

        </div>

    </div>

    <div id="tx_toolbar_advanced" class="tx-toolbar tx-toolbar-advanced"><div class="tx-toolbar-boundary">

        <ul class="tx-bar tx-bar-left">

            <li class="tx-list">

                <div class="tx-tableedit-title"></div>

            </li>

        </ul>

        <ul class="tx-bar tx-bar-left tx-group-align">

            <li class="tx-list">

                <div unselectable="on" class="tx-btn-lbg tx-mergecells" id="tx_mergecells">

                    <a href="javascript:;" class="tx-icon2" title="병합">병합</a>

                </div>

                <div id="tx_mergecells_menu" class="tx-mergecells-menu tx-menu" unselectable="on"></div>

            </li>

            <li class="tx-list">

                <div unselectable="on" class="tx-btn-bg tx-insertcells" id="tx_insertcells">

                    <a href="javascript:;" class="tx-icon2" title="삽입">삽입</a>

                </div>

                <div id="tx_insertcells_menu" class="tx-insertcells-menu tx-menu" unselectable="on"></div>

            </li>

            <li class="tx-list">

                <div unselectable="on" class="tx-btn-rbg tx-deletecells" id="tx_deletecells">

                    <a href="javascript:;" class="tx-icon2" title="삭제">삭제</a>

                </div>

                <div id="tx_deletecells_menu" class="tx-deletecells-menu tx-menu" unselectable="on"></div>

            </li>

        </ul>

        <ul class="tx-bar tx-bar-left tx-group-align">

            <li class="tx-list">

                <div id="tx_cellslinepreview" unselectable="on" class="tx-slt-70lbg tx-cellslinepreview">

                    <a href="javascript:;" title="선 미리보기"></a>

                </div>

                <div id="tx_cellslinepreview_menu" class="tx-cellslinepreview-menu tx-menu" unselectable="on"></div>

            </li>

            <li class="tx-list">

                <div id="tx_cellslinecolor" unselectable="on" class="tx-slt-tbg tx-cellslinecolor">

                    <a href="javascript:;" class="tx-icon2" title="선색">선색</a>

                    <div class="tx-colorpallete" unselectable="on"></div>

                </div>

                <div id="tx_cellslinecolor_menu" class="tx-cellslinecolor-menu tx-menu tx-colorpallete" unselectable="on"></div>

            </li>

            <li class="tx-list">

                <div id="tx_cellslineheight" unselectable="on" class="tx-btn-bg tx-cellslineheight">

                    <a href="javascript:;" class="tx-icon2" title="두께">두께</a>

                </div>

                <div id="tx_cellslineheight_menu" class="tx-cellslineheight-menu tx-menu" unselectable="on"></div>

            </li>

            <li class="tx-list">

                <div id="tx_cellslinestyle" unselectable="on" class="tx-btn-bg tx-cellslinestyle">

                    <a href="javascript:;" class="tx-icon2" title="스타일">스타일</a>

                </div>

                <div id="tx_cellslinestyle_menu" class="tx-cellslinestyle-menu tx-menu" unselectable="on"></div>

            </li>

            <li class="tx-list">

                <div id="tx_cellsoutline" unselectable="on" class="tx-btn-rbg tx-cellsoutline">

                    <a href="javascript:;" class="tx-icon2" title="테두리">테두리</a>

                </div>

                <div id="tx_cellsoutline_menu" class="tx-cellsoutline-menu tx-menu" unselectable="on"></div>

            </li>

        </ul>

        <ul class="tx-bar tx-bar-left">

            <li class="tx-list">

                <div id="tx_tablebackcolor" unselectable="on" class="tx-btn-lrbg tx-tablebackcolor" style="background-color:#9aa5ea;">

                    <a href="javascript:;" class="tx-icon2" title="테이블 배경색">테이블 배경색</a>

                </div>

                <div id="tx_tablebackcolor_menu" class="tx-tablebackcolor-menu tx-menu tx-colorpallete" unselectable="on"></div>

            </li>

        </ul>

        <ul class="tx-bar tx-bar-left">

            <li class="tx-list">

                <div id="tx_tabletemplate" unselectable="on" class="tx-btn-lrbg tx-tabletemplate">

                    <a href="javascript:;" class="tx-icon2" title="테이블 서식">테이블 서식</a>

                </div>

                <div id="tx_tabletemplate_menu" class="tx-tabletemplate-menu tx-menu tx-colorpallete" unselectable="on"></div>

            </li>

        </ul>

    </div>

</div>


    <div id="tx_canvas" class="tx-canvas">

        <div id="tx_loading" class="tx-loading">

            <!-- 이미지 파일 경로 수정 -->

            <div><img src="http://localhost/editor/daumEditor/images/icon/editor/loading2.png" width="113" height="21" align="absmiddle"/></div>

        </div>

        <div id="tx_canvas_wysiwyg_holder" class="tx-holder" style="display:block;">

            <iframe id="tx_canvas_wysiwyg" name="tx_canvas_wysiwyg" allowtransparency="true" frameborder="0"></iframe>

        </div>

        <div class="tx-source-deco">

            <div id="tx_canvas_source_holder" class="tx-holder">

                <textarea id="tx_canvas_source" rows="30" cols="30"></textarea>

            </div>

        </div>

        <div id="tx_canvas_text_holder" class="tx-holder">

            <textarea id="tx_canvas_text" rows="30" cols="30"></textarea>

        </div>

    </div>


    <div id="tx_resizer" class="tx-resize-bar">

        <div class="tx-resize-bar-bg"></div>

        <!-- 이미지 파일 경로 수정 -->

        <img id="tx_resize_holder" src="http://localhost/editor/daumEditor/images/icon/editor/skin/01/btn_drag01.gif" width="58" height="12" unselectable="on" alt=""/>

    </div>


    <!-- 다음 에디터 로고 삭제 -->

    <!--

    <div class="tx-side-bi" id="tx_side_bi">

        <div style="text-align: right;">

            <img hspace="4" height="14" width="78" align="absmiddle" src="http://localhost/editor/daumEditor/images/icon/editor/editor_bi.png" />

        </div>

    </div>

    -->


    <div id="tx_attach_div" class="tx-attach-div">

        <div id="tx_attach_txt" class="tx-attach-txt">파일 첨부</div>

            <div id="tx_attach_box" class="tx-attach-box">

                <div class="tx-attach-box-inner">

                    <div id="tx_attach_preview" class="tx-attach-preview">

                        <p></p>

                        <!-- 이미지 파일 경로 수정 -->

                        <img src="http://localhost/editor/daumEditor/images/icon/editor/pn_preview.gif" width="147" height="108" unselectable="on"/>

                    </div>

                    <div class="tx-attach-main">

                        <div id="tx_upload_progress" class="tx-upload-progress">

                            <div>0%</div>

                            <p>파일을 업로드하는 중입니다.</p>

                        </div>

                        <ul class="tx-attach-top">

                            <li id="tx_attach_delete" class="tx-attach-delete">

                                <a>전체삭제</a>

                            </li>

                            <li id="tx_attach_size" class="tx-attach-size">

                                파일: <span id="tx_attach_up_size" class="tx-attach-size-up"></span>/<span id="tx_attach_max_size"></span>

                            </li>

                            <li id="tx_attach_tools" class="tx-attach-tools"></li>

                        </ul>

                        <ul id="tx_attach_list" class="tx-attach-list"></ul>

                    </div>

                </div>

            </div>

        </div>

    </div>

   

<!-- form 태그 삭제 -->

<!-- </form> -->



<!-- 에디터 끝 -->

<script type="text/javascript">

    var config = {

          txHost : ""

        , txPath : ""

        , txService : "sample"

        , txProject : "sample"

        , initializedId : ""

        , wrapper : "tx_trex_container"

        , form : "tx_editor_form" + ""

        , txIconPath : "http://localhost/editor/daumEditor/images/icon/editor/"

        , txDecoPath : "http://localhost/editor/daumEditor/images/deco/contents/"

        , canvas: {

            exitEditor:{ }

            , styles: {

                  color : "#123456"

                , fontFamily : "굴림"

                , fontSize : "10pt"

                , backgroundColor : "#FFFFFF"

                , lineHeight : "1.5"

                , padding : "8px"

            }

            , showGuideArea: false

        }

        , events : {

            preventUnload: false

        }

        , sidebar : {

            attachbox : {

                show : true,

                confirmForDeleteAll : true

            }

        }

        , size: {

            contentWidth : 700

        }

    };

    EditorJSLoader.ready(function(Editor) {

        var editor = new Editor(config);

    });

</script>

<script type="text/javascript">

    /* saveContent( )함수 삭제 ( board.php 파일에서 호출 하게 끔 변경 함 ) */

    /*

    function saveContent() {

        Editor.save(); // 이 함수를 호출하여 글을 등록하면 된다.

    }

    */


    function validForm(editor) {

        var validator = new Trex.Validator();

        var content = editor.getContent();

        if (!validator.exists(content)) {

            alert("내용을 입력하세요");

            return false;

        }

        return true;

    }


    function setForm(editor) {

        var i = "";

        var input = "";

        var form = editor.getForm();

        var content = editor.getContent();


        var textarea = document.createElement('textarea');

        textarea.name = "content";

        textarea.value = content;

        form.createField(textarea);


        var images = editor.getAttachments('image');

        for(i = 0; i < images.length; i++) {

            if (images[i].existStage) {

                alert("attachment information - image[" + i + "] \r\n" + JSON.stringify(images[i].data));

                input = document.createElement('input');

                input.type = "hidden";

                input.name = "attach_image";

                input.value = images[i].data.imageurl;

                form.createField(input);

            }

        }


        var files = editor.getAttachments('file');

        for(i = 0; i < files.length; i++) {

            input = document.createElement('input');

            input.type = "hidden";

            input.name = "attach_file";

            input.value = files[i].data.attachurl;

            form.createField(input);

        }

        return true;

    }

</script>


<!-- 저장 버튼 삭제 ( saveContent( ) 함수는 board.php에서 호출하게 변경 ) -->

<!-- <div><button onclick="saveContent()">SAMPLE - submit contents</button></div> -->


<!-- 샘플 컨텐츠 추가 내용 삭제 -->

<!--

<textarea id="sample_contents_source" style="display:none;">

    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>

    <p style="text-align: center;">

        <img src="https://t1.daumcdn.net/cfile/blog/2064CD374EE1ACCB0F" class="tx-daum-image" style="clear:none;float:none;"/>

    </p>

    <p>

        <a href="https://t1.daumcdn.net/cfile/blog/207C8C1B4AA4F5DC01"><img src="snapshot/images/icon/p_gif_s.gif"/> editor_bi.gif</a>

    </p>

</textarea>

-->


<!-- 샘플 스크립트 삭제 -->

<!--

<script type="text/javascript">

    function loadContent() {

        var attachments = {};

        attachments['image'] = [];

        attachments['image'].push({

              "attacher": "image"

            , "data": {

                "imageurl" : "https://t1.daumcdn.net/cfile/blog/2064CD374EE1ACCB0F"

                , "filename" : "github.gif"

                , "filesize" : 59501

                , "originalurl" : "https://t1.daumcdn.net/cfile/blog/2064CD374EE1ACCB0F"

                , "thumburl" : "https://t1.daumcdn.net/cfile/blog/2064CD374EE1ACCB0F"

            }

        });

        attachments['file'] = [];

        attachments['file'].push({

              "attacher" : "file"

            , "data" : {

                  "attachurl" : "https://t1.daumcdn.net/cfile/blog/207C8C1B4AA4F5DC01"

                , "filemime" : "image/gif"

                , "filename" : "editor_bi.gif"

                , "filesize" : 640

            }

        });

        Editor.modify({

            "attachments": function() {

                var allattachments = [];

                for (var i in attachments) {

                    allattachments = allattachments.concat(attachments[i]);

                }

                return allattachments;

            }(),

            "content" : document.getElementById("sample_contents_source")

        });

    }

</script>

-->


<!-- 샘플 버튼 삭제 -->

<!-- <div><button onclick='loadContent()'>SAMPLE - load contents to editor</button></div> -->


</body>

</html>




12. 이제 board.php를 실행하고 다음에디터가 잘 실행되는 지 확인해 보자.

    정상적으로 출력이 된다면 제목과 내용을 작성한뒤 등록버튼을 클릭해보자.




13. 아래와같이 결과가 잘 전송되어 출려되는 모습을 확인 할 수 있다.





반응형
//

[jQuery] 테이블(TABLE) 행(ROW) 순서위치 이동시키기[jQuery] 테이블(TABLE) 행(ROW) 순서위치 이동시키기

Posted at 2018. 3. 22. 14:01 | Posted in JavaScript & jQuery/jQuery
반응형




참고 : http://ktsmemo.cafe24.com/s/jQueryTip/64




■ 테이블 행(ROW) 위치 이동시키기




# 소스코드

<html>

<head>

<title>:: 테이블 행(ROW) 위치 이동하기 ::</title>

<script src="http://code.jquery.com/jquery-1.12.4.js"></script>

<script type="text/javascript">

function checkeRowColorChange(obj) {

// 체크된 라디오 박스의 행(row)에 강조색깔로 바꾸기 전 모든 행(row)의 백그라운드를 흰색으로 변경한다.

jQuery("#girlTbody > tr").css("background-color", "#FFFFFF");


// 체크된 라디오 박스의 행이 몇번째에 위치하는지 파악한다.

var row = jQuery(".chkRadio").index(obj);


// 체크된 라디오 박스의 행(row)의 색깔을 변경한다.

jQuery("#girlTbody > tr").eq(row).css("background-color", "#FAF4C0");

}


function rowMoveEvent(direction) {

// 체크된 행(row)의 존재 여부를 파악한다.

if(jQuery(".chkRadio:checked").val()) {


// 체크된 라디오 박스의 행(row)을 변수에 담는다.

var row = jQuery(".chkRadio:checked").parent().parent();


                // 체크된 행(row)의 이동 한계점을 파악하기 위해 인덱스를 파악한다.

var num = row.index();


// 전체 행의 개수를 구한다.

var max = (jQuery(".chkRadio").length - 1); // index는 0부터 시작하기에 -1을 해준다.


if(direction == "up") {


if(num == 0) { 


// 체크된 행(row)의 위치가 최상단에 위치해 있을경우 더이상 올라갈 수 없게 막는다.

alert("첫번째로 지정되어 있습니다.\n더이상 순서를 변경할 수 없습니다.");

return false;

} else {


// 체크된 행(row)을 한칸 위로 올린다.

row.prev().before(row);

}

} else if(direction == "down") {


if(num >= max) {


// 체크된 행(row)의 위치가 최하단에 위치해 있을경우 더이상 내려갈 수 없게 막는다.

alert("마지막으로 지정되어 있습니다.\n더이상 순서를 변경할 수 없습니다.");

return false;

} else {


// 체크된 행(row)을 한칸 아래로 내린다.

row.next().after(row);

}

}


} else {

alert("선택된 행이 존재하지 않습니다\n위치를 이동시킬 행을 하나 선택해 주세요.");

}

}

</script>

</head>

<body>

<table border="1" cellspacing="0">

<thead style="background-color:#000080;font-weight:bold;color:#FFFFFF;">

<tr>

<th style="width:30px;"></th>

<th style="width:100px;">:: 가수 ::</th>

<th style="width:300px;">:: 노래 제목 ::</th>

<th style="width:100px;">:: 발매일 ::</th>

</tr>

</thead>

<tbody id="girlTbody" style="text-align:center;">

<tr>

<td><input type="radio" class="chkRadio" name="chkRadio" onClick="checkeRowColorChange(this);"></td>

<td>트와이스</td>

<td style="text-align:left;">하트 쉐이커(Heart Shaker)</td>

<td>2017-12-11</td>

</tr>

<tr>

<td><input type="radio" class="chkRadio" name="chkRadio" onClick="checkeRowColorChange(this);"></td>

<td>레드벨벳</td>

<td style="text-align:left;">빨간 맛(Red Flavor)</td>

<td>2017-07-09</td>

</tr>

<tr>

<td><input type="radio" class="chkRadio" name="chkRadio" onClick="checkeRowColorChange(this);"></td>

<td>러블리즈</td>

<td style="text-align:left;">종소리(Twinkle)</td>

<td>2017-11-14</td>

</tr>

<tr>

<td><input type="radio" class="chkRadio" name="chkRadio" onClick="checkeRowColorChange(this);"></td>

<td>모모랜드</td>

<td style="text-align:left;">뿜뿜(BBoomBBoom)</td>

<td>2018-01-03</td>

</tr>

<tr>

<td><input type="radio" class="chkRadio" name="chkRadio" onClick="checkeRowColorChange(this);"></td>

<td>여자친구</td>

<td style="text-align:left;">귀를 기울이면(Love Whisper)</td>

<td>2017-08-01</td>

</tr>

</tbody>

<tfoot style="background-color:#A9A9A9;">

<tr>

<td colspan="4" style="text-align:center;">

<input type="button" onClick="rowMoveEvent('up');" value="▲" style="width:50px;"/>

&nbsp;&nbsp;

<input type="button" onClick="rowMoveEvent('down');" value="▼" style="width:50px;"/>

</td>

</tr>

</tfoot>

</table>

</body>

</html> 




# 출력결과





반응형
//

[PHP] PHPExcel 엑셀 파일 업로드 하고 내용 읽기[PHP] PHPExcel 엑셀 파일 업로드 하고 내용 읽기

Posted at 2018. 3. 22. 09:37 | Posted in PHP/PHP Library
반응형




■ 엑셀(*.xls) 파일 업로드 하고 내용 읽기




# 소스코드 - 엑셀 파일 업로드 excel_upload.php

<html>
<head>
<title>:: PHPExcel 파일읽기 ::</title>
</head>
<form enctype="multipart/form-data" action="./excel_read.php" method="post">
<table border="1">
    <tr>
        <th style="background-color:#DCDCDC">파일</th>
        <td><input type="file" name="excelFile"/></td>
    </tr>
    <tr>
        <th style="background-color:#DCDCDC">등록</th>
        <td style="text-align:center;"><input type="submit" value="업로드"/></td>
    </tr>
</form>
</html>

<html>

<head>

<title>:: PHPExcel 파일읽기 ::</title>

</head>

<form enctype="multipart/form-data" action="./excel_read.php" method="post">

<table border="1">

<tr>

<th style="background-color:#DCDCDC">파일</th>

<td><input type="file" name="excelFile"/></td>

</tr>

<tr>

<th style="background-color:#DCDCDC">등록</th>

<td style="text-align:center;"><input type="submit" value="업로드"/></td>

</tr>

</form>

</html>



출처: http://wickedmagic.tistory.com/584?category=613655 [사악미소의 현대마법의 공방]




# 소스코드 - 엑셀 파일 읽기 excel_read.php

<?php
include "./Classes/PHPExcel.php";

$objPHPExcel = new PHPExcel();

// 엑셀 데이터를 담을 배열을 선언한다.
$allData = array();

// 파일의 저장형식이 utf-8일 경우 한글파일 이름은 깨지므로 euc-kr로 변환해준다.
$filename = iconv("UTF-8", "EUC-KR", $_FILES['excelFile']['tmp_name']);

try {

    // 업로드한 PHP 파일을 읽어온다.
    $objPHPExcel = PHPExcel_IOFactory::load($filename);

    $extension = strtoupper(pathinfo($filename, PATHINFO_EXTENSION));
    $sheetsCount = $objPHPExcel -> getSheetCount();

    // 시트Sheet별로 읽기
    for($sheet = 0; $sheet < $sheetsCount; $sheet++) {

          $objPHPExcel -> setActiveSheetIndex($sheet);
          $activesheet = $objPHPExcel -> getActiveSheet();
          $highestRow = $activesheet -> getHighestRow();             // 마지막 행
          $highestColumn = $activesheet -> getHighestColumn();    // 마지막 컬럼

          // 한줄읽기
          for($row = 1; $row <= $highestRow; $row++) {

            // $rowData가 한줄의 데이터를 셀별로 배열처리 된다.
            $rowData = $activesheet -> rangeToArray("A" . $row . ":" . $highestColumn . $row, NULL, TRUE, FALSE);

            // $rowData에 들어가는 값은 계속 초기화 되기때문에 값을 담을 새로운 배열을 선안하고 담는다.
            $allData[$row] = $rowData[0];
          }
    }
} catch(exception $exception) {
    echo $exception;
}

echo "<pre>";
print_r($allData);
echo "</pre>";
?>




# 출력결과 - 엑셀 파일 업로드




# 출력결과 - 엑셀 내용 출력





반응형
//