• composer.json
"require":{
  "google/apiclient" : "^2.0"
}
  • routes/web.php
Route::get('googleLoginPage',['as'=>'googleLoginPage', 'uses'=> 'GoogleController@googleLoginPage'])
Route::get('callbackGoogle',['as'=>'callbackGoogle', 'uses'=> 'GoogleController@callbackGoogle'])
  • GoogleController
use Google/Client as Google_Client;

# 구글 로그인 페이지
public function googleLoginPage(){
  $this->getGoogleOauthClient("login");
}

# 구글 유저 정보 가져오기
public function callbackGoogle(){
  $client = $this->getGoogleOauthClient("auth");
  $plus = new \Google_Service_Oauth2($client);
  
  $userData = $plus->userinfo->get();
  
  # 유저 정보
  $social_id    = $userData->id; 
  $social_email = $userData->email;
  $social_name  = $userData->name;  
  
}

private function getGoogleOauthClient($type){
  $client_id = $this->client_id;
  $client_secret = $this->client_secret;
  $authCode = $_GET['code'];
  $redirectURI = '도메인/callbacokGoogle';
  
  $client = new Google_Client();
  $client->setScopse(
    array(
      \Google_service_Oauth2::USERINFO_PRIFILE,
      \Google_service_Oauth2::USERINFO_EMAIL
    )
  );
  
  $client->setClientId($client_id);
  $client->setRedirectUri($redirectURI);
  $client->setAccessType('offline');
  $client->setPrompt('select_account consent');
  
  if(!empty($authCode) && $type == 'auth'){
    # 로그인 페이지가 아닌, 인증 받은 후 유저 정보를 가져올때 $client_secret 필요
    $client->setClientSecret($client_secret);
  }
  
  if($client->isAccessTokenExpired()){
    if($client->getRefreshToken()){
      $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
    }else{
       if(!empty($authCode) && $type == 'auth'){
          $accessToken = $client->fetchAccessTokenWithAuthCode($authCode);
          $client->setAccessToken($accessToken);
          if(array_ket_exists('error', $accessToken)){
            throw new Exception(join(',',$accessToken));
          }
       }elseif($type =='login'){
         # 구글 로그인 페이지로 리다이렉트
         header("location".$client->createAuthUrl());
       }
    }
  }  
  if($type != "login"){
    return $client;
  }  
}

D.P에서 나왔던 몬티홀 법칙 

첫 번째 선택을 안 바꾸고 당첨될 확률과

꽝을 본 후 선택 바꿨을 때 당첨될 확률을 봤는데..

숫자를 점점 늘리니깐 바꿨을 때가 더 높게 나오더라고요 ㅋㅋ

<?php

function montyhall($user){
   $nochange_count = 0;
   $change_count = 0;
   $door = [1,2,3];
   
	

   for($i=0; $i < $user; $i++){
      $car = rand(1,3);
      $user_choice = rand(1,3);
	// 유저가 선택을 바꾸지 않았을때 당첨 count
      if($car == $user_choice){
         $nochange_count +=1;
    }
   
      $monty_door, $second_choice;

	// 사회자가 꽝의 문을 골라줌
      foreach($door as  $val){
         if($val != $car && $val != $user_choice){
            $monty_door = $val;
         }
      }
      $monty_open = $monty_door;
	
	// 사회자가 열어준 문도 아닌, 유저가 처음에 선택한 문도 아님 -> 선택을 바꿨을 경우
      foreach($door as $val2){
         if($val2 != $monty_open && $val2 != $user_choice){
            $second_choice = $val2;
         }
      }
	
	// 유저가 선택을 바꿨을때 당첨 count
      if($car == $second_choice){
         $change_count += 1;
      }

   }
   
   echo $change_count."<br>";
   echo $nochange_count."<br>";

   echo "바꿨을때 : " .$change_count/$user."<br>";
   echo "변경 안했을때 : " .$nochange_count/$user."<br>";
}


montyhall(100);

?>

 

 

test.html

1
2
3
4
    <form id="uploadForm" method="post" enctype="multipart/form-data" action="excel_upload.php">
        <input name="uploadFile" id="uploadFile" type="file" />
        <input type="submit" name="action" value="Upload" />
    </form>
cs
 
excel_upload.php

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
?php
include $_SERVER["DOCUMENT_ROOT"]."/func/PHPExcel/PHPExcel.php";
 
//-- 읽을 범위 필터 설정
$rangeArr = range('A','L');
class MyReadFilter implements PHPExcel_Reader_IReadFilter
{
    public function readCell($column$row$worksheetName = '') {
        global $rangeArr;
        // Read rows 1 to 7 and columns A to E only
        if (in_array($column,$rangeArr)) {
            return true;
        }
        return false;
    }
}
$filterSubset = new MyReadFilter();
 
$filename = 'test.xlsx';
$upfile_path = './' . $filename;
$path = pathinfo($filename);
$UpFileExt = strtolower($path['extension']);
$inputFileType = '';
 
//파일 타입 설정 (확자자에 따른 구분)
if($UpFileExt == "xls") {
    $inputFileType = 'Excel5';    
}elseif( $UpFileExt == 'xlsx' ){
    $inputFileType = 'Excel2007';
}
 
 
if( file_exists ($upfile_path&& $inputFileType ) {
 
 
    //엑셀리더 초기화
    $objReader = PHPExcel_IOFactory::createReader($inputFileType);
 
    //데이터만 읽기(서식을 모두 무시해서 속도 증가 시킴)
    $objReader->setReadDataOnly(false);    
 
    //범위 지정(위에 작성한 범위필터 적용)
    $objReader->setReadFilter($filterSubset);
 
    //업로드된 엑셀 파일 읽기
    $objPHPExcel = $objReader->load($upfile_path);
 
    //첫번째 시트로 고정
    $objPHPExcel->setActiveSheetIndex(0);
 
    //고정된 시트 로드
    $objWorksheet = $objPHPExcel->getActiveSheet();
 
    //시트의 지정된 범위 데이터를 모두 읽어 배열로 저장
    $sheetData = $objPHPExcel->getActiveSheet()->toArray(null,true,true,true);
    $total_rows = count($sheetData);
 
//echo "<pre>";print_r($sheetData);echo "</pre>\n";
 
    $kk = 0;
    echo '<table border="1" cellpadding="0" cellspacing="0" width="100%">';
    foreach($sheetData as $rows) {
        if$kk ==0 ){
            echo '<tr>';
            foreach( $rangeArr as $key=>$val ){
                echo '<td>'.$rows[$val].'</td>';            }
            echo '</tr>';
        }else{
            echo '<tr>';
            foreach( $rangeArr as $key=>$val ){
                echo '<td>'.$rows[$val].'</td>';
            }
            echo '</tr>';
        }
 
        $kk++;
    }//end foreach
    echo '</table>';
 
}else{
    echo 'Error!!';
}
 
?>
 
 
 
cs




fopen

resource fopen ( string $filename , string $mode [, bool $use_include_path = false [, resource $context ]] )

$filename

파일을 로드할 파일명 또는 파일이있는 주소 이다.


$mode


어떠한 모드로 파일을 열 것인지 설정하는 인자.

인자

모드 

포인터 위치 

파일이 존재 유무 

읽기 전용 

파일의 시작 

파일 내용 보존 

r+ 

읽고 쓰기 

파일의 시작 

파일 내용 보존 

쓰기 전용 

파일의 시작 

파일 내용 삭제, 없으면 새로 생성 

 w+

읽고 쓰기 

파일의 시작 

파일 내용 삭제, 없으면 새로 생성 

쓰기 전용 

파일의 끝 

파일 내용 보존, 없으면 새로 생성 

a+ 

읽고 쓰기 

파일의 끝 

파일 내용 보존, 없으면 새로 생성 

쓰기 전용 

새로운 파일 생성 

파일이 존재하면 flase 리턴  

x+ 

읽고 쓰기 

새로운 파일 생성 

파일이 존재하면 flase 리턴 


파일 읽고 쓰기 예제


$m ='수정할 text';

$dir ='파일 주소'

$file_handle = fopen($dir, "w+") or die("can't open file");

fputs($file_handle, $m);

fclose($file_handle);



새창에서 안열리고 이미지 다운로드 됨

downTest.html

<a href="fileDown.php?filename=testimg01&Imgurl=이미지URL">Download</a>

======================================================================

fileDown.php

<?php

$filename = $_REQUEST['filename']; $save_dir = $_REQUEST['Imgurl']; /*
Header("Content-type: application/x-msdownload"); Header("Content-Disposition: attachment; filename=".$filename.".png"); Header("Content-Transfer-Encoding: binary"); Header("Pragma: no-cache"); Header("Expires: 0");
$handle = fopen($save_dir, "r"); while(!feof($handle)){ echo fread($handle,4096); };
*/

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($filename));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($save_dir));
ob_clean();
flush();
readfile($save_dir);
exit;

?>

date : 로컬 날짜/시간을 형식화 한다.


string date ( string $format [, int $timestamp ] )


정수형으로 주어지는 timestamp나, timestamp가 주어지지 않았을 경우에는 현재 로컬 시간을 사용하여, 주어진 포맷 문자열에 따라 형식화한 문자열을 반환합니다. 즉 timestamp는 선택적이고, 기본값은 time()의 값입니다.


 인수 

format

다음 문자들을 format 인수 문자열로 인식한다.

--- 일 ---
d  :  일, 앞에 0이 붙는 2 숫자  [ 01에서 31 ]
D  :  요일 글자 표현, 3 문자 [ Mon에서 Sun ]
j  :  앞에 0이 붙지 않는 일 [ 1에서 31 ]
l  :  (소문자 'L') 요일의 완전한 글자 표현 [ Sunday에서 Saturday ]
N  :  요일의 ISO-8601 숫자 표현 (PHP 5.1.0에서 추가) [ 1(월요일)에서 7(일요일) ]
S  :  일 영어 접미사, 2 문자 [ st, nd, rd, th. j와 같이 사용하기 좋음. ]
w  :  요일 숫자 표현 [ 0(일요일)에서 6(토요일) ]
z  :  해당 연도 일차 [ (0에서 시작) 0에서 365 ]


--- 주 ---
W  :  ISO-8601 주차, 주는 월요일에 시작 (PHP 4.1.0에서 추가) [ 예시: 42 (그 해의 42번째 주) ]


---월 ---
F  :  January나 March 같은 월의 완전한 글자 표현 [ January에서 December ]
m  :  0이 붙는 월 숫자 표현 [ 01에서 12 ]
M  :  월의 축약 글자 표현, 3 문자 [ Jan에서 Dec ]
n  :  0이 붙지 않는 월 숫자 표현 [ 1에서 12 ]
t  :  주어진 월의 일 수 [ 28에서 31 ]


--- 연 ---
L  :  윤년 여부 [ 윤년엔 1, 그 외엔 0 ]
o  :  ISO-8601 연도. Y와 같지만, ISO 주차(W)가 전해나 다음해에 해당하면, 그 연도를 사용합니다. (PHP 5.1.0에서 추가) [ 예시: 1999나 2003 ]
Y  :  연도의 완전한 숫자 표현, 4 숫자 [ 예시: 1999나 2003 ]
y  :  도의 두 숫자 표현 [ 예시: 99나 03 ]


--- 시간 ---
a  :  오전과 오후의 소문자 [ am 또는 pm ]
A  :  오전과 오후의 대문자 [ AM 또는 PM ]
B  :  스와치 인터넷 시간 [ 000에서 999 ]
g  :  0이 붙지 않는 12시간 형식 시 [ 1에서 12 ]
G  :  0이 붙지 않는 24시간 형식 시 [ 0에서 23 ]
h  :  0이 붙는 12시간 형식 시 [ 01에서 12 ]
H  :  0이 붙는 24시간 형식 시 [ 00에서 23 ]
i  :  0이 붙는 분 [ 00에서 59 ]
s  :  초, 0이 붙음 [ 00에서 59 ]
u  :  마이크로초 (PHP 5.2.2에서 추가) [ 예시: 54321 ]


--- 시간대 ---
e  :  시간대 식별자 (PHP 5.1.0에서 추가) [ 예시: UTC, GMT, Atlantic/Azores ]
I  :  (대문자 i) 일광 절약 시간 여부  [ 일광 절약 시간이면 1, 아니면 0 ]
O  :  그리니치 시간(GMT)과 시차 [ 예시: +0200 ]
P  :  시와 분 사이에 콜론이 들어가는 그리니치 시간(GMT)과 차이 [ 예시: +02:00 ]
T  :  시간대 축약어 [ 예시: EST, MDT ... ]
Z  :  시간대 오프셋 초. UTC 서쪽은 항상 음수, UTC 동쪽은 항상 양수 [ -43200에서 50400 ]


--- 날짜/시간 표현 ---
c  :  ISO 8601 날짜 (PHP 5에서 추가) [ 2004-02-12T15:19:21+00:00 ]
r  :  ≫ RFC 2822 형식 날짜 [ 예시: Thu, 21 Dec 2000 16:01:07 +0200 ]
U  :  유닉스 에포치(January 1 1970 00:00:00 GMT)부터 초수 [ time() 참조 ]


timestamp

선택적인 timestamp 인수는 timestamp가 주어지지 않앗을 경우, 현재 로컬 시간을 기본값으로 가지는 integer 유닉스 타임스탬프이다. 

죽, 기본값은 time() 값이다.


'PHP' 카테고리의 다른 글

[PHP] php에서 파일 생성 및 수정하기  (0) 2017.08.25
[PHP] 간단한 이미지 다운로드 (수정)  (0) 2017.08.23
[PHP] str_replace  (0) 2017.08.14
[PHP] 반복문(while, do..while, for)  (0) 2017.07.17
[PHP] 조건문 Switch  (0) 2017.07.04

str_replace 발견한 모든 검색 문자열을 치환 문자열로 교체


str_replace($search, $replace, $subject[, int $count])


subject에서 발견한 모든 search를 주어진 replace 값으로 치환한 문자열이나 배열을 반환한다.


(정규표현식처럼) 복잡한 치환 규칙이 필요하지 않으면, ereg_replace()나 preg_replace() 대신 이 함수를 사용해야 된다.


search와 replace가 배열이면, str_replace()는 각가의 배열에서 취한 값을 사용해서 subject를 검색 치환한다.


replace가 search보다 적은 값을 가지고 있으면, 나머지 치환값으로 빈 문자열을 사용한다.


search가 배열이고 replace가 문자열이면, search의 모든 값에 이 치한 문자열을 사용한다.


search나 replace가 배열이면, 그 요소는 처음부터 마지막 순으로 처리된다.


subject가 배열이면, 검색 및 치환을 subject의 모든 원소에서 수행하고, 배열을 반환한다.


count 넘겨지면, 매치하여 교체하는 수를 가진다.


이 함수는 치환한 값을 가지는 문자열이나 배열을 반환한다.


예제


<?php

$bodytag = str_replace("%body%", "black", "<body text='%body%'>");

//결과 : <body text='black'>


$vowels = array("a", "e", "i", "o", "u", "A", "E", "I", "O", "U");

$onlyconsonants = str_replace($vowels, "", "Hello World of PHP");


echo $onlyconsonants; 

//결과 : Hll Wold f PHP


$phrase  = "You should eat fruits, vegetables, and fiber every day.";

$healthy = array("fruits", "vegetables", "fiber");

$yummy   = array("pizza", "beer", "ice cream");


$newphrase = str_replace($healthy, $yummy, $phrase);


echo $newphrase."<br>"; 


//결과 : You should eat pizza, beer, and ice cream every day.


$str = str_replace("ll", "", "good golly miss molly!", $count);

echo $count."<br>"; // 2


$str     = "Line 1\nLine 2\rLine 3\r\nLine 4\n";

$order   = array("\r\n", "\n", "\r");

$replace = '<br />';


// \r\n을 먼처 처리해서 두번 변환되지 않도록 합니다.


$newstr = str_replace($order, $replace, $str);

echo $newstr."<br>";

/*

결과 : 

Line 1

Line 2

Line 3

Line 4

*/


$letters = array('a', 'p');

$fruit   = array('apple', 'pear');

$text    = 'a p';

$output  = str_replace($letters, $fruit, $text);

echo $output;

//결과 : apearpearle pear


?>

'PHP' 카테고리의 다른 글

[PHP] 간단한 이미지 다운로드 (수정)  (0) 2017.08.23
[PHP] Date 함수  (0) 2017.08.14
[PHP] 반복문(while, do..while, for)  (0) 2017.07.17
[PHP] 조건문 Switch  (0) 2017.07.04
[PHP] 조건문 - IF문  (0) 2017.07.03

반복문(WHILE, DO..WHILE, FOR)


WHILE, DO..WHILE 문


while (조건) {

실행문;

}

* 조건이 참인 동안 실행문이 반복되어 실행된다.

* 반복을 벗어나기 위해서는 실행문내에 조건을 변경하거나, break 문이 필요하다.

* 조건에 변화가 없으면 무한 반복된다.

* 조건은 실행문이 반복될 때 마다 반복해서 실행된다.


ex) while 문을 이용하여 1에서 10까지 출력

$a=1;

while($a<=10){

echo $a."<br>";

$a++;

}


결과





do {

실행문;

}while(조건)


* While문의 병형으로 일단 실행문 실행되고 조건이 검사된다.

* While문과 다른 점은 조건이 처움부터 거짓이라도 실행문이 한번은 실행이 된다.

* 현재는 거이 쓰지 않다 ㅠㅠ


앞써 보여준 1에서 10까지 출력을 Do while 문으로 바꾸면

$a = 1;

do{

echo $a."<br>";

$a++;

}while($a<=10);


결과는 똑같다.



이렇게 된다.


while문을 이용한 홀/짝수의 합을 구하기!

test.html


화면 


test.php

결과값 : 



for 문


for(초기식; 조건; 증감식){

실행문;

}


* 조건이 참인 동안 실행문을 반복 실행한다.

* 초기식은 맨 처음 한번만 실행된다.

* for문은 반복횟수를 구체적으로 확인 가능, 가장 가독성이 좋다.


ex) for문을 이용하여 1에서 10까지 출력

for($a=1; $a<=10; $a++){

echo $a."<br>";

}




Continue문


Continue문은 반복문 내에서 쓰이는 제어문이다.

이런 제어문은 break문도 있는데 ,

break 문은 반복문을 완전히 빠져나오는 기능을 하는 반면,

continue문은 현재 수행중인 반복을 종료하고 다음 반복으로 건너뛰는 기능을 담당한다.



'PHP' 카테고리의 다른 글

[PHP] Date 함수  (0) 2017.08.14
[PHP] str_replace  (0) 2017.08.14
[PHP] 조건문 Switch  (0) 2017.07.04
[PHP] 조건문 - IF문  (0) 2017.07.03
[PHP] 연산자  (0) 2017.07.03

SWITCH문


switch(변수 또는 수식){

case 값1 : 

문장1;

문장2;

brack;


case 값2 : 

문장1;

문장2;

brack;


default : 

문장1;

문장2;

...

}


* Switch문은 조건을 판별하는 것이 아니라 변수 또는 수식의 값을 판별하여 일치하는 case 절을 실행한다.

* Case 값에는 변수가 올 수 없다.

 - Case 값에는 변수 이외 제약 사항이 없다.

 - 실수, 문자 등 다양한 값이 가능하다.

* break;를 쓰지 않으면 이하의 모든 실행문이 실행된다.

* break; 문은 제어문이나 순환문으로 부터 탈출한다.

* 일치하는 값이 없을 경우 default에 정의된 문장을 실행하고 Switch문이 종료된다.


'PHP' 카테고리의 다른 글

[PHP] str_replace  (0) 2017.08.14
[PHP] 반복문(while, do..while, for)  (0) 2017.07.17
[PHP] 조건문 - IF문  (0) 2017.07.03
[PHP] 연산자  (0) 2017.07.03
[PHP] 변수와 연산자 - 변수와 데이터 타입  (0) 2017.07.03

조건문을 이용한 프로그램 - IF문

1. if문

if (조건)

 문장;

또는

if (조건) {
 문장1;
 문장2;
 ...
 
}

- 조건이 TRUE이면 문장이 실행되고 FALSE이면 실행 되지 않는다.
- 조건은 TRUE이나 FALSE 중에 하나의 값으로 판별이 가능해야 한다.
- 다음 조건이 FALSE인 경우이다.
  * 블린언(Boolean)에서 FALSE인 경우
  * 조건의 값이 형식과 상관없이 0인 경우
  * 값나 지정된 변수가 없는 경우
  * 원소가 없는 배열이거나 빈 문자열인 경우


예제) 입력된 값 중에 큰 값을 출력한다.


test.html
<html>
 <head>
  <title> 입력 폼파일 </title>
  <meta http-equiv="content-type" content="text/html; charset=utf-8">
 </head>
 <form method="post" action="test.php">
  A : <input type="text" name="a"><br>
  B : <input type="text" name="b"><br>
   <input type="submit" name="확인" value="확인">
   <input type="reset" value="취소"><br>
 </form>
</html>


test.php
<?php
 $a = $_POST["a"];
 $b = $_POST["b"];
 if($a>$b){
  echo "입력 값 중 큰 값은 \$a(".$a.")입니다.";
 }
 if($a<$b){
  echo "입력 값 중 큰 값은 \$b(".$b.")입니다.";
 }
 if($a==$b){
  echo "두 값이 동일합니다.";
 }

?>

test.html

test.php


입력 폼

||

==========================================================



if else 문


if (조건)
 문장;
else 
 문장;


또는


if (조건){
 문장1;
 문장2;
}else{
 문장1;
 문장2;
}


- 조건이 TRUE이면 if 절의 문장이 실행되고, FALSE이면 else절의 문장이 실행된다.
- 둘 중 하나를 선택하는 if문을 '분기문' 이라 부르기도 한다.


if else if 문


if(조건1){
 문장1;
}else if(조건2){
 문장1;
}else if(조건3){
 문장1;
}else{ //default
 문장1;
}


- 조건이 여러 개일 경우 각 조건에 해당하는 문장을 실행한다.
- 조건에 일치하는 경우가 없다면 default 문장을 실행한다.


score.html
<html>
 <head>
  <title> 학점 계산기 </title>
  <meta http-equiv="content-type" content="text/html; charset=utf-8">
 </head>
 <h2>학점 계산기</h2>
 <form method="post" action="score.php">
  평균 점수 : <input type="text" name="score"><br><br>
     <input type="submit" name="확인" value="확인">
     <input type="reset" value="취소"><br>
 </form>
</html>


score.php
<?php
 $score = $_POST["score"];
 if($score>90){
  echo "당신의 학점은 A 입니다.";
 }else if($score>80){
  echo "당신의 학점은 B 입니다.";
 }else if($score>70){
  echo "당신의 학점은 C 입니다.";
 }else if($score>60){
  echo "당신의 학점은 D 입니다.";
 }else{
  echo "당신의 학점은 F 입니다.";
 }

?>

score.html

score.php

결과



'PHP' 카테고리의 다른 글

[PHP] 반복문(while, do..while, for)  (0) 2017.07.17
[PHP] 조건문 Switch  (0) 2017.07.04
[PHP] 연산자  (0) 2017.07.03
[PHP] 변수와 연산자 - 변수와 데이터 타입  (0) 2017.07.03
[PHP] Explode  (0) 2017.06.30

+ Recent posts