[php] PHPMailer 로 외부 SMTP 활용하여 메일 보내기
내용을 보시려면 비밀번호를 입력하세요.
[php] PHPMailer 로 외부 SMTP 활용하여 메일 보내기 (0) | 2024.02.08 |
---|---|
Rocky Linux 9.x, PHP 8.1.x 환경에서 Laravel 10.33.0 설치하기 (0) | 2023.11.23 |
PHP 소켓 (server.php, client.php) - 데이터 전달 예제 (0) | 2023.07.07 |
PHP 에서 SQL Injection 방지 쿼리 사용법 두가지 (bind_param, PDO) (0) | 2022.08.30 |
PHP 날짜 비교하기 (0) | 2022.04.13 |
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
Rocky Linux 9.x, PHP 8.1.x 환경에서 Laravel 10.33.0 설치하기 (0) | 2023.11.23 |
---|---|
PHP 코드를 실행해주는 사이트 (버전 선택 가능) (0) | 2023.11.17 |
PHP 에서 SQL Injection 방지 쿼리 사용법 두가지 (bind_param, PDO) (0) | 2022.08.30 |
PHP 날짜 비교하기 (0) | 2022.04.13 |
[PHP] AES-256-CBC 를 이용한 암호화 및 복호화 (0) | 2022.04.11 |
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 코드를 실행해주는 사이트 (버전 선택 가능) (0) | 2023.11.17 |
---|---|
PHP 소켓 (server.php, client.php) - 데이터 전달 예제 (0) | 2023.07.07 |
PHP 날짜 비교하기 (0) | 2022.04.13 |
[PHP] AES-256-CBC 를 이용한 암호화 및 복호화 (0) | 2022.04.11 |
PHP 에서 json 문자열을 예쁘게 출력하려면 (0) | 2021.11.11 |
일반 변수에 들어있는 날짜 텍스트로는 비교가 안됩니다. 아래와 같이 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 소켓 (server.php, client.php) - 데이터 전달 예제 (0) | 2023.07.07 |
---|---|
PHP 에서 SQL Injection 방지 쿼리 사용법 두가지 (bind_param, PDO) (0) | 2022.08.30 |
[PHP] AES-256-CBC 를 이용한 암호화 및 복호화 (0) | 2022.04.11 |
PHP 에서 json 문자열을 예쁘게 출력하려면 (0) | 2021.11.11 |
PHP 와 MySQL 연동 확인 소스 (0) | 2021.11.08 |
[코드]
<?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 에서 SQL Injection 방지 쿼리 사용법 두가지 (bind_param, PDO) (0) | 2022.08.30 |
---|---|
PHP 날짜 비교하기 (0) | 2022.04.13 |
PHP 에서 json 문자열을 예쁘게 출력하려면 (0) | 2021.11.11 |
PHP 와 MySQL 연동 확인 소스 (0) | 2021.11.08 |
PHP에서 JSON 배열 삭제 (0) | 2021.10.15 |
아래와 같이 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 날짜 비교하기 (0) | 2022.04.13 |
---|---|
[PHP] AES-256-CBC 를 이용한 암호화 및 복호화 (0) | 2022.04.11 |
PHP 와 MySQL 연동 확인 소스 (0) | 2021.11.08 |
PHP에서 JSON 배열 삭제 (0) | 2021.10.15 |
PHP 에서 json 형식의 다차원 배열 값 읽고 출력하기 (0) | 2021.10.05 |
아래는 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] AES-256-CBC 를 이용한 암호화 및 복호화 (0) | 2022.04.11 |
---|---|
PHP 에서 json 문자열을 예쁘게 출력하려면 (0) | 2021.11.11 |
PHP에서 JSON 배열 삭제 (0) | 2021.10.15 |
PHP 에서 json 형식의 다차원 배열 값 읽고 출력하기 (0) | 2021.10.05 |
PHP 에서 MySQL 데이터 불러오기 두가지 (한줄, 여러줄) (0) | 2021.07.22 |
PHP를 사용하여 JSON 파일에서 배열을 삭제하려고합니다.
PHP를 사용하여 배열 삭제를 설정하는 방법을 잘 모르겠습니다. jQuery 측면을 처리 할 수 있습니다.
프론트 엔드에서 버튼을 클릭하면 해당 배열이 삭제됩니다.
다음은 JSON 파일의 예입니다.
다음은 PHP 예제입니다 :
[출처] https://www.python2.net/questions-1051494.htm
PHP 에서 json 문자열을 예쁘게 출력하려면 (0) | 2021.11.11 |
---|---|
PHP 와 MySQL 연동 확인 소스 (0) | 2021.11.08 |
PHP 에서 json 형식의 다차원 배열 값 읽고 출력하기 (0) | 2021.10.05 |
PHP 에서 MySQL 데이터 불러오기 두가지 (한줄, 여러줄) (0) | 2021.07.22 |
PHP 와 JWT (JSON Web Tokens)를 이용한 예제 (0) | 2021.05.17 |
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 배열을 배열에 넣는다 (다차원 배열)
PHP 와 MySQL 연동 확인 소스 (0) | 2021.11.08 |
---|---|
PHP에서 JSON 배열 삭제 (0) | 2021.10.15 |
PHP 에서 MySQL 데이터 불러오기 두가지 (한줄, 여러줄) (0) | 2021.07.22 |
PHP 와 JWT (JSON Web Tokens)를 이용한 예제 (0) | 2021.05.17 |
php 에서 json 파일 읽기 (2차원 배열) (0) | 2021.01.05 |