PHP 에서 MySQL 데이터 불러오기 두가지 (한줄, 여러줄)

프로그래밍/PHP|2021. 7. 22. 14:43
반응형

[ 레코드가 한줄일때 ]

 

$conn = mysqli_connect('localhost', 'sysdocu', '12345678', 'sysdocuDB');

$query = "SELECT AVG(age) AS AVG FROM list";
$result = mysqli_query($conn, $query);
$one = mysqli_fetch_array($result);

echo $one['AVG'];

 

 

[ 레코드가 여러줄일때 ] 

 

$conn = mysqli_connect('localhost', 'sysuser', '12345678', 'sysdb');

$query = "SELECT code FROM list";
        if ($result = mysqli_query($conn, $query)) {
                while ($row = mysqli_fetch_row($result)) {
                              echo $row[0];
                              echo $row[1];

                              echo $row[2];

                }
        }

 

반응형

댓글()

PHP 와 JWT (JSON Web Tokens)를 이용한 예제

프로그래밍/PHP|2021. 5. 17. 16:04
반응형

해당 예제는 CentOS 7 또는 8 에서 사용이 가능합니다.

관련 패키지와 환경 설정을 진행합니다.

 

1. Composer 설치

 

# yum -y update

# yum -y install php-cli php-zip wget unzip

# php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"

# HASH="$(wget -q -O - https://composer.github.io/installer.sig)" 

# php -r "if (hash_file('SHA384', 'composer-setup.php') === '$HASH') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"

 

# php composer-setup.php --install-dir=/usr/local/bin --filename=composer

 

여기에서 아래와 같은 에러 메세지가 출력될 경우 패키지를 추가로 설치하고 진행하면 됩니다.

php 를 소스 컴파일 하신 경우 해당 옵션 (--disable-json) 을 제거하고 재컴파일 해야 합니다.

 

(에러)

Some settings on your machine make Composer unable to work properly.
Make sure that you fix the issues listed below and run this script again:

The json extension is missing.
Install it or recompile php without --disable-json

 

(해결)
# yum install php-json

 

composer 가 잘 설치되었는지 명령어로 확인해봅니다.

사용할 수 있는 옵션이 출력 될경우 정상 설치된 것입니다.

 

# composer

 

확인이 되었으면 설치 프로그램을 삭제 합니다.

 

# php -r "unlink('composer-setup.php');"

 

 

2. PHP-JWT 설치

 

composer require firebase/php-jwt

 

 

3. 테스트

 

# vi first.php

<?php
require_once './vendor/autoload.php';
use Firebase\JWT\JWT;
$secret_key = "this-is-the-secret";

// 데이터 입력
$id = "sysdocu";
$email = "sysdocu@sysdocu.tistory.com";
$addr = "seoul";
$phone = "010-1111-2222";
 
$data = array(
    'id' => $id,
    'email' => $email,
    'addr' => $addr,
    'phone' => $phone
);
 
$jwt = JWT::encode($data, $secret_key);
echo "encoded jwt: " . $jwt . "<br>";
 
//$decoded = JWT::decode($jwt, $secret_key, array('HS256'));
//print_r($decoded);
?>


생성한 php 파일을 웹브라우저로 불러오면 출력되는 결과는 아래와 같습니다.

encoded jwt 값을 자세히 보시면 hearderpayloadsignature 값 모두 출력되는 것을 볼 수 있습니다. (점으로 구분) 

 

encoded jwt: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6InN5c2RvY3UiLCJlbWFpbCI6InN5c2RvY3VAc3lzZG9jdS50aXN0b3J5LmNvbSIsImFkZHIiOiJzZW91bCIsInBob25lIjoiMDEwLTExMTEtMjIyMiJ9.xmYK1C0pnguCpC8qFUaJYYoLNnhkQ6kGiBxba_aM1gc

 

내용을 받을 php 를 만듭니다.

 

# vi second.php

 

<?php
require_once './vendor/autoload.php';
use Firebase\JWT\JWT;
$secret_key = "this-is-the-secret";

// URL 에서 jwt 인자값을 가져온다.
$jwt = isset($_GET['jwt']) ? $_GET['jwt'] : null;
if (isset($jwt)) {

    // validate jwt 로그인된 상태 
    try {
        $decoded = JWT::decode($jwt, $secret_key, array('HS256'));
        $decoded_array = (array)$decoded;
        $result = array(
            'code' => 200,
            'status' => 'success',
            'jwt_payload' => $decoded_array
        );
    } catch (\Exception $e) {
        $result = array(
            'code' => 0,
            'status' => 'error',
            'message' => $e->getMessage().' Invalid JWT - Authentication failed!'
        );
    }

} else {
    $result = array(
        'code' => 0,
        'status' => 'error',
        'message' => 'JWT parameter missing!'
    );
}
echo json_encode($result);
?>

 

그리고 브라우저에서 first.php 의 결과 코드를 활용해 second.php 로 접속해 봅니다.

 

http://{도메인}/second.php?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6InN5c2RvY3UiLCJlbWFpbCI6InN5c2RvY3VAc3lzZG9jdS50aXN0b3J5LmNvbSIsImFkZHIiOiJzZW91bCIsInBob25lIjoiMDEwLTExMTEtMjIyMiJ9.xmYK1C0pnguCpC8qFUaJYYoLNnhkQ6kGiBxba_aM1gc

 

 

[결과]

{"code":200,"status":"success","jwt_payload":{"id":"sysdocu","email":"sysdocu@sysdocu.tistory.com","addr":"seoul","phone":"010-1111-2222"}}

 

 

데이터가 잘 확인되었습니다.

필요에 따라 이 샘플 코드를 이용해 세션 파일을 만드는 등 추가 작업을 진행하면 됩니다.

 

 

상세 설명은 아래 URL 에서 확인 가능합니다.

[출처1 - 환경 설치 부분] https://phoenixnap.com/kb/how-to-install-and-use-php-composer-on-centos-7

[출처2 - 테스트 부분] https://trytoso.tistory.com/1024

https://heartgamer.wordpress.com/2015/08/26/json-web-tokenjwt%EB%A5%BC-node-js%EC%99%80-php%EC%97%90%EC%84%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0/

 

 

 

반응형

댓글()

php 에서 json 파일 읽기 (2차원 배열)

프로그래밍/PHP|2021. 1. 5. 14:22
반응형

sysdocu.json


[

{ "table": "book", "id": "1", "title": "제목1", "body": "내용1" },

{ "table": "book", "id": "2", "title": "제목2", "body": "내용2" },

{ "table": "book", "id": "3", "title": "제목3", "body": "내용3" },

{ "table": "book", "id": "4", "title": "제목4", "body": "내용4" }

]



print.php


<?

$array = json_decode(file_get_contents("sysdocu.json", true));


foreach ($array as $row) {

    $table = $row->table;

    $id = $row->id;

    $title = $row->title;

    $body = $row->body;


    echo $table . "<br>";

    echo $id . "<br>";

    echo $title . "<br>";

    echo $body . "<br>";

}

?>



print.php 실행 결과


book
1
제목1
내용1
book
2
제목2
내용2
book
3
제목3
내용3
book
4
제목4
내용4



반응형

댓글()

PHP 로 Excel 파일 읽기

프로그래밍/PHP|2020. 8. 21. 08:36
반응형

[출처1] http://www.joshi.co.kr/index.php?mid=board_EudV58&page=7&document_srl=293319

[출처2] https://wickedmagic.tistory.com/584


출처의 내용을 진행하며 제가 필요한 내용으로 수정 하였습니다.



1. PHP 설치 필수 모듈 설치 (Ubuntu 18.04 기준)


# apt install php7.2-zip php7.2-xml php7.2-gd



2. PHPExcel-1.8.0 다운로드


https://github.com/PHPOffice/PHPExcel 에 접속해 압축파일을 통째로 다운로드 받고

소스 최상위 디렉토리에 압축해제 하면 아래와 같은 디렉토리가 생성 됩니다.


./PHPExcel-1.8.0



3. Excel 파일 업로드


아래 내용으로 file.xlsx 파일을 만들어서 소스 최상위 디렉토리에 업로드 했습니다.

1

아무개 

10

 2

귀요미

12 



4. Excel 읽는 PHP 코드 생성


# vi excel_upload.php


<html>

<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> 



# vi excel_read.php


<?

require_once "./PHPExcel-1.8.0/Classes/PHPExcel.php"; // PHPExcel.php을 불러와야 하며, 경로는 사용자의 설정에 맞게 수정해야 한다.

$objPHPExcel = new PHPExcel();

require_once "./PHPExcel-1.8.0/Classes/PHPExcel/IOFactory.php"; // IOFactory.php을 불러와야 하며, 경로는 사용자의 설정에 맞게 수정해야 한다.


//$filename = './file.xlsx'; // 서버에 올려진 파일을 직접 지정할 경우


// excel_upload.php 파일을 이용해 업로드 한 경우

$filename = $_FILES['excelFile']['tmp_name'];


try {

    // 업로드 된 엑셀 형식에 맞는 Reader객체를 만든다.

    $objReader = PHPExcel_IOFactory::createReaderForFile($filename);


    // 읽기전용으로 설정

    $objReader->setReadDataOnly(true);


    // 엑셀파일을 읽는다

    $objExcel = $objReader->load($filename);


    // 첫번째 시트를 선택

    $objExcel->setActiveSheetIndex(0);

    $objWorksheet = $objExcel->getActiveSheet();

    $rowIterator = $objWorksheet->getRowIterator();

    foreach ($rowIterator as $row) { // 모든 행에 대해서

               $cellIterator = $row->getCellIterator();

               $cellIterator->setIterateOnlyExistingCells(false);

    }


    $maxRow = $objWorksheet->getHighestRow();


    for ($i = 0 ; $i <= $maxRow ; $i++) {

               $no = $objWorksheet->getCell('A' . $i)->getValue(); // A열

               $name = $objWorksheet->getCell('B' . $i)->getValue(); // B열

               $age = $objWorksheet->getCell('C' . $i)->getValue(); // C열

               echo $no . ", " . $name . ", " . $age . "<br>";

    }

}


catch (exception $e) {

    echo "엑셀 파일을 읽는 도중 오류가 발생 하였습니다.";

}

?>



반응형

댓글()

날짜와 시간 비교 후 페이지 로딩 중지하기

프로그래밍/PHP|2020. 7. 20. 14:28
반응형

<?

$diff_snap = strtotime("2020-07-20 10:20:30");

$diff_now = strtotime(date("Y-m-d H:i:s"));

$diff = $diff_now - $diff_snap;


if ($diff >= 600) { // 10분 이상 차이 날 경우 페이지 종료 (이하 코드 실행 안함)

        echo "받은 시간" . $diff_snap . "<br>";

        echo "현재 시간" . $diff_now . "<br>";

        echo "차이는 " . $diff . " 초 입니다.";

        exit();

}

?>



반응형

댓글()

MySQL 3개 테이블 조인 SAMPLE

프로그래밍/PHP|2020. 7. 10. 13:31
반응형

SELECT * FROM Country

    JOIN CountryLanguage ON Country.Code=CountryLanguage.CountryCode

    JOIN City ON Country.Code=City.CountryCode

 

[출처] blog.naver.com/my0biho/220411576884

반응형

댓글()

파일 사이즈 출력 및 단위 자동 변경

프로그래밍/PHP|2020. 7. 3. 10:38
반응형

// 대상 파일 크기 확인

$file_size = filesize ("files/test.zip");


// 파일 크기에 따른 단위 변경

if($file_size < 1024) {

    $file_size = number_format($file_size * 1.024) . ' B';

} else if ($file_size > 1024 && $file_size < 1024000) {

    $file_size = number_format($file_size * 0.001024) . ' KB';

} else if ($file_size > 1024000) {

    $file_size = number_format($file_size * 0.000001024) . ' MB';

}


// 파일 크기 출력

echo $file_size;



반응형

댓글()

PDO 를 이용해 html 코드를 MySQL 로 입력하기

프로그래밍/PHP|2020. 7. 2. 10:17
반응형

PDO 를 사용하면 html 코드를 쉽게 DB 에 insert 할 수 있습니다.


최근 나오는 PHP 버전의 대부분은 PDO 사용이 가능 하므로

아래 예제가 통하지 않을 경우에만 버전 또는 모듈 사용이 가능한지 체크해보세요.


<form> 태그로 넘겨받은 페이지에서 DB 로 insert 하는 방법 입니다.



insert.php 파일로 입력


<?

$register_time = date("Y-m-d H:i:s");


$mysql_hostname = '127.0.0.1';

$mysql_username = 'sysdocu';

$mysql_password = '12345678';

$mysql_database = 'sysdocu';

$mysql_port = '3306';

$mysql_charset = 'utf8';

$dsn = 'mysql:host='.$mysql_hostname.';dbname='.$mysql_database.';port='.$mysql_port.';charset='.$mysql_charset;

try{

    $pdo = new PDO($dsn, $mysql_username, $mysql_password);

    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

} catch (PDOException $e) {

    echo 'Connect failed : ' . $e->getMessage() . '';

}


$sql = "INSERT INTO notice (title, body, attach, register_time) VALUES (:title, :content, :attach, :register_time)";

$stmh = $pdo->prepare($sql);

$stmh->bindValue(':title', $_POST['title']);

$stmh->bindValue(':content', $_POST['content']);

$stmh->bindValue(':attach', $_POST['attach']);

$stmh->bindValue(':register_time', $register_time);

$stmh->execute();

?>



이후 데이터를 불러올 때는 아래와 같이 echo 로 출력하면 됩니다.


echo $row['content'];




반응형

댓글()

CLI 에서 curl 명령어로 파일 보내고 php 에서 받기

프로그래밍/PHP|2020. 6. 30. 14:27
반응형

CLI 에서 curl 로 파일 보내는 방법은 아래와 같습니다.


1. curl 로 파일 전송


# curl -F "file=@/home/sysdocu/profile.png" https://sysdocu.tistory.com/upload.php



2. php 로 수신


upload.php


<?php

$uploaddir = "/var/www/html/tmp/"; // 해당 디렉토리는 업로드 권한이 있어야 함

$uploadfile = $uploaddir . basename($_FILES['file']['name']);


if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile)) {

    echo "업로드 성공\n";

} else {

    echo "업로드 실패\n";

}


echo "결과 보기<br>";

print_r($_FILES);

?> 


* 주의 : 보내고 받는 변수명이 동일해야 합니다. (위에서는 file 사용)



반응형

댓글()

MySQL 에서 가져온 최근 데이터를 오래된 순서대로 정렬하기

프로그래밍/PHP|2020. 6. 30. 08:49
반응형

DB 테이블 (fruit) 에 가령 아래와 같은 데이터가 존재한다고 치면

최신데이터 3개를 가져와야 할 일이 생겼습니다.

단, 순서는 유지하면서.


name | fruit

--------------------

CDH      파인애플

JJE        바나나

CHY       딸기

CJW      포도

JOY       사과


MySQL 에서 가져오는 방법으로 아래와 같은 쿼리가 주로 사용됩니다.

하지만 최신 데이터를 가져오기 위해 사용한 DESC 때문에 순서는 뒤바뀌게 되므로

array_reverse 함수를 이용해 간단히 배열에 넣은 값을 역순으로 재정렬 하면 됩니다.


$query = "SELECT * FROM fruit ORDER BY no DESC LIMIT 3";


if ($result = mysqli_query($link, $query)) {

    $Arrays = []; // 배열 선언

    while ($row = mysqli_fetch_row($result)) { 

        $Arrays["$row[0]"] = $row[1]; // 이름에 과일 넣기

    }


    // 배열 역순 정렬

    $ArrayHour = array_reverse($ArrayHour);

}



반응형

댓글()

PHP 배열 사용하기

프로그래밍/PHP|2020. 6. 26. 11:12
반응형

출처: https://pikabu.tistory.com/83 [피카부]


배열이란

배열은 '여러개의 값을 담아 놓는 상자'라고 생각하시면 됩니다. 배열로 선언하면 값이 없어도 배열이 됩니다. 또한 배열 선언과 동시에 값을 대입하는 것도 가능합니다.

$days = []; // 빈 배열 $days 선언

$family = ['dad', 'mom', 'son', 'daughter']; // 값이 있는 배열 $family 선언

배열의 첨자

배열 요소의 위치를 첨자라고 합니다. 첨자는 보통 연속되는 값으로 0,1,2..로 이어집니다. 이러한 첨자로 배열에 바로 접근이 가능하게 됩니다.

// 첨자는 0, 1, 2, 3
$family = ['dad', 'mom', 'son', 'daughter'];

echo $family[0]; // 'dad'

echo $family[3]; // 'daughter'

연상 배열

첨자 대신 요소의 이름(key)을 지정하여 접근 할 수도 있습니다.

$family_name = [
    'dad' => 'Bob',
    'mom' => 'Jessy',
    'son' => 'James',
    'daughter' => 'Emily'
];

echo $family_name['dad']; // 'Bob'

요소의 추가

마지막에 요소를 추가

배열의 제일 끝에 새로운 요소를 추가합니다.

//첨자 배열의 경우 
$family = ['dad', 'mom', 'son', 'daughter'];

$family[] = 'puppy'; // 배열의 제일 끝에 요소를 추가

echo $family[4]; // 'puppy'


// 연상 배열의 경우
$family_name = [
    'dad' => 'Bob',
    'mom' => 'Jessy',
    'son' => 'James',
    'daughter' => 'Emily'
];

$family_name['puppy'] = 'John';

echo $family_name['puppy']; // 'John'

가장 첫 위치에 요소를 추가

배열의 가장 첫 위치에 요소를 추가할 경우는 array_unshift()를 사용합니다.

$family = ['dad', 'mom', 'son', 'daughter'];

array_unshift($family, 'grandma');

// $familyは['grandma', 'dad', 'mom', 'son', 'daughter'] 로 됩니다.

임의의 위치 요소를 추가

배열의 임의의 위치에 요소를 끼워넣습니다. array_splice()는 원래 요소를 치환하는 함수이지만, 제3인수에 0을 지정하면 요소를 지우지 않고 끼워넣을 수 있습니다.

$family = ['dad', 'mom', 'son'];

// $family[2]의 앞에'uncle'를 추가
array_splice($family, 2, 0, 'uncle');

// ['dad', 'mom', 'uncle', 'son']

복수의 요소를 추가

array_push() 함수를 사용하여 한번에 여러개의 요소를 추가합니다.

$family = ['dad', 'mom', 'son'];
array_push($family, 'puppy', 'citty');

// ['dad', 'mom', 'son', 'puppy', 'citty']

array_merge() 함수를 사용하면 배열과 배열을 결합합니다.

$family = ['dad', 'mom', 'son'];
$add_member = ['grandma', 'grandpa'];

$new_family = array_merge($add_member, $family);

// $new_family는 ['grandma', 'grandpa', 'dad', 'mom', 'son']
//array_merge는 원래의 배열 $family에 영향을 주지 않습니다.

다차원 배열

배열의 요소에도 배열 값을 가지게 할 수 있습니다.

$families = [
    [
        'dad', 'mom', 'son'
    ],
    [
        'dad', 'mom', 'daughter'
    ]
];

echo $families[0][0]; // 'dad'

echo $families[1][2]; // 'daughter'

// $families['Smith']와 $families['Williams']는 각각 배열입니다.

물론 연상 배열을 다차원 배열로 할 수도 있습니다.

$families = [
    'Smith' => [
        'dad' => 'Bob',
        'mom' => 'Jessy',
        'son' => 'James'
    ],
    'Williams' => [
        'dad' => 'Michael',
        'mom' => 'Jessy',
        'daughter' => 'Emily'
    ]
];

echo $families['Smith']['dad']; // 'Bob'

여기서는 $families['Smith']['mom']의 'Jessy'와 $families['Williams']['mom']의 'Jessy'는 문자열은 같지만 다른 배열입니다. 즉, 스미스 가문의 제시와 윌리엄 가문의 제시로 보시면 됩니다. 프로그래밍 초보 시절에는 많이 혼동되는 부분이지만 숙련되면 당연하게 생각되어질 것입니다.

배열의 삭제

배열의 삭제는 따로 정리해두었으니 참고 바로가기

마치며

PHP의 경우는 첨자 배열과 연상 배열이 같은 배열형태로 취급됩니다. 첨자 배열과 연상 배열을 합치거나 루프 구문에서 별 다른 신경쓸 것 없이 사용이 가능합니다. 하지만 다른 개발 언어에서는 전혀 다른 취급을 하는 경우도 있으니 주의하시기 바랍니다.



출처: https://pikabu.tistory.com/83 [피카부]


반응형

댓글()