Warning: require_once() [function.require-once]: URL file-access is disabled in the server configuration in ...

Warning: file_get_contents() [function.file-get-contents]: URL file-access is disabled in the server configuration in ...

Warning: getimagesize() [function.getimagesize.php]: URL file-access is disabled in the server configuration in ...

PHP(워드프레스)에서 files_get_contents, fopen, include 등을 사용할 때 절대 경로가 포함된 파일의 주소를 코드 내에서 사용하려고 하면 위와 같은 애러 메세지를 볼 수 있습니다.

일반적인 PHP 코드에서의 해결 방법 4가지와 워드프레스에서의 해결 방법을 소개합니다.


방법 1. php.ini 파일에 설정 추가

 allow_url_fopen = ON

 단점 : 보안상 문제가 생길 수 있으며, 서버 설정을 바꿀 수 없는 경우 적용 불가능


방법 2.  .htaccess 에 아래의 코드 삽입

 php_flag allow_url_fopen = ON

 단점 : 보안상 문제가 생길 수 있음


방법 3. php 스크립트에 아래의 코드 삽입

 ini_set('allow_url_fopen', 'On');


방법 4. fopen 대신 curl 사용

$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, ‘http://www.example.com/mew.php’);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
$contents = curl_exec($ch);

curl_close($ch); 


위의 방법은 일반적으로 php에서 files_get_contents, fopen등의 함수 사용시 발생할 수 있는 경우에 대한 해결책입니다.  

이 애러가 워드프레스에서 발생하는 경우는 아주 간단한 방법으로 해결하실 수 있습니다.

보안 위험을 높이면서 서버 설정을 바꾸실 필요 없습니다.

워드프레스에서 include_once, require_once 시에 애러가 발생하는 경우에 대한 해결 방법!

Warning: require_once() [function.require-once]: URL file-access is disabled in the server configuration in ...

Fatal error: require_once() [function.require]: Failed opening ... 

이런 애러는 아래와 같은 상황에서 발생하죠..

require_once ( plugins_url('', __FILE__ ) . "yourcode.php" 


 plugins_url('', __FILE__ ) 은 전체 url을 반환하기 때문에, allow_url_fopen이 설정되어 있지 않으면 아래와 같은 이 코드 대신 

 require_once ( plugin_dir_path( __FILE__ ) . "yourcode.php"; 

를 사용하시면 해결됩니다.


자동차보험,의료,보험,대출,미용,금융,법률,부동산,중고자동차,무료듣기,건강,돈,국민임대아파트

Posted by CodeChef

댓글을 달아 주세요

  1. 2015.06.02 19:43  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  2. Favicon of http://codechef.tistory.com BlogIcon CodeChef 2015.07.05 17:44 신고  댓글주소  수정/삭제  댓글쓰기

    php.ini 파일에서 "allow_url_fopen"의 값을 "On" 으로 변경해 주셔야 합니다.
    호스팅 업체를 이용하시는 경우 보안상의 문제로 해당 조치를 취해주지 않을 수도 있습니다.

cURL을 이용하여 데이터를 가져오는데, 아무리 해도 인코딩 문제 해결이 쉽지 않더군요.

¼­¿iÆ?º°½A ¼­AE±¸ ¾cAcμ¿ 변환 후 DB에 저장해도 이렇게 보이는..

iconv가지고 삽질하다가 mb_convert_encoding을 써봐도 해결이 쉽게 되지 않더군요.

몇 번의 삽질 끝에 다음과 같이 해결했습니다.

<환경>

PHP 스크립트의 인코딩 : UTF-8

MySQL 인코딩 : UTF-8

cURL 요청 헤더 : EUC-KR

cURL 응답 : EUC-KR

 

보통 위의 환경에서 문제가 가장 많이 발생하는데, 아래의 코드로 해결하시면 됩니다.

<코드>

$res = sendCurlPostRequest($url,$fields,$referer,"euc-kr");
$enc = mb_detect_encoding($res); // 해당 문자열의 인코딩 타입을 알아냅니다.
$res = mb_convert_encoding($res, "UTF-8","EUC-KR");

자동차보험,의료,보험,대출,미용,금융,법률,부동산,중고자동차,무료듣기,건강,돈,국민임대아파트

Posted by CodeChef
TAG PHP, UTF-8

댓글을 달아 주세요

거의 없는 경우지만….
'magic_quotes_gpc = Off' 의 문제는 다들 아실테니….

$_GET, $_POST에 대해서 일일이 addslashes() 해주기 귀찮아서 없는 실력으로 삽질했습니다.
개인 서버라면 .htaccess에 옵션으로 넣으시면 되겠지만, 호스팅의 경우 이게 필요합니다.

-----------------------------------------------------------------------------------------
if ( get_magic_quotes_gpc() != 1 ) {
   $_GET = array_map('addslashes', $_GET);
   $_POST = array_map('addslashes', $_POST);
}
-----------------------------------------------------------------------------------------

자동차보험,의료,보험,대출,미용,금융,법률,부동산,중고자동차,무료듣기,건강,돈,국민임대아파트

Posted by CodeChef
TAG PHP, 보안, 해킹

댓글을 달아 주세요

  1. Favicon of http://fillgun.tistory.com BlogIcon 필군~ 2008.11.15 14:17 신고  댓글주소  수정/삭제  댓글쓰기

    좋은글 담아갑니다 ^^

PHP 보안 팁

웹개발/PHP 2006.09.24 07:06
register_globals = Off
아직도 많은 국내의 호스팅 업체들에서 register_globals = On 으로 놓고 서비스를 하고 있으나 Off 로 해야 옳다.
물론 이렇게 하면 제로보드처럼 On에서 코딩한 것들은 쓸 수 없게 된다. (제로보드는 쓰지 않는 것이 좋다.)
register_globals = On 으로 놓고서 코드 내에서 따로 보안을 위해 변수를 검사하는 방법도 있겠으나, 그런 이중의 수고를 막으려면 php4 이상에서는 그냥 register_globals = Off 로 하고 그에 따라 코딩해야 한다.

이를테면 $a를 받아서 $b = $a; 로 처리해야 할 때는,
$b=$_GET["a"]; (GET 방식으로넘어온 변수일경우)
$b=$_POST["a"]; (POST 방식으로넘어온 변수일경우)
$b=$_COOKIE ["a"]; (cookie에서 넘어온 값이면)
$b=$_SERVER["a"]; (서버변수일경우)
$b=$_ENV["a"]; (환경변수일 경우)
$b=$_REQUEST["a"]; (서버요청변수일 경우. - GET, POST, Cookie 방식으로 넘어오는 모든 경우에 해당되며, 보안상 권장되지 않는다.)
$b=$_SESSION["a"]; (세션변수이면)
$b=$_FILES["a"]; (file 업로드로 넘어온 변수이면)
와 같이 처리해야 한다.
위 처럼 하기 귀찮을 경우, extract($_GET); 으로 선언하면 $_GET['a']로 들어오는 $a 를 자동으로 인식한다.
♣ 단, SESSION 변수의 경우 절대 extract($_SESSION); 하면 안된다. 보안에 위배되기 때문이다. if (isset($_GET['password'])) { $password = $_GET['password']; echo $password; }
.inc 파일 등 특정 확장자 소스 못보게 하기
아파치 설정파일(httpd.conf) 안에 보면 아래와 같은 라인이 있다.

AddType application/x-httpd-php .php .php3 .html .sql .ph .inc .ins
AddType application/x-httpd-php-source .phps

위에서와 같이 inc를 등록시키면 된다.
그리고 웹브라우저에서 보아도 소스는 나오지 않는다. *.inc 등으로 작성하려거든 반드시 이렇게 해야만 한다. 혹은 *.inc.php 이런 식으로 작성한다.

PHP 보안을 위한 코딩 스타일 (파일 업로드 등)
현재(2002.3) PHP4.1.2 나 PHP4.2.dev 버전을 제외한 모든 버전은 PHP4.1.2로 패치할 것을 권고하고 있다. PHP 파일 업로딩이 RFC 1867에 의해 만들어졌는데, 웹서버를 재부팅 시킬 수도 있다고 한다. PHP4.1.2 이상의 최신 버전이 아닌 모든 버전은 파일 업로드 버그가 존재한다고 한다.

예전 스타일의 파일 업로드를 사용하지 마라; HTTP_POST_FILES 배열과 관련된 함수를 사용해라. PHP 는 특별한 이름을 갖는 어떤 임시디렉토리에 파일을 업로드함으로써 파일 업로드를 지원한다. PHP 는 그 파일 이름이 존재했던 곳을 가리키기 위해 원래 많은 변수들을 설정한다. 그러나 공격자가 변수 이름 및 그 값을 제어할 수 있기 때문에 이들을 사용해 커다란 악영향을 야기할 수 있다. 대신 업로드된 파일에 접근하기 위해서는 언제나 HTTP_POST_FILES 및 관련된 함수를 사용해라. 이 경우라도 PHP 는 공격자가 임의의 내용을 갖는 파일을 업로드할 수 있게 하며 이는 그 자체로 위험함을 주목해라.

모든 입력에 대해 다른 언어에서와 같이 받아들일 수 있는지 패턴과의 일치 여부를 검사하고 그 후 문자열이 아닌 데이타를 요구되는 타입으로 맞추기 위해 타입 캐스팅을 사용해라. (예상되는) 입력의 선택된 리스트를 쉽게 검사하고 import 하기 위해 ``helper" 함수를 개발해라. PHP 는 부정확하게 타입이 정해질 수 있는데 (loosely-typed) 이는 문제를 야기할 수 있다. 예를 들어 입력 데이타가 "000" 값을 갖는다면 이는 "0" 와 같지 않으며 또한 empty() 도 아니다. 이는 특히 결합 (associative) 배열의 경우 중요한데 이들의 인덱스가 문자열이기 때문이다; 이는 $data["000"] 과 $data["0"] 이 다르다는 것을 의미한다. 예를 들어 $bar 가 double 타입임을 확인하기 위해 (double 에 적합한 포맷을 갖는지 확인한 후) 다음과 같이 해라:
$bar = (double) $bar;

위험한 함수에 주의할 것 :
코드실행함수(require(), include(), eval(), preg_replace() 등), 명령실행함수(exec(), passthru(), backtick 연산자, system(), popen() 등), 파일오픈암수(fopen(), readfile(), file()) 등.

PHP에러출력을 방지한다. php.ini의 Error_Handling 부분에서 display_errors = Off 로 설정한다. (오류가 보여지면 apache 디렉토리 위치나 htdocs 디렉토리 위치를 노출시키게 된다.)

magic_quotes_gpc() 를 사용해라. 이는 많은 종류의 공격을 제거한다.

게시판 글올릴때 html소스는 그냥 다 막아버려라. <a>태그 외에 <a onmouse= 등의 태그도 안되고 자바스크립트도 안된다. 그냥 다 막아버리면 제일 속편하다.

phpinfo();는 설치한 후 테스트하고 바로 지워라.

쿠키보다는 세션을, 세션보다는 autu인증을 사용하라.

location.replace 인증 (이동했던 히스토리 삭제) function goto_page($url) { echo "<script> location.replace('.$url.');</script>"; }

쇼핑몰 등의 사이트는 반드시 SSL을 사용하라.

디렉토리는 755대신 711로 설정. 그리고 될수있으면 아파치 httpd.conf 에서 Indexes 지운다. (index.html 파일이 없을 경우 디렉토리 목록이 출력되는 것을 방지.)

(보안) 세션, 자료실, PHP_SELF
(출처: http://tood.net)
php.ini 에서 register_globals = Off 로 설정했다면 세션의 등록은 아래와 같이 한다. <?php session_start(); $HTTP_SESSION_VARS['foo'] = "blah blah"; // $_SESSION['foo'] = "blah blah"; // $_SESSION은 PHP4.1.0 이상이다. session_register('foo'); ?>

회원 비번은 md5()로 암호화하고 php.ini에서 세션저장장소를 /tmp가 아닌 다른 장소에 저장한다. (보안을 위해)
세션 생성 시 $userid를 생성하고, $userpass = md5($userpass); 로 생성해서, 2개 값이 있는지 비교하고 isset()등으로 비교하는게 좋다.
$userpass값은 md5()로 해싱하면 32자가 되므로 길이를 확인한다.

if((session_is_registered(username)) && (session_is_registered(user_id)))
으로 체크. <?php function check_session() { session_start(); if (session_is_registered(user_id)) { return TRUE; } else { header("Location: login.php"); exit; } } ?>

파일의 경우는 $HTTP_POST_FILES 를 따로 해야 한다. extract($HTTP_POST_FILES); foreach ($HTTP_POST_FILES as $UploadedFile ) { $UploadedFile_name = $UploadedFile['name']; $UploadedFile_size = $UploadedFile['size']; $UploadedFile_type = $UploadedFile['type']; }

특히 파일의 경우 절대로 GET으로 올리지 못하게 해야한다.
upload.php?file_name=/etc/passwd$file_type=text&file_size=30
이런 식으로 해킹할 시스템의 passwd파일을 자료실에 올려버리고 다운받는 경우가 있기 때문이다. 아예 파일명 중에 pass나 shadow등이 있을 경우 올리지 못하게 하는 방법도 있다.
또는 file_exists($file_name)를 사용하여 체크한다. 로컬 시스템에 파일이 있으면 절대 못올리게 되는 것이다.

$PHP_SELF의 경우도 바로 출력되지 않는다. $_SERVER['REQUEST_METHOD']; //GET or POST $_SERVER['REQUEST_URI']; $_SERVER['PHP_SELF'];

링크로 넘어오는 값 확인
( 출처 : http://www.nzeo.com/bbs/zboard.php?id=cgi_tip&page=2&sn1=&divpage=1&sn=off&ss=on&sc=off&keyword=링크&select_arrange=headnum&desc=asc&no=1030 ) if(!eregi(getenv("HTTP_HOST"),getenv("HTTP_REFERER"))) { $reffer = getenv("HTTP_REFERER"); echo "<script>alert('여기다 무단링크시 남길 메세지');window.location.href='http://4rum.uu.st (홈주소)';</script>"; $filename = "기록할 파일 이름"; if (!file_exists($filename)) touch ("$filename"); chmod($filename,0777); $fp = fopen($filename,"a+"); if (!trim($reffer)) $reffer = "Typing or Bookmark"; fwrite($fp,"IP : $REMOTE_ADDR , REFFER : $reffer\n"); fclose($fp); exit; }

자료실에서 무단링크, 웹상에서 실행을 막는 한 가지 방법
자료를 업로드 할 때 원래이름과 바꿀이름 2가지를 디비에 저장한다. 그리고 다운로드를 받을 때는 디비에서 원래 이름을 가져와서 헤더 함수를 이용해 파일명을 원래이름으로 바꿔서 보냅니다.. 이렇게하면 저장되어있는 파일이름을 알 수가 없기때문에 무단링크, 웹상에서 실행이 불가능 하게된다. 파일이름을 안다고 해도 웹상에서는 실행되자 않는다. (아파치가 인식할 수 없는 확장자명으로 지정했을경우) 그러니까 파일을 저장할때 파일명을 $filename = date("YmdHis").".down"; 으로 한다. 그럼 200101231203.down 이런 식으로 파일명이 된다.

PHP파일문서를 자료실에 올리는 문제 (불완전정보)
자료실에 확장자 php인 자료를 올려 해당 서버의 정보를 유출하거나 자료를 삭제하는 해킹이 있을 수 있다. 이 때는 php를 사용할 디렉토리를 정한 후 모든 php소스는 그 디렉토리 밑에 두어야 한다.

예를 들어 자신의 Document Root 디렉토리가 '/home/aaa/public_html'이라면 public_html 아래에 php란 디렉토리를 만든다. 그런 다음 아파치 웹 서버의 설정파일 httpd.conf 를 다음과 같이 수정한다.

<Directory "/home/aaa/public_html"> ... php_admin_flag engine off ... </Directory> <Directory "/home/aaa/public_html"> ... php_admin_flag engine off ... </Directory>

위와 같이 설정하고 나머지 자료 아래의 html파일은 모두 php디렉토리 밖에 놓아두면 아무런 문제없이 php를 사용할 수 있을 것이다. 또 다른 방법은 자료를 올릴 때 php 파일은 전혀 등록할 수 없게 하는 방법인데 이 부분은 좀 애매한 부분이다.

자동차보험,의료,보험,대출,미용,금융,법률,부동산,중고자동차,무료듣기,건강,돈,국민임대아파트

Posted by CodeChef
TAG PHP, PHP보안

댓글을 달아 주세요

  1. Favicon of http://zetus.net BlogIcon zetus 2007.03.05 06:14 신고  댓글주소  수정/삭제  댓글쓰기

    잘보고 갑니다~ 퍼가요~♡

안녕하세요~

오늘은 두번째로 올리는 초급용 씨리즈 입니다.

오늘도 초급용 씨리즈냐고 태클 거신다면.. 그래도 초급용 입니다 -_-;;

할 수 없습니다. 아시는 분은 안보셔도 됩니다 초급용입니다 -_-;;

어제는 js를 이용한 form과 관련한 내용이었는데요

오늘은 많은 초급 phper들이 게시판을 이용해서 공부하면서

가장 힘들어하고 어려워 하는 페이징의 원리를 말씀드릴까 합니다.

페이징 : 통상 이렇게 말하는데요 저는 네비게이터 라고 자주 말합니다.

게시판의 목록에 페이지를 넘겨줄 수 있는 번호 링크를 두고 하는 말이죠..

그럼 시작해 볼까요~


제가 수업시간에 네비게이터를 수업하게 되면 자주 써먹는 과제 중에 하나가

주어진 수의 범위가 있을 때 
ex ) 0~9, 10~19, 20~29

x라는 수를 입력 받으면 어느 범위에 속하는지 알아 내는 문제를 냅니다.

※ 정확히 말하자면 범위의 첫 수를 구해내는 문제입니다. (0 ,10, 20)

자! 시간 5분 드립니다 풀어보세요!

1초
2초
3초
5분 끝!

다 푸셨나요 -0-?

왜 저 문제가 페이징 (네비게이터)와 관련있을까?

우리가 통상 php를 이용하여 프로그램을 제작하면 효율성등등 감안해서 많은

부분을 생각하게 됩니다. 하지만 이런건 숙련자들의 몫이죠 초급자는 아무리

강조해도 이런거 생각 못합니다.

그럼 무엇을 가지고 초급자들이 프로그램을 제작 해야할 까요?

무엇을 보여주고 어떻게 보여줄것인가!! 이게 관건입니다.

같이 문제를 풀어보죠

가령 5라는 수가 입력 되었다고 가정하면

(어이 거기 눈돌리지말고~ 잘봐!! 계산하고있지?)

계산하지마세요 계산은 여러분들이 하는게 아니죠? 서버(컴퓨터)가 해주는거에요

우리는 컴퓨터가 계산할 일정한 규칙성(계산식)을 만들어 주면 됩니다.

그럼 젤 먼저 해야될 일! 바로 변수의 선언입니다. 모든 프로그램에 공통적으로

시작할 때 일단 사용할 변수를 선언해 주는게 프로그램을 작성하면서 변수가 꼬인다거나

잘못된 값을 계산한다거나 하는 일 (버그)를 줄여줍니다.

$psize = 10; //수의 범위 크기 입니다.
$x = 5; //입력받은 수입니다.

5가 어느 범위에 들어갈지 우리 머리속에는 이미 인지하고 있지만

논리적으로 계산식을 만드는 것은 꾀 어렵습니다.

그런데요 잘 생각해 보면 문제안에 항상 답이 있다는 거죠~

범위의 첫수 0, 10, 20 을 구하는 식을 만들자면 5, 15, 25라는 수가 있을 때 

일반적인 수학을 생각하면 절대 답 없습니다.

5를 주어진 수의 범위로 일단 나누고 봅시다 0보다는 5가 크니 빼버리면 되겠지만

15가 입력된다면 15를 또 빼줘도 0이 되지 10이되지는 않겠죠?

5-5=0
15-15=0
절대 자기 자신을 빼버려서는 답이 없다!!

그래서 일단 나눠봅시다

5/10 = ? 0.5
15/10 = ? 1.5
25/10 = ? 2.5

음.. 뭔가 비슷한 모양이 나올거 같군요

왜 나누냐고요? 더하거나 곱하면 수거 더 커지지 작아 지지는 않겠죠?

그래서 나누어 봤습니다.

그럼 저렇게 구해진 값을 이제 변수로 지정해 봅시다.

$start_num = $x / $psize;

일단 이런식이 만들어 지겠네요

0.5 , 1.5, 2.5 이렇게 나온 값을 이제 php 내장 객체인 floor를 이용해서

소수점을 버려 봅시다!

$start_num = floor($x / $psize);

하니까 x의 값이 달라질 때 마다 0, 1, 2 라는 수를 start_num이 가지게 되겠죠?

그런데~ 여기서 끝난게 아닙니다. 0, 10, 20 이렇게 되도록 하고 싶은데요

저런 수에다가 주어진 범위의 크기만큼 곱셈을 하면 어떻게 될까요?

그렇습니다~

$start_num = floor($x / $psize) * $psize;

0은 아무리 큰수를 곱해도 0이고 1곱하기 10은 10, 2곱하기 10은 20이니

우리가 원하는 범위의 첫번째 수를 구하는 것을 해결했습니다.

그럼 저 공식이 왜 필요한가?

보여주는 숫자를 보니 1부터 시작하는데... 페이지 번호는 0번부터라니..

이상하자나요~ 하고 질문하는 학생 꼭 있습니다!!

그건 바로 배열과 관련된 부분과 물질수의 10진수와 수학의 10진수는

항상 1의 갭이 있다는걸 생각해야 합니다.

우리가 통상 사용하는 물질수의 10진수는 1,2,3,~10 이 겠지만

수학에서의 10진수는 0~9까지의 수를 말합니다.

그럼 배열은? 배열에서 자동으로 부여되는 (php를 포함한 특정 언어만) 인덱스 key는

0부터 시작합니다. 물론 10진수고요.


자 이제 1단계 과제가 해결되었습니다.

※ 2단계 과제
주어진 글의 개수가 534개다 페이지당 10개씩 보여준다면
페이지는 총 몇개의 페이지가 되는가?

음.. 어렵나요? 쉽죠?

10개씩 보여준다면야 당연히 10으로 나누면 총 페이지의 갯수가 나오는데요

여기서 놓치기 쉬운 부분이 마지막에 남는 글의 갯수랍니다.

534/10=? 53.4

그럼 페이지 수가 53.4개라는건데 소수점은 어떻게 해주는게 좋을까요?

그렇습니다~ 바로 소수점 무조건 올림인 ceil 함수를 이용하여

올림수인 54페이지를 만들어 줘야 마지막에 남는 0.4페이지분량의 글을

모두 보여줄 수 있다는거죠


그럼 총 페이지의 개수도 구했습니다.

이제 해야할 마지막 관문!!!

※ 문제3 그럼 한 화면에 10개씩 페이지 번호를 보여준다면
이런 단위블럭이 몇개가 나오나요?

위 문제와 유사하죠? 그렇습니다 3번문제가 요구하는 것은

네비게이터의 이전 , 다음 링크를 만들기 위한 조건으로 사용될 일정한 값을

구하기 위한 문제 입니다.

그럼 실질적 아래 예제 코드를 이용해서 확인해 복습해 봅시다.


<?
$start = $_GET[start];
$total = 534;//총 레코드수
$scale = 10;//페이지당 출력 레코드수
$page_scale = 10; // 화면당 출력할 페이지 수 
if(!$start) $start = 0;//시작 페이지 번호가 없을경우 0 

$total_page = ceil($total/$scale);//총 페이지수
$page = floor($total_page/$page_scale);//단위블럭페이지수
$n_page = floor($start/$page_scale);//현재 단위블럭 페이지번호

if($n_page > 0){
//이전 링크 출력 조건 현재단위블럭 페이지 번호가 0보다 클경우
   $p_start = ($n_page-1)*$page_scale;
//현재 단위블럭 페이지 -1 * 단위블럭 페이지 출력수(page_scale)
   $link = "<a href='".$_SERVER[PHP_SELF]."?start=${p_start}'>";
   $link .= "이전";
   $link .= "</a>";
   echo $link." ";
}
$is = $n_page*$page_scale;//단위블럭 페이지 시작번호 구하기 현재 페이지 번호를 이용하여 현재 단위블럭 페이지 번호를 구하고 그 값을 이용하여 단위블럭 페이지 출력수를 곱한 값 
for($i=$is; $i < $is+$page_scale; $i++){
//i는 현재 단위블럭 페이지 번호*단위블럭 페이지 출력수 부터 시작하고 i는 단위블럭 페이지 출력수를 더한 값만큼만 반복하도록 지정
   if($i < $total_page){//i가 총 페이지수 보다 작을 동안만 출력하기 위한조건
       $link = "<a href='".$_SERVER[PHP_SELF]."?start=${i}'>";
       $link .= $i+1;//start값이 i로 지정됨으로 화면상 출력기준을 1부터 시작하는 10진수로 맞추기 위해 +1을 연산
       $link .= "</a>";
       echo $link." ";
   }
}

if($n_page < $page){//현재 단위블럭 페이지번호 보다 총 단위블럭 페이지 수가 작을 경우에만 다음 링크 출력
   $link = "<a href='".$_SERVER[PHP_SELF]."?start=${i}'>";//i는 상단 for문에서 이미 마지막 페이지 start번호보다 +1한 값을 가지고 있기 때문에 i를 그냥 출력함
   $link .= "다음";
   $link .= "</a>";
   echo $link;
}

?>



어떠셨나요?

선행 학습내용을 잘 읽어 보신분이라면 쉽게 이해가 되었을 것입니다.

선행 학습내용만 잘 이해한다면 어떠한 언어로로 페이징은 만들어 낼 수 있습니다.

코드가 중요한게 아니라 바로 로직 or 알고리즘이 중요하다는거 잊지맙시다 



출처 : http://woorisay.x-y.net/

자동차보험,의료,보험,대출,미용,금융,법률,부동산,중고자동차,무료듣기,건강,돈,국민임대아파트

Posted by CodeChef
TAG PHP

댓글을 달아 주세요

php 스쿨을 산책하다가 내용이 좋아서 가져왔습니다 :)



반갑습니다.

오늘도 여지없이 돌아온 초급용 입니다.

그간 업무가 바쁜관계로.. (-_ㅡ;  전혀 죄송하지 않습니다.

세번째 초급용 함수와 클래스의 기본 개념에 대해서 써볼까 합니다.

그 첫번째 시간으로 함수에 대해서 알아 봅시다..

뭐 앞서 제가 이런 글을 쓰는 이유를 모르시는 분들은 js편을 먼저 보시기 바랍니다.

초급용이라 아시는 분은 안보셔도 됩니다. 태클은 영구반사 아이템을 사용하겠습니다.

프로그램을 제작 하다보면 많은 코드의 양때문에 혹은 반복적으로 발생되는

코드때문에 우리는 아주 열심히 잘 하는?, 안가르쳐 줘도 타고나는 재주?를 여지없이

발휘합니다. 궁극의 Ctrl + C & V 신공 (-_ㅡ)))

하지만 이런거 말고 좀더 쉬운게 없을까요? 일의 효율성을 높일 수 있는 궁극적인

해결책 그 첫번째 방법이 바로 사용자 정의 함수 (user function)! 음.. 사용자 정의

함수라는 명칭이 있는지 잘 모르겠군요 ^^; 하지만 저는 그렇게 부릅니다.

언어를 제가 개발한 언어 개발자가 아니기 때문에 만들어 놓은 문법에 따라 언어를

사용하는 사용자라는 개념에서죠. 아무튼 함수의 생성에 관한 이야기 입니다.

직접적인 코드도 있지만 개념적인 설명이 많기 때문에 다소 지겨울 수도 있습니다.

책을 통한 설명이나 개시판을 통한 학습을 하다 보면 많은 초급 개발자분들이 함수를

어떻게 만들어야 할까에 대해서 많은 고민을 하게 됩니다.

쉬운 예로

자 오늘은 페이징로직을 이용한 함수를 만들어 봅시다~

이러면 페이징을 배웠어도 어떻게 함수로 만들어야 할지 또 함수를 만들면 어떻게

함수가 동작되는가, 함수를 사용하면 어떤 이점이 있는가 등등 별의별 잡다한 생각을

하면서 결국

function paging(){
|
}

커서를 저 위치에 놓고 궁리만 하고 있죠 -_-;;

결론부터 말씀드리면 함수를 쉽고 빨리 만들기 위해서는 먼저 기능구현부터 해야합니다.

함수부터 만들겠다고 function 함수명() 이렇게 해놓으면 다음에 뭘 해야 할지 솔직히

감 안오죠. 수십번을 만들어도 마찮가지입니다. 수백번을 만든다면 가능해질 문제이긴

합니다만.. 우리에게는 그렇게 많은 시간이 없다는것이죠.

선행 학습 내용으로 함수는 어떻게 동작되는가를 알아야 겠습니다.

php해석기(parser) 는 function을 만나게 되면 일단 메모리에 로드시켜 놓습니다.

변수를 선언했을 때 메모리의 일정 공간을 선언된 변수명으로 할당받는 것과 같은

이치 입니다. 선언된 변수와 함수는 언제든 재사용 가능하다는거 아시겠죠?

다만 php의 특성상 파일단위 프로그램이 종료되면 모든 변수와 함수는

언로드(메모리에서 삭제) 된다는 것을 유의 하시기 바랍니다.

특정 기술인 공유메모리, 세마포어 등을 이용하면 타 사용자간의 데이터 공유도
 
가능합니다만.... C언어를 먼저 공부를 해야만 메모리 접근,제어에 이해가 될 것입니다.

그럼 실질적인 예제를 통해서 함수를 만드는 방법을 읶혀 보겠습니다.

※ 기능구현 ( 구구단 3단)

아주 고전적인 예제중 구구단 만들기라는 예제가 있습니다.

아주 오래된 예제이지만 현재도 기초수업에 사용되는 이유는 각종 제어문을

다양하게 사용함으로서 문법과 로직을 효과적으로 이해하는 좋은 예제이기 때문입니다.

구구단 출력에 관한 코드는 별도의 주석을 첨부하지 않겠습니다.

$dan = 3;
$exp = 1;
$summary = 0;
while($exp < 10){
    $summary = $dan * $exp;
    echo $dan .' * '. $exp .' = '. $summary .'<br />';
    $exp++;
}

쉽죠? 이정도는 알고 계시리라 생각하고 진행 하겠습니다.

기능은 완벽했습니다. 더이상 나무랄데 없이 정확한 결과가 출력되었습니다.

우리가 원하는 기능이 구현된 상태에서 함수를 제작하겠습니다.

일단 아무 생각하지말고 function 부터선언합시다!!

※ 함수선언

function gugudan(){
    $dan = 3;
    $exp = 1;
    $summary = 0;
    while($exp < 10){
        $summary = $dan * $exp;
        echo $dan .' * '. $exp .' = '. $summary .'<br />';
        $exp++;
    }
}

음.. 뭔가 좀 되는 분위기!! 어이 수업에 불만있냐 눈돌리지마라

5분만 집중하면 1년뒤 연봉이 달라진다! ㅡ_-?? (진짜?)

그런데 이제 두번째 항목으로 생각해야 할 문제가 발생 했습니다.

이렇게 해놓으면 항상 gugudan함수를 호출할 때 마다 3단만 출력된다는게

불만입니다. 이렇게 할 거 같으면 뭐하러 함수를 쓴단 말인가 그냥 복사&붙이기신공을

쓰는거랑 뭐가 다르단 말인가?

그렇습니다~

그래서 나온게 매개변수 입니다.

함수를 만드는데 있어서 결정적으로 프로그램의 유기적 흐름을 만들기 위한 방법!

그런데 이 매개변수를 하기전에 먼저 전역변수와 지역변수에 대한 개념이 잡혀 있어야

합니다.

전역변수
<?
$toto ="전역변수다~";
$로또 = "이것도 전역변수다~";
?>

어? 변수명을 한글로???

가능합니다 ^^ php만이 가능한 기능중에 하나죠

하지만 성능적으로는 안좋습니다. 이유는 1byte처리와 2byte처리에 있습니다.

아무튼 여러분은 여지껏 전역변수만을 사용했다면 이제는 지역변수도 알아야 합니다.

<?
$toto = "전역변수";
echo $toto;
function act(){
    echo $toto;
    $toto = "지역변수";
    echo $toto;
}
?>

아니 변수명이 같자나? 그런데 엄격히 말하면 함수 안의 변수와 함수 밖의 변수는

시스템에서 다르게 인식합니다.

함수 안에서 사용하는 변수는 지역변수이기 때문에 두번째 echo는 아무것도 출력하지

못합니다.

그럼 매개변수는 뭐에요????

매개변수는 이런 지역변수와 전역변수간의 특정 data를 주고 받는 통로이자 함수 내에서

사용할 변수를 미리 선언해 놓은 것입니다. 어렵나요? 아래 예제를 보시죠~!

<?
$toto = "나 전역변수!!";
function act ( $gaga ) {//변수 $gaga 가 바로 매개 변수입니다.
    echo $gaga;
}
act ( $toto ); /// 문제의 핵심 함수를 호출할 때!!
?>
act라는 함수를 호출할 때 gaga변수가 받아야 할 정보를 가지고 있는 $toto변수를

지정해 줌으로써 toto변수의 값을 gaga변수가 가지게 되는 것이죠.

음.. 그럼 이제 매개변수를 이용해서 함수를 호출할 때 지정해준 단의 구구단을

출력해 봅시다.

※ 매개변수

<?
function gugudan($dan){
    $exp = 1;
    $summary = 0;
    while($exp < 10){
        $summary = $dan * $exp;
        echo $dan .' * '. $exp .' = '. $summary .'<br />';
        $exp++;
    }
}
gugudan( 4 );//$dan 변수가 받을 값을 직접 지정
?>

이런 코드가 되었습니까?

아니 매개 변수 자리에 그냥 4를 지정했네요?

맞습니다 함수를 호출할 때에는 매개변수의 자리에 데이터를 직접 지정해도 되고

혹은 선언된 변수를 지정해도 됩니다.

이렇게 함으로써 여러분은 이제 입력되는 수에 따라 해당 수의 구구단을 출력하는

함수를 만들었습니다.

그럼 꼭 매개변수를 써야만 함수 안과 밖의 특정 값을 주고 받을 수 있습니까?

아닙니다. 매개변수 이외에도 전역화(global) 라는 개념이 있습니다.

global로 선언된 변수들은 함수 안밖에 구애받지 않고 사용할 수 있습니다.

다시 말하면 전역변수, 지역변수의 개념이 아닌 하나의 변수를 공통적으로

사용하는 방법입니다.

※ global

<?
function gugudan(){
    global $dan;
    $exp = 1;
    $summary = 0;
    while($exp < 10){
        $summary = $dan * $exp;
        echo $dan .' * '. $exp .' = '. $summary .'<br />';
        $exp++;
    }
}
$dan = 4;
gugudan();
?>

$dan변수를 함수 내에서 global로 선언하면 더이상 $dan변수는 지역변수가 아닌

전역화 되어서 함수 안,밖에서 동일하게 취급받습니다.

함수를 호출하기 전에 $dan 변수에 4를 지정했기 때문에 정상적으로 4단이 출력되는

것을 볼 수 있습니다. 전역화도 마찮가지로 하나의 변수만을 쓰는것은 아닙니다.

global $변수명, $변수명, $변수명; 이런 형식으로 쓸 수 있습니다.


이 예제에서 사용되지 않은 return 이라던가 복수의 값을 전달하는 방법등은

여러분이 직접 생각해 보시기 바랍니다. (복수의값 리턴 힌트는 배열입니다.)

아시다 싶이 매개변수라는 것은 한개만을 사용할 수 있는 것은 아닙니다.

함수 내부적으로 어떤 데이터를 처리할 것이냐에 따라 매개변수는 여러개가 될

수 있습니다.

이제 함수를 만들기 위한 방법을 정리를 해보죠.

1. 기능구현.

2. 함수선언.

3. 자료를 입력받을 것인가? 내부적으로 처리할 것인가?

4. 매개변수를 사용하면 몇개를 사용할 것인가?

5. 실행 결과를 함수내에서 출력할 것인가? 호출한 곳으로 되돌려 줄것인가?

1,2 항목은 일반적 진행이면 3~5항목은 여러분이 즉 함수를 만드는 사람이

선택해야 할 문제 입니다.

이번 함수 만들기편에서 많은 부분을 다루고 싶었지만 그렇게 되면 너무 깊이 들어

가게 됨으로 본래의 취지인 초급용 이상의 내용을 다루게 될 것 같아서 여기에서

마무리 짖겠습니다.

P.S) 함수를 만들 때 유의사항

1. 반복적으로 사용되는 내용인가?

2. 단편화 or 모듈화 되었는가?

위 두가지 항목은 함수를 반복적으로 만드는 연습을 하다보면 자연스레

깨우치게 될 것입니다. 다만 노파심에.. 고운하루 되시길 빕니다.



출처 : http://woorisay.x-y.net

자동차보험,의료,보험,대출,미용,금융,법률,부동산,중고자동차,무료듣기,건강,돈,국민임대아파트

Posted by CodeChef

댓글을 달아 주세요

주소입니다 : http://woorisay.x-y.net/phpmm/frames.html

자동차보험,의료,보험,대출,미용,금융,법률,부동산,중고자동차,무료듣기,건강,돈,국민임대아파트

Posted by CodeChef

댓글을 달아 주세요

::::::::::::::
html.php
::::::::::::::
<html><head>
<link rel="stylesheet" href="css.php?id=<?=$_GET['id'];?>" type="text/css">
</head>
<body>
<p class=line>
Line Line Line Line Line Line Line Line Line Line Line Line Line Line Line Line
</p>
</body></html>
::::::::::::::
css.php
::::::::::::::
<?php
header( "Content-type: text/css");

switch( $_GET['id']) {
case 'A': echo "p.line { border: 1px solid green; }"; break;
case 'B': echo "p.line { border: 1px dotted blue; }"; break;
case 'C':
default:  echo "p.line { border: 2px solid cyan; }"; break;
}

자동차보험,의료,보험,대출,미용,금융,법률,부동산,중고자동차,무료듣기,건강,돈,국민임대아파트

Posted by CodeChef
TAG CSS, PHP

댓글을 달아 주세요

DB 관련 자주 사용하는 함수를 깔끔한 클레스로 정리한 것. PEARDB를 이용했습니다.
PHP5년 경력의 배테랑이 정리한 소스코드와 강의입니다~;
그동안 반복작업에 지친 분들이 읽으면 정말 많은 도움이 될 것입니다.


1편 : http://d-3-b.com/blog/177
2편 : http://d-3-b.com/blog/178
3편 : http://d-3-b.com/blog/179

자동차보험,의료,보험,대출,미용,금융,법률,부동산,중고자동차,무료듣기,건강,돈,국민임대아파트

Posted by CodeChef
TAG PHP

댓글을 달아 주세요