[php] PHPMailer 로 외부 SMTP 활용하여 메일 보내기

프로그래밍/PHP|2024. 2. 8. 08:25
반응형

PHP 를 사용하여 SMTP 를 통해 이메일을 보내는 방법은 PHPMailer 와 같은 외부 라이브러리를 사용하는 것이 편리합니다. 다음은 PHPMailer 를 사용한 간단한 예제입니다.

먼저, PHPMailer 다운로드를 위해 composer 를 설치 합니다.

# apt -y install composer    // Ubuntu 의 경우

 

메일 발송을 위한 프로젝트 디렉토리를 생성하고 그 안에서 PHPMailer 를 다운로드 합니다.

작성일 기준으로 6.9.1 버전이 설치됩니다.

# mkdir mail_app
# cd mail_app
# composer require phpmailer/phpmailer

Do not run Composer as root/super user! See https://getcomposer.org/root for details
Continue as root/super user [yes]? yes
Using version ^6.9 for phpmailer/phpmailer
./composer.json has been created
Running composer update phpmailer/phpmailer
Loading composer repositories with package information
Updating dependencies
Lock file operations: 1 install, 0 updates, 0 removals
  - Locking phpmailer/phpmailer (v6.9.1)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Installing phpmailer/phpmailer (v6.9.1): Extracting archive
7 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating autoload files
1 package you are using is looking for funding.
Use the `composer fund` command to find out more!

 

메일 발송을 위해 아래 내용으로 PHP 소스 코드를 작성합니다.

아래는 SSL 를 사용하지 않고 발송하는 예제입니다.

# vi send.php

<?php
// PHPMailer 라이브러리 사용
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php';

// PHPMailer 인스턴스 생성
$mail = new PHPMailer(true);

try {
    // SMTP 서버 설정
    $mail->isSMTP();
    $mail->Host = 'mail.sysdocu.kr';
    $mail->Username = 'admin@sysdocu.kr';
    $mail->Password = '12345678';
    $mail->SMTPSecure = false;
    $mail->SMTPAutoTLS = false;
    $mail->Port = 25;
    //$mail->SMTPDebug = 2;  // 디버그 레벨 (0은 디버그 비활성화, 2는 상세 디버그)

    // 발신자, 수신자, 참조, 숨은 참조
    $mail->setFrom('admin@sysdocu.kr', '관리자');
    $mail->addAddress('sysdocu@sysdocu.kr');
    //$mail->addCC('user@sysdocu.kr');
    //$mail->addBCC('manager@sysdocu.kr');

    // 파일 첨부
    //$mail->addAttachment('/tmp/file.zip');

    // 메일 내용 설정
    $mail->isHTML(true);
    $mail->CharSet = 'UTF-8';
    $mail->Subject = '메일 제목입니다.';
    $mail->Body    = '메일 <b>내용</b>입니다. 잘 발송이 되었나요?';
    $mail->AltBody = 'HTML 미지원 환경에서는 내용이 보이지 않습니다.';

    // 메일 전송
    $mail->send();
    echo 'The Email has been sent successfully.';
} catch (Exception $e) {
    echo "Email could not be sent. Mailer Error: {$mail->ErrorInfo}";
}
?>

 

작성한 php 파일을 실행하여 메일을 발송합니다.

# php send.php

 

* 참고 1

외부 SMTP 를 사용할 때 아래와 같이 설정하는 경우도 있으니 참고하시기 바랍니다.

    // SMTP 서버 설정
    $mail->isSMTP();
    $mail->Host = 'gw.sysdocu.kr';
    $mail->SMTPAuth = true;
    $mail->Username = 'admin@sysdocu.kr';
    $mail->Password = 'Mm*nBFu2Pt%qjNf@XLc7e9H1V6CIa(zr';
    $mail->SMTPSecure = false;
    $mail->SMTPAutoTLS = false;
    $mail->Port = 587;

 

* 참고 2

발송이 되지 않을 경우 SMTP 서버에서 메일 발송 IP (send.php 실행 IP : 115.68.142.120) 를 Relay 설정 하였는지 확인합니다.

예) Sendmail 의 경우

# echo "Connect:115.68.142.120 RELAY" >> /etc/mail/access

# makemap hash /etc/mail/access.db < /etc/mail/access

# systemctl restart sendmail

 

반응형

댓글()

Rocky Linux 9.x, PHP 8.1.x 환경에서 Laravel 10.33.0 설치하기

프로그래밍/PHP|2023. 11. 23. 13:55
반응형

테스트 환경은 Rocky Linux 9.x 버전이고, Laravel 10.33.0 버전을 설치하기 전에 PHP 8.1.x 버전을 설치해 두었습니다.

Laravel 은 Composer 를 통해 설치합니다.

 

 

1. Composer 다운로드

 

아래 홈페이지에서 Composer 를 다운로드 받을 수 있습니다.

자세한 정보 확인이 가능하지만 설치만 간단히 하고 싶은 분은 아래 명령어만 수행해도 됩니다.

https://getcomposer.org/

 

현재 디렉토리에 인스톨러를 다운로드 합니다.

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

 

인스톨러가 정상인지 검증합니다.

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

Installer verified

 

인스톨러 파일을 실행해 Composer 를 생성합니다.

# php composer-setup.php

All settings correct for using Composer
Downloading...

Composer (version 2.6.5) successfully installed to: /home/fntop/public_html/tool/composer.phar
Use it: php composer.phar

 

인스톨러 파일을 삭제합니다.

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

 

composer.phar 파일 이름을 composer 로 변경해주고, 디렉토리 어디에서든 실행 할 수 있도록 파일을 옮겨줍니다.

# mv composer.phar /usr/local/bin/composer

 

설치된 Composer 버전을 확인합니다.

# composer
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 2.6.5 2023-10-06 10:11:52
...

(생략)

 

 

2. Laravel 프로젝트 생성

 

Laravel 을 설치 합니다. 설치시 프로젝트명을 지정하면 프로젝트명의 하위디렉토리가 생성되며,

Laravel 버전을 명시하지 않으면 최상위 버전으로 설치됩니다.

형식) composer create-project --prefer-dist laravel/laravel {프로젝트명} "{Laravel버전}"

# composer create-project --prefer-dist laravel/laravel sysdocu            // Laravel 최신 버전으로 프로젝트 생성

또는

# composer create-project --prefer-dist laravel/laravel sysdocu "9.*"    // Laravel 9.x 버전으로 프로젝트 생성

 

여기에서는 최신 버전으로 생성해 보겠습니다.

# composer create-project --prefer-dist laravel/laravel sysdocu
Creating a "laravel/laravel" project at "./sysdocu"
Installing laravel/laravel (v10.2.9)
  - Installing laravel/laravel (v10.2.9): Extracting archive
Created project in /home/fntop/public_html/tool/blog1/sysdocu
> @php -r "file_exists('.env') || copy('.env.example', '.env');"
Loading composer repositories with package information
Updating dependencies
Lock file operations: 110 installs, 0 updates, 0 removals
  - Locking brick/math (0.11.0)
  - Locking dflydev/dot-access-data (v3.0.2)
  - Locking doctrine/inflector (2.0.8)
  - Locking doctrine/lexer (3.0.0)
  - Locking dragonmantank/cron-expression (v3.3.3)
  - Locking egulias/email-validator (4.0.2)
  - Locking fakerphp/faker (v1.23.0)

...

(생략)

...

   INFO  Application key set successfully.

 

생성된 파일을 확인합니다.

# cd sysdocu
# ls -al
합계 356
drwxr-xr-x 12 root root   4096 11월 23 13:34 .
drwxr-xr-x 13 root root   4096 11월 23 13:34 ..
-rw-r--r--  1 root root    258 11월 14 01:36 .editorconfig
-rw-r--r--  1 root root   1148 11월 23 13:34 .env
-rw-r--r--  1 root root   1097 11월 14 01:36 .env.example
-rw-r--r--  1 root root    186 11월 14 01:36 .gitattributes
-rw-r--r--  1 root root    243 11월 14 01:36 .gitignore
-rw-r--r--  1 root root   4106 11월 14 01:36 README.md
drwxr-xr-x  7 root root     82 11월 14 01:36 app
-rwxr-xr-x  1 root root   1686 11월 14 01:36 artisan
drwxr-xr-x  3 root root     34 11월 14 01:36 bootstrap
-rw-r--r--  1 root root   1882 11월 14 01:36 composer.json
-rw-r--r--  1 root root 296306 11월 23 13:34 composer.lock
drwxr-xr-x  2 root root   4096 11월 14 01:36 config
drwxr-xr-x  5 root root     74 11월 14 01:36 database
-rw-r--r--  1 root root    248 11월 14 01:36 package.json
-rw-r--r--  1 root root   1084 11월 14 01:36 phpunit.xml
drwxr-xr-x  2 root root     77 11월 14 01:36 public
drwxr-xr-x  5 root root     40 11월 14 01:36 resources
drwxr-xr-x  2 root root     75 11월 14 01:36 routes
drwxr-xr-x  5 root root     46 11월 14 01:36 storage
drwxr-xr-x  4 root root     83 11월 14 01:36 tests
drwxr-xr-x 39 root root   4096 11월 23 13:34 vendor
-rw-r--r--  1 root root    263 11월 14 01:36 vite.config.js

 

설치된 Laravel 버전을 확인합니다.

# php artisan --version
Laravel Framework 10.33.0

 

 

3. 생성 페이지 접근

 

현재 디렉토리에서 php 명령을 이용해 기본 생성 페이지에 접근해 봅니다.

# php artisan serve --host=0.0.0.0

 

   INFO  Server running on [http://0.0.0.0:8000].  

  Press Ctrl+C to stop the server

8000 번 포트로 모든 IP 에서 접근할 수 있도록 했습니다.

방화벽에서 8000 번 포트가 열려있는지 확인하고,

웹브라우저에서 아래와 같이 서버 IP (또는 Domain) 에 포트 번호만 붙여 접근해 보면 라라벨 초기페이지가 출력됩니다.

> http://sysdocu.kr:8000

 

반응형

댓글()

PHP 코드를 실행해주는 사이트 (버전 선택 가능)

프로그래밍/PHP|2023. 11. 17. 14:52
반응형

http://phptester.net/

 

반응형

댓글()

PHP 소켓 (server.php, client.php) - 데이터 전달 예제

프로그래밍/PHP|2023. 7. 7. 12:47
반응형

PHP 를 이용해 Server 에서 소켓 파일을 만들어 실행한 상태에서 Client 가 데이터를 전달하는 예제입니다.

데이터 (Mac address) 를 보내면 Server 측에서 데이터 검증 후 출력하도록 작성하였습니다.

받은 데이터 로그는 /root/input_data.log 에 기록 됩니다.

 

# vi server.php

#!/usr/bin/php -q
<?php
set_time_limit(0);

define("_IP",    "0.0.0.0");
define("_PORT",  "80");

$sSock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($sSock, SOL_SOCKET, SO_REUSEADDR, 1);

socket_bind($sSock, _IP, _PORT);
socket_listen($sSock);

pcntl_signal(SIGCHLD, SIG_IGN); 

function msg($msg) {
    echo "SERVER >> ".$msg;
}

// 맥어드레스 형식 검증
function isMacAddress($str) {
    $pattern = '/^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/';
    return preg_match($pattern, $str);
}

while($sock = socket_accept($sSock)) {
    socket_getpeername($sock, $sockIp, $sockPort);
    msg("Client connect : ".$sockIp.":".$sockPort."\n");

    // 자식 프로세스 생성
    $pid = pcntl_fork();
    if($pid == -1) {
        msg("fork failed\n");
        exit;
    }
    if($pid == 0) {
        $input = socket_read($sock, 4096);

        // 헤더와 데이터 분리
        list($header, $data) = explode("\r\n\r\n", $input, 2);
        msg("Mac address : " . $data . "\n");

        // 결과 응답 및 Client 연결 해제
        if ($input != "") {
            socket_write($sock, "Received it well");
            msg("Client disconnect : ".$sockIp.":".$sockPort."\n");
            socket_close($sock);
        }

        // 데이터 검증
        if (isMacAddress($data)) {
            $validation = "OK";
        } else {
            $validation = "NotOK";
        }

        // 로그 기록
        $now = date("Y-m-d H:i:s");
        shell_exec("echo \"$now\" \"$data\" \"$validation\" >> /root/input_data.log");
        exit;
    }
}
?> 

 

맨 윗줄 #!/usr/bin/php -q 에는 실제 php 실행파일 경로를 적어줘야 합니다.

 

root 만 사용할 수 있도록 권한을 변경합니다.

# chmod 700 server.php

 

파일을 실행하여 80 포트를 오픈하고 client 의 수신을 대기합니다.

# php server.php

 

Client 파일을 만듭니다.

# vi client.php

<?php
$url = 'http://www.sysdocu.kr';    // 접속할 호스트명
$data = '00:d8:61:13:2a:b8';       // 전달하고 싶은 데이터 (여기에서는 Mac address)

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_exec($ch);
curl_close($ch);
?>

 

Server 측 소켓이 열린 상태에서 client.php 파일을 실행하면 미리 준비된 데이터가 전달 됩니다.

# php client.php

 

반응형

댓글()

PHP 에서 SQL Injection 방지 쿼리 사용법 두가지 (bind_param, PDO)

프로그래밍/PHP|2022. 8. 30. 11:25
반응형

PHP 에서는 MySQL DB 데이터 입력 또는 조회시 SQL Injection 공격을 막기 위한 방법으로

bind_param 또는 PDO 방식을 사용 할 수 있습니다.

 

 

1. bind_param 사용하기

 

1) INSERT, UPDATE, DELETE

값을 출력하지 않아도 되는 경우 아래와 같은 코드를 사용 합니다.

<?php
$DB_HOST = "localhost";
$DB_USER = "sysdocu";
$DB_PASSWORD = "12345678";
$DB_NAME = "test";

// DB 연결
$conn = mysqli_connect($DB_HOST, $DB_USER, $DB_PASSWORD, $DB_NAME);

// 쿼리 준비
$stmt = $conn->prepare("INSERT INTO item (id, itemA, itemB) VALUES (?, ?, ?)");

// 데이터 준비
$id = "hero";
$itemA = "sword";
$itemB = "shield";

// 데이터 바인딩
$stmt->bind_param('sss', $id, $itemA, $itemB); // 대체될 데이터 세개 (하단 '참고' 확인)

// 쿼리 실행
$stmt->execute();

// 연결 종료
$stmt->close();
$conn->close();
?>

* 참고 : 바인딩 할때 변수 데이터 형식을 정의 하게 되는데, 아래 네가지 종료가 있습니다.

i : 정수

s : 문자열

d : double

b : BLOB

 

2) SELECT

값을 출력하는 경우 아래와 같은 코드를 사용 합니다.

<?php
$DB_HOST = "localhost";
$DB_USER = "sysdocu";
$DB_PASSWORD = "12345678";
$DB_NAME = "test";

// DB 연결
$conn = mysqli_connect($DB_HOST, $DB_USER, $DB_PASSWORD, $DB_NAME);

// 쿼리 준비
$stmt = $conn->prepare("SELECT * FROM item WHERE id=? or id=?");

// 데이터 준비
$var1 = "hero";
$var2 = "hero2";

// 데이터 바인딩
$stmt->bind_param('ss', $var1, $var2); // 대체될 데이터 두개

// 쿼리 실행
$stmt->execute();

// 모든 행의 결과를 출력
$result = $stmt->get_result();
while ($data = $result->fetch_assoc()) {
    echo $data['id'] . " / " . $data['itemA'] . " / " . $data['itemB'] . "<br>";
}

// 연결 종료
$stmt->close();
$conn->close();
?>

 

 

2. PDO 사용하기

 

1) INSERT, UPDATE, DELETE

값을 출력하지 않아도 되는 경우 아래와 같은 코드를 사용 합니다.

<?php
$DB_HOST = "localhost";
$DB_USER = "sysdocu";
$DB_PASSWORD = "12345678";
$DB_NAME = "test";

// DB 연결
$pdo = new PDO("mysql:host=$DB_HOST;dbname=$DB_NAME", $DB_USER, $DB_PASSWORD);

//쿼리 준비
$stmt = $pdo->prepare("INSERT INTO item (id, itemA, itemB) VALUES (:id, :itemA, :itemB)");

// 데이터 바인딩
$stmt->bindValue(":id", "hero");
$stmt->bindValue(":itemA", "sword");
$stmt->bindValue(":itemB", "shield");

// 쿼리 실행
$stmt->execute();

// 연결 종료
$stmt->close();
$pdo->close();
?>

 

2) SELECT

값을 출력하는 경우 아래와 같은 코드를 사용 합니다.

<?php
$DB_HOST = "localhost";
$DB_USER = "sysdocu";
$DB_PASSWORD = "12345678";
$DB_NAME = "test";

// DB 연결
$pdo = new PDO("mysql:host=$DB_HOST;dbname=$DB_NAME", $DB_USER, $DB_PASSWORD);

//쿼리 준비
$stmt = $pdo->prepare("SELECT * FROM item WHERE id=:id");

// 데이터 바인딩
$stmt->bindValue(":id", "hero");

// 쿼리 실행
$stmt->execute();

// 모든 행의 결과를 출력 (한개의 행 또는 한개의 컬럼 등 가져오는 방식은 추가 검색 권고)
$stmt->setFetchMode(PDO::FETCH_ASSOC);  // 추가 설명 아래 '참고' 확인
while ($row = $stmt->fetch()) {
    echo $data['id'] . " / " . $data['itemA'] . " / " . $data['itemB'] . "<br>";
}

// 연결 종료
$stmt->close();
$pdo->close();
?>

* 참고 : 데이터 출력 방식

fetch(PDO::FETCH_BOTH) - 숫자 인덱스와 명명된 인덱스가 있는 배열 입니다.
fetch(PDO::FETCH_ASSOC) - 행은 명명된 인덱스가 있는 배열입니다. ex) $row['itemA']
fetch(PDO::FETCH_NUM) - 행은 숫자 인덱스가 있는 배열입니다. ex) $row[0]

 

 

반응형

댓글()

PHP 날짜 비교하기

프로그래밍/PHP|2022. 4. 13. 10:20
반응형

일반 변수에 들어있는 날짜 텍스트로는 비교가 안됩니다. 아래와 같이 strtotime 함수를 이용해 비교 가능하도록 해주세요.

아래는 사용 예제입니다.

 

<?PHP

// 하루 전 날짜

$yesterday_time = strtotime(date("Y-m-d H:i:s", strtotime("-1 day")));

 

// 임의의 날짜

$tmp_time = strtotime("2022-04-13 10:00:00");

 

// 비교하기

if ($yesterday_time <= $tmp_time) {

    echo "임의의 날짜가 더 나중입니다.";

} else {

    echo "하루 전 날짜가 더 나중입니다.";
}

?>

반응형

댓글()

[PHP] AES-256-CBC 를 이용한 암호화 및 복호화

프로그래밍/PHP|2022. 4. 11. 08:49
반응형

[코드]

<?PHP
$str = "서버나라 개발왕자";    // 전달할 문자열
$key = "server&develop";    // 암호화, 복호화 하는 부분에서 동일한 키 사용

$en_key = base64_encode(openssl_encrypt($str, 'aes-256-cbc', $key, true, str_repeat(chr(0), 16)));
echo $en_key . "<br>";

$de_key = openssl_decrypt(base64_decode($en_key), 'aes-256-cbc', $key, true, str_repeat(chr(0), 16));
echo $de_key;
?>

 

 

[결과]

eIgTU/2u8qsWmnVorxdDYwdxRN3DMfK8PThERSmkN/I=
서버나라 개발왕자

 

반응형

댓글()

PHP 에서 json 문자열을 예쁘게 출력하려면

프로그래밍/PHP|2021. 11. 11. 15:18
반응형

아래와 같이 header 에 json 타입을 명시해주고  json 문자열을 JSON_PRETTY_PRINT 옵션을 주어 decode, encode 하면 됩니다.

 

sysdocu.php

<?
header('Content-Type: application/json');    // 필수

$data = '{ "result": "success", "data":[ { "ip": "192.168.10.2", "os": "linux" }, { "ip": "192.168.10.3", "os": "windows" } ] }';

$result = json_encode(json_decode($data), JSON_PRETTY_PRINT);

echo $result;
?>

 

결과

{
    "result": "success",
    "data": [
        {
            "ip": "192.168.10.2",
            "os": "linux"
        },
        {
            "ip": "192.168.10.3",
            "os": "windows"
        }
    ]
}

 

반응형

댓글()

PHP 와 MySQL 연동 확인 소스

프로그래밍/PHP|2021. 11. 8. 13:40
반응형

아래는 MySQL 연결이 잘 되었는지 확인하는 소스 입니다.

PHP 8.0, MySQL 8.0 에서 테스트 시 정상 동작 하는것 확인했습니다.

 

# vi dbtest.php

<?php
$conn = mysqli_connect("192.168.2.10", "sysdocu", "12345678", "sysdocudb");
 
if ($conn) {
    echo "MySQL 연결 성공";
} else {
    echo "MySQL 연결 실패";
}
 
$result = mysqli_query($conn, "SELECT VERSION() AS VERSION");
$data = mysqli_fetch_assoc($result);
echo "<br>Version : " . $data['VERSION'];
?>

 

 

추가로 데이터를 가져오는 방법입니다.

한개 행의 데이터를 가져올때는 이런 식으로 사용하고,

 

$sql = "SELECT * FROM members WHERE id='$id' AND passwd='$passwd'";
$result = mysqli_query($conn, $sql);
$row = mysqli_fetch_array($result);
$name = $row['name'];

$id = $row['id'];

$passwd = $row['passwd'];

여러 행의 데이터를 가져올때는 while 문을 사용합니다.

 

$sql = "SELECT * FROM members WHERE id='$id' AND passwd='$passwd'";
$result = mysqli_query($conn, $sql);
while ($row = mysqli_fetch_array($result)) {

        $name = $row['name'];
        $id = $row['id'];
        // 반복 출력
        echo $name . "<br>";
        echo $id . "<br>";
}

 

 

 

반응형

댓글()

PHP에서 JSON 배열 삭제

프로그래밍/PHP|2021. 10. 15. 15:39
반응형

PHP를 사용하여 JSON 파일에서 배열을 삭제하려고합니다.

PHP를 사용하여 배열 삭제를 설정하는 방법을 잘 모르겠습니다. jQuery 측면을 처리 할 수 ​​있습니다.

프론트 엔드에서 버튼을 클릭하면 해당 배열이 삭제됩니다.

  1. <button id="harry_0123">harry_0123</button>
  2. <button id="ben_0124">ben_0124</button>
  3.  

다음은 JSON 파일의 예입니다.

  1. {
  2. "harry_0123": {
  3. "id": "0123",
  4. "name": "harry",
  5. },
  6. "ben_0124": {
  7. "id": "0124",
  8. "name": "ben",
  9. },
  10. }
  11.  

다음은 PHP 예제입니다 :

  1. <?php
  2. $json_str = file_get_contents('doc/info.json');
  3.  
  4. $json_arr = json_decode($json_str, true);
  5.  
  6. if(!$json_arr) {
  7. $json_arr = array();
  8. }
  9. $json_str_done = json_encode($json_arr, JSON_PRETTY_PRINT);
  10. file_put_contents('doc/info.json', $json_str_done);
  11.  

 

[출처] https://www.python2.net/questions-1051494.htm

 

반응형

댓글()

PHP 에서 json 형식의 다차원 배열 값 읽고 출력하기

프로그래밍/PHP|2021. 10. 5. 07:25
반응형

PHP 에서 JSON 데이터를 파싱하는 방법이다.

JSON 데이터는 Local File 을 읽어오는 것과 Web 사이트에서 해당 URL 을 읽어오는 방법이 있다.

가장 먼저 파싱해야 할 데이터 형태 파악을 하는 코드부터 살펴보고자 구글링을 했더니 관련 코드가 있어서 주석을 좀 더 추가하고 이해를 돕는 걸 첨가하여 적어둔다.

 

 <?php
// Web JSON 파일 읽어오기
$url = 'http://ip주소/getFileList.php';
$json_string = file_get_contents($url);

// Local JSON 파일 읽어오기
//$json_string = file_get_contents('weather.json');
// 다차원 배열 반복처리
$R = new RecursiveIteratorIterator(
    new RecursiveArrayIterator(json_decode($json_string, TRUE)),
    RecursiveIteratorIterator::SELF_FIRST);
// $R : array data
// json_decode : JSON 문자열을 PHP 배열로 바꾼다
// json_decode 함수의 두번째 인자를 true 로 설정하면 무조건 array로 변환된다.

foreach ($R as $key => $val) {
    if(is_array($val)) { // val 이 배열이면
        echo "$key:<br/>";
        //echo $key.' (key), value : (array)<br />';
    } else { // 배열이 아니면
        echo "$key => $val <br />";
    }
}
?>

 

위 코드로 형태파악을 한 다음에 필요한 것을 파싱처리하면 된다.

 

Local JSON 파일을 읽어서 처리하는 걸 예제로 보자.

 [
    {
        "firstName": "길동",
        "lastName": "홍",
        "email": "jdhongv@gmail.com",
        "mobile": "010-1234-1111"
    },
    {
        "firstName": "민아",
        "lastName": "김",
        "email": "minakim@gmail.com",
        "mobile": "010-1234-3333"
    },
    {
        "firstName": "진주",
        "lastName": "마",
        "email": "jjmah@gmail.com",
        "mobile": "010-1234-5555"
    },
    {
        "firstName": "서영",
        "lastName": "이",
        "email": "sylee@gmail.com",
        "mobile": "010-1234-7777"
    }
]

 

<?php
// Local JSON 파일 읽어오기
$json_string = file_get_contents('data.json');
$R = json_decode($json_string, true);
// json_decode : JSON 문자열을 PHP 배열로 바꾼다
// json_decode 함수의 두번째 인자를 true 로 설정하면 무조건 array로 변환된다.
// $R : array data



foreach ($R as $row) {
    print $row['lastName'];
    print $row['firstName'];
    print ' , ';
    print $row['email'];
    print ' , ';
    print $row['mobile'];
    print '<br />';
}
?> 

 

결과

홍길동 , jdhongv@gmail.com , 010-1234-1111
김민아 , minakim@gmail.com , 010-1234-3333
마진주 , jjmah@gmail.com , 010-1234-5555
이서영 , sylee@gmail.com , 010-1234-7777

 

조금 더 복잡한 JSON 파일을 검색한 걸 테스트한다.

{
    "name": "홍길동",
    "alias": "LInk",
    "members": [
        "소원",
        "예린",
        "은하",
        "유주",
        "신비",
        "엄지"
    ],
    "albums": {
        "EP 1집": "Season of Glass",
        "EP 2집": "Flower Bud",
        "EP 3집": "Snowflake",
        "EP 4집": "THE AWAKENING"
    }
}

 

파싱하는 코드를 두가지로 테스트해보면 print_r 에서 결과를 다르게 보여준다.

<?php
// JSON 파일 읽어오기
$json_string = file_get_contents('weather.json');
// 다차원 배열 반복처리
$R = new RecursiveIteratorIterator(
    new RecursiveArrayIterator(json_decode($json_string, TRUE)),
    RecursiveIteratorIterator::SELF_FIRST);
// $R : array data
// json_decode : JSON 문자열을 PHP 배열로 바꾼다
// json_decode 함수의 두번째 인자를 true 로 설정하면 무조건 array로 변환된다.

print_r($R);
echo '<br />';

foreach ($R as $key => $val) {
    if(is_array($val)) {
        echo "$key:<br/>";
    } else {
        echo "$key => $val<br/>";
    }
}
?>
<?php
// Local JSON 파일 읽어오기
$json_string = file_get_contents('weather.json');
$R = json_decode($json_string, true); //
// $R : array data
// json_decode : JSON 문자열을 PHP 배열로 바꾼다
// json_decode 함수의 두번째 인자를 true 로 설정하면 무조건 array로 변환된다.

print_r($R); // 배열 요소를 출력해준다.
echo '<br />';
?>

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>PHP JSON parser sample</title>
    </head>

    <body>
        <h3 id="gname">
        <?php
            echo $R['name'];
            if (array_key_exists('alias', $R))
                printf(" (%s)", $R['alias']);
        ?>
        </h3>
        <p>멤버 구성: <span id="members">
            <?php echo implode(', ', $R['members']);?></span>
        </p>
        <h3>앨범 목록</h3>
        <ul id="albums">
        <?php
            foreach ($R['albums'] as $key => $value) {
                printf("<li>%s: %s</li>\n", $key, $value);
            }
            ?>
        </ul>
    </body>
</html>


출처: https://link2me.tistory.com/1408 [소소한 일상 및 업무TIP 다루기]

 

참고 : 배열에 배열 추가


$arrs = array();                  // 전체 배열을 준비하고
array_push($arrs, $arr)); //$arr 배열을 배열에 넣는다 (다차원 배열)

반응형

댓글()