회사의 API서버가 무려 ASP CLASSIC으로 되어 있었습니다.

같은 서버에 다행히 PHP도 설치가 되어있어서, 서버 구성에 손대지 않고 API를 이 참에 다 갈아엎고자 PHP로 작업을 진행하고 있습니다.

 보통 mysql(maria db)과 많이 사용하여서 Mssql과 연동하는 작업은 전무했던터라 자주사용하는 소스를 공유드리고자 합니다.


1. DB 접속정보를 갖고 있는 config.php

 config.php를 생성하여 상수로 자주 사용할 정보들을 define 해줍니다.

<?php
	// IP는 예시이므로 사용하실 IP로 변경해주세요
    // DB 주소 (메인 DB와 테스트 DB를 사용)
    define('DB_MAIN','192.100.100.111');
    define('DB_TEST','192.100.100.112');

	// 데이터베이스 이름
    define('DB_EMPL','사원관리DB');
    define('DB_SALARY','급여관리DB');

	// DB 접속 정보
    define('DB_ID_ADMIN','id_admin');
    define('DB_PW_ADMIN','pw_admin');

	// 인코딩 
    define('DB_CHARACTERSET','UTF-8');

?>

2. config.php를 include 해주고 같은 경로에 select.php 라는 예제 파일을 아래와 같이 작성해보겠습니다.

각 코드별로 주석을 기재하였으나 어려우신 분들은 언제든 댓글 달아주세요 :)

<?php
    header('Content-Type: text/html; charset=utf-8');

    // 테스트할 때 모든 에러를 출력해주는게 좋습니다.
    error_reporting( E_ALL ); 
    ini_set( "display_errors", 1 );

    // DB 연결과 관련한 상수에 대한 값을 불러와줍니다.
    // 예를들어 select.php, update.php 등의 CRUD 작업페이지가 여러개라 할 때, DB의 접속 정보가 변경된 상황이 발생할 경우 
    // Config.php만 변경해주면 됩니다. 
    include 'config.php';
?>

<html>
    <head>
    <meta charset="utf-8">
    </head>

    <body>
        <?php
        // 연결할 MSSQL 서버에 대한 정보를 입력해줍니다.
        $serverName = DB_TEST;
        $connectionOptions = array(
            "database" => DB_EMPL,        // 데이터베이스명
            "uid" => DB_ID_ADMIN,             // 유저 아이디
            "pwd" => DB_PW_ADMIN,             // 유저 비번
            "CharacterSet" => DB_CHARACTERSET // 한글꺠짐 방지!
        );

        
        // --------------------------------------------------------------------
        // SQL 조건문에 변수를 넣을 경우 활용 하는 방법 
        // 1) 변수에 그대로 값 대입
        $F_EMPL_CODE = '사번';
        $F_START_DATE = '날짜';

        // 2) URL에 입력된 변수를 불러올 경우
        // 테스트는 GET / API 호출은 POST 사용
        // ex) http://localhost/select.php?EMPL_CODE=사번&START_DATE=데이타
        $F_EMPL_CODE = $_GET['F_EMPL_CODE'];
        $F_START_DATE = $_GET['F_START_DATE'];
        // --------------------------------------------------------------------

        // 결과값을 받을 변수
        $F_START_TIME = '';

        // DB 연결
        $dbconn = sqlsrv_connect($serverName, $connectionOptions); 
        // 연결 확인
        if ($dbconn) {
            echo "DB 연결 완료<br><hr>";
        }else{
            echo "DB 연결 실패<Br>";
            die( print_r( sqlsrv_errors(), true));
            echo "<hr>";
        }

        // 쿼리 작성
        $query = "SELECT * FROM 출근기록테이블
                WHERE 사번 = '$F_EMPL_CODE' and 날짜 = '$F_START_DATE'"; 

        // 쿼리를 실행하여 statement 를 얻어온다
        $params = array();
        $options = array( "Scrollable" => SQLSRV_CURSOR_KEYSET );
        $stmt = sqlsrv_query($dbconn, $query, $params, $options );

        // 쿼리 결과 'row' 수를 반환해준다
        $row_count = sqlsrv_num_rows($stmt);
        
        // 결과가 1개 이상 있다면?
        if($row_count >= 1){
            // statement 를 돌면서 필드값을 가져온다
            while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC))
            {   
                //  출력할 $row['컬럼명']; 형태로 출력해줌
                $F_START_TIME = (string) $row['근무시간'];
                echo $F_START_TIME."<Br>";
            }   
        }else{
            echo "조회된 정보가 없습니다";
        } 
        
        // 데이터 출력후 statement 를 해제한다
        sqlsrv_free_stmt($stmt);    

        // 데이터베이스 접속을 해제한다
        sqlsrv_close($dbconn);
        ?>
    </body>
</html>

 

php 출력 구문은 대표적으로 echo, print, print_r, var_dump 이 네 가지를 가장 많이 사용합니다.

 각각의 차이가 어떤 점이 있는지, 문자열/숫자/1차원 배열/2차원 배열의 변수를 각각 선언한 뒤 출력을 해보며 확인해보겠습니다.

 왜 제목에 출력 '구문(함수)'로 써놨는지 그 이유도 알아보겠습니다.

 

<?php

// 문자열 type
$test_string = "Hello World";
// 숫자(정수) type
$test_int = 1234;
// 1차원 배열
$test_array = array("0", "HYUNDAI", "iOniq 5");
// 2차원 배열
$test_array2D = array( // 1차원 배열을 3개 갖는 2차원 배열 선언과 동시에 초기화
    array("1", "PEUGEOT", 5008),
    array("2", "CITROEN", "C5"),
    array("3", "DS", "DS3 Crossback")
);

echo "1) echo로 변수 출력<br>";
echo $test_string;
echo "<Br>";
echo $test_int;
echo "<Br>";
echo $test_array;
echo "<Br>";
echo $test_array2D;
echo "<Br>";
echo "<hr>";

echo "2) print로 변수출력 <br>";
print $test_string;
echo "<Br>";
print $test_int;
echo "<Br>";
print $test_array;
echo "<Br>";
print $test_array2D;
echo "<Br>";
echo "<hr>";

echo "3) print_r로 변수출력 <br>";
print_r($test_string);
echo "<Br>";
print_r($test_int);
echo "<Br>";
print_r($test_array);
echo "<Br>";
print_r($test_array2D);
echo "<Br>";
echo "<hr>";

echo "4) print_r로 변수출력 <br>";
var_dump($test_string);
echo "<Br>";
var_dump($test_int);
echo "<Br>";
var_dump($test_array);
echo "<Br>";
var_dump($test_array2D);
echo "<Br>";
?>

바로 출력 결과를 확인해볼까요

결과만 보면 'echo'와 'print' 키워드는 같은 결과를 나타내지만 큰 차이가 있습니다.


1. echo vs print

 간혹 php의 print는 함수고 echo는 함수가 아니다라는 글을 보았는데 정확히는 둘 다 '아니지만 print는 반은 함수다' 라고 생각합니다.

 일반적으로 함수라하면 값을 언제나 반환하지 않더라도 여차하면 '반환할 수 있어'라는 기능을 내포하고 있으니까요.

print는 동작시 언제나 '1'을 반환하고 있습니다.

echo print("");
print print("");
print_r(print(""));
var_dump(print(""));

 위에 처럼 print에 빈 문자를 각각의 출력문으로 출력하면 값이 어떻게 될까요.

var_dump()는 아무 출력값이 안 나오고 나머지는 '1'을 출력하게 됩니다.

 결론적으로 print는 함수는 아니지만 언제나 '1'을 출력하는 성질을 갖고 있으며, 개인적으로 잘 사용하진 않지만 '삼항연산'을 출력 할 때 외에는 print를 쓸 이유가 굳이 있을까 하는 생각이듭니다.

(삼항연산 참고 : https://pjw48.net/wordpress/2017/02/08/helloworld-php/)


* echo나 print는 왜 배열을 출력하지 못 할까요

이 둘의 공통점은 아래와 같습니다.

Non-string values will be coerced to strings, even when the strict_types directive is enabled.

문자열이 아니면 강제로 문자열로 바꿀껀데, 못 바꾸게 생겼으면 데이터 타입을 출력하겠다 정도로 이해하시면 되지 않을까 싶습니다.


2. print_r vs var_dump

 이 둘의 가장 대표적인 차이는 '누가 더 자세히 안내해주냐' 입니다.

다시 결과를 확인해볼까요

3) print_r로 변수출력
Hello World
1234
Array ( [0] => 0 [1] => HYUNDAI [2] => iOniq 5 )
Array ( [0] => Array ( [0] => 1 [1] => PEUGEOT [2] => 5008 ) [1] => Array ( [0] => 2 [1] => CITROEN [2] => C5 ) [2] => Array ( [0] => 3 [1] => DS [2] => DS3 Crossback ) )

4) print_r로 변수출력
D:\Bitnami\apache2\htdocs\playground\php_study\print_function.php:50:string 'Hello World' (length=11)

D:\Bitnami\apache2\htdocs\playground\php_study\print_function.php:52:int 1234

D:\Bitnami\apache2\htdocs\playground\php_study\print_function.php:54:
array (size=3)
  0 => string '0' (length=1)
  1 => string 'HYUNDAI' (length=7)
  2 => string 'iOniq 5' (length=7)

D:\Bitnami\apache2\htdocs\playground\php_study\print_function.php:56:
array (size=3)
  0 => 
    array (size=3)
      0 => string '1' (length=1)
      1 => string 'PEUGEOT' (length=7)
      2 => int 5008
  1 => 
    array (size=3)
      0 => string '2' (length=1)
      1 => string 'CITROEN' (length=7)
      2 => string 'C5' (length=2)
  2 => 
    array (size=3)
      0 => string '3' (length=1)
      1 => string 'DS' (length=2)
      2 => string 'DS3 Crossback' (length=13)

 위에 결과를 보면 var_dump로 출력한 결과가 더 자세하다는 걸 볼 수 있습니다.

데이터 타입부터, 출력된 경로의 위치까지 자세히 출력해주기 때문에 디버깅시 유용하게 사용할 수 있습니다.

 그렇기 때문에 'null'을 var_dump() 출력할 수 있으나 print_r()은 출력할 수 없게 됩니다.

 

또, print_r은 문자열을 반환 하지만 var_dump는 아무 값을 반환하지 않습니다.

아래 print_r과 var_dump의 함수를 비교해보면 한 눈에 알 수 있습니다.

print_r(mixed $value, bool $return = false): string|bool
var_dump(mixed $value, mixed ...$values): void

 

결론적으로 print_r은 단어 그대로 'print'에 기능이 집중되어있습니다.


* 참고

php 공식 문서에 echo와 print문에 대한 설명이 있으니 참고해주세요

https://www.php.net/manual/en/function.echo

https://www.php.net/manual/en/function.print.php

 

PHP: print - Manual

mvpetrovich of 2007 could just use single quotes as his string delimiters (see the example in the current documentation).It's not ALWAYS appropriate, but generally it is best (the Zend Framework coding standards have a good take on this). It yields a numbe

www.php.net

https://www.php.net/manual/en/function.print-r

 

PHP: print_r - Manual

Here's a PHP version of print_r which can be tailored to your needs. Shows protected and private properties of objects and detects recursion (for objects only!). Usage:void u_print_r ( mixed $expression [, array $ignore] )Use the $ignore parameter to provi

www.php.net

https://www.php.net/manual/en/function.var-dump

+ Recent posts