PHP에서 MVC 모델 형태로 웹 시스템을 개발하다보면 DB에 저장, 혹은 DB 정보를 수정하는 URL이 생성되는데 문제는 해당 URL을 막바로 웹브라우저 주소 창에 입력하게 될 경우 문제가 발생하게 된다.
DB에 insert하는 경우의 URL을 웹 브라우저에서 막바로 입력해서 막바로 접속할 경우 시스템을 정교하게 만들지 않을 경우 데이터가 없는 새로운 레코드가 생성되는 불상사가 발생하게 된다.

http://xxx.xxx.xxx/adm/reg/member 
  ⇒ 회원가입 페이지(reg_member.php)
    ⇒ http://xxx.xxx.xxx/adm/save/member
       ⇒ DB에 회원 정보 insert(AdmModel.php -> insertMember())

여기서 사용자가 웹 브라우저 주소창에  http://xxx.xxx.xxx/adm/save/member 이 URL로 막바로 접속할 경우 AdmModel.php의 insertMember() 함수가 실행되어 DB에 입력 값이 없는 회원 레코드가 하나 생성되는 불상사가 발생한다는 것이다.
따라서 이런 경우를 막기 위해서는 아래와 같이 간단한 몇줄의 코드로 방어할수 있다.

        public function registeMember($regMbr){
            $prevPage = parse_url($_SERVER['HTTP_REFERER'], PHP_URL_PATH);

            if($prevPage != '/adm/reg/member'){
                echo "<script>alert('허용되지 않는 잘못된 접근입니다.');</script>";
                return;
            }
        }

HTTP_REFERER 환경 변수는 이전 페이지의 URL 값을 담고 있는 환경변수이다. 따라서 정상적인 경우라면 /adm/save/member URL로 들어오기 전 URL은 /adm/reg/member 이어야 하는 것이다. 이 값이 아닌경우라면 차단하면 되는 것이다.
즉 브라우저에서 회원 정보를 등록하는 URL인 http://xxx.xxx.xxx/adm/save/member로 막바로 접속시 위의 $prevPage에는 아무 값이 없다. 따라서 그런 경우는 차단을 하면된다.

PHP에서 MVC 모델 방식에서 Controller 기능을 구현할려면 어떻게 해야 할까? 혹은 FrontController 기능을 구현할 경우 어떻게 해야 할 것인가?
php의 경우는 url 경로에 맞는 해당 경로에 php 소스가 1:1로 대응되도록 되어 있다.

http://xxx.xxx.xxx/reserve/list.php

일 경우 웹 Document Root 디렉토리 아래의 reserve 디렉토리 안에 list.php소스가 있어야 되는 식이다.
문제는 이런 방식으로 동작하기 때문에 어느 특정 디렉토리의 특정 php 소스를 Controller 역할을 하게 할수가 없게된다. 달리말해서 어떤 형태의 url이 들어오더라도 무조건 특정 디렉토리의 특정 php 소스를 무조건 실행되게 할수가 없다는 것이다.
어떤 경우의 url 형태가 요청되더라도 항상 특정 php가 실행되어야 해당 php 소스가 Controller 역할을 수행할수 있는것 아니겠는가?

또 url 경로에 맞는 디렉토리에 해당 소스가 있다는 것은 그 소스가 노출될 위험성을 안고 있는 보안상의 문제가 있게 된다.

PHP의 경우 이러한 난점을 해결하고 모든 url에 대해 특정 php로 redirect 시켜 해당 php가 FrontController 역할을 하도록 하기 위해 apache의 기술을 이용하면 Controller 기능을 구현할수 있다.
이때 사용하는 것이apache의 rewrite 모듈이다. 

apache의 rewrite 모듈은 apache의 모듈의 한 종류로 서버로 접속해 오는 request를 정해진 규칙을 통해 특정 경로의 파일로 redirect 시키는 역할을 하는 모듈이다.
아래의 절차를 따라 진행하면 된다(Ubuntu 16.04를 기준으로 작성된 글이다).

(1) Apache rewrite 모듈 활성화
아래 명령어를 통해 apache rewrite 모듈을 활성화 한다.

# a2enmod rewrite

(2) Apache 설정에서 rewrite 기능을 사용가능하도록 설정 변경
아래의 경로에 있는 apache2.conf 파일을 열어 설정을 변경한다.

# vi /etc/apache2/apache2.conf

<Directory /var/www/>
	Options Indexes FollowSymLinks
	AllowOverride None
	Require all granted
</Directory>

위의 AllowOverride None을 AllowOverride All로 변경

(3) .htaccess 파일에서 규칙 생성
웹 Document Root 디렉토리에 .htaccess 파일을 생성한다. apache2의 웹 document root가 어디인지 확인할려면 Ubuntu 16.04의 경우 /etc/apache2/sites-available/000-default.conf 파일을 열면 아래와 같은 내용이 있을 것이다.

DocumentRoot /var/www/html

따라서 .htaccess 파일을 /var/www/html/ 에 생성해서 아래의 내용을 입력한다.

RewriteEngine On
RewriteBase /
RewriteRule ^([^.?]+)$ /ebook3/index.php

.htaccess 파일을 작성하는 규칙은 복잡한 많은 내용이 있지만 여기서는 최소한으로 간략히 표현 경우이다.
위의 설정 내용의  /ebook3/index.php에서 /가 의미하는 것은 어느 경로 위치를 의미하는가 하는 것이다. 즉 여기서 /의 위치는 어디이냐 하는 것이다.
여기서 /ebook3/index.php의 위치는 Web DocumentRoot의 경로 위치인 /var/www/html/ebook3/index.php를 의미한다. 따라서 /가 의미하는 것은 Web DocumentRoot의 위치를 의미한다.

위의 내용은 어떤 형태의 url로 접근을 하더라도 무조건 /ebook3/index.php로 redirect 시키라는 규칙이다.
만일 
http://xxx.xxx.xxx/reserve/list
http://xxx.xxx.xxx/reserve/view
http://xxx.xxx.xxx/reserve/list/json
...
과 같이 url이 reserve로 시작하는 모든 경우 /ebook3/index.php로 이동시키고 싶다면 RewriteRule을 다음과 같이 하면 될 것이다.

RewriteRule ^reserve /ebook3/index.php

(4) apache2  재시작
이상의 모든 설정 사항이 적용되도록 아파치 재 구동

# service apache2 restart

rewrite 모듈이 정상적으로 구동중인지 확인할려면 phpinfo() 를 통해 나오는 페이지에서 "Loaded Modules" 항목을 보면 mod_rewrite라는 항목이 있으면 해당 모듈이 정상 동작하고 있는 것이다.

이상의 작업이 완료되면 이제 PHP에서 MVC 모델을 적용하되 FrontController 역할을 index.php로 할수 있게된다. 즉 접속해 오는 모든 url을 무조건 index.php로(혹은 index.php가 아니어도 상관없다) redirect 시키고 index.php에서 url을 분석해서 각각의 url에 맞는 기능으로 분기시키면 이제 php에서도 Java의 Controller 역할을 수행하는 것이 가능하게 된다.
아래는 index.php가  FrontController(혹은 Controller) 역할을 하도록 간단하게 코드의 뼈대만 작성하면 이런식이 될 것이다.

아래는 index.php가 FrontController(혹은 Controller) 역할을 하도록 간단하게 코드의 뼈대만 작성하면 이런식이 될 것이다.

$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);

switch($path)
{
case '/reserve/list' :
   //원하는 기능
   bareak;

case '/reserve/view' :
   //원하는 기능
   break;

case '/reserve/insert' :
   //원하는 기능
   bteak;

case '/reserve/list/json' :
   //원하는 기능
   bteak;

default :
   //에러 페이지
   break;
}

 

MySQL db dump로 DB 내용을 백업 받은 것을 다시 MySQL에 복구하고자할 때 복구가 되지 않는 경우가 있다.
MySQL db에 접속할 계정의 user id가 root라고한다면 아래와 같은 커맨더가 정상적으로 DB를 복구해야 한다.
(test.sql이 DB 내용을 dump로 백업 받은 파일이고 복구하고자 하는 DB가 testDB라고 할 경우. 아래는 맥, 리눅스에서의 명령어 예이다)
 
$ mysql -uroot -p testDb < /Users/Documents/test.sql

testDb를 열어서 보면 Empty인 경우가 있다.
이렇게 복구가 안되면 다음을 체크해 볼것

아래의 내용은 커맨드 라인에서가 아닌 phpmyAdmin을 이용해서 복구를 할 경우에 대한 내용이다.
phpinfo()를 실행해서 나온 결과에서 

upload_max_filesize ==> 이 값이 아마도 기본 값 2M로 되어 있을 것이다.
post_max_size ==> 이 값이 아마도 기본 값 8M로 되어 있을 것이다.

이럴경우 test.sql의 크기가 upload_max_filesize에서 설정한 2Mb보다 클 경우 복구가 안될 것이다.
이 경우 php.ini 파일을 열어서 upload_max_filesize의 값을 더 높게 설정해 주어야 한다.

맥이나 리눅스의 경우 /etc/php.ini가 해당 파일의 경로이다.
참고적으로 post_max_size의 값이 upload_max_filesize의 설정 값보다 더 높게 설정해야 한다는 것이다.

자세한 정보는 아래를 참조

1.16 I cannot upload big dump files (memory, HTTP or timeout problems).

Starting with version 2.7.0, the import engine has been re–written and these problems should not occur. If possible, upgrade your phpMyAdmin to the latest version to take advantage of the new import features.

The first things to check (or ask your host provider to check) are the values of max_execution_time, upload_max_filesize, memory_limit and post_max_size in the php.ini configuration file. All of these settings limit the maximum size of data that can be submitted and handled by PHP. Please note that post_max_size needs to be larger than upload_max_filesize. There exist several workarounds if your upload is too big or your hosting provider is unwilling to change the settings:

Look at the $cfg['UploadDir'] feature. This allows one to upload a file to the server via scp, FTP, or your favorite file transfer method. PhpMyAdmin is then able to import the files from the temporary directory. More information is available in the Configuration of this document.

Using a utility (such as BigDump) to split the files before uploading. We cannot support this or any third party applications, but are aware of users having success with it.

If you have shell (command line) access, use MySQL to import the files directly. You can do this by issuing the “source” command from within MySQL:

source filename.sql;

PHP로 사이트를 개발하다보면 특정 변수의 값을 브라우저가 아닌 브라우저 콘솔에 출력해서 확인해 보고 싶은 때가 있다.
그런데 만일 PHP 소스에서 다음과 같이 하면

echo "<h1>Hello world</h1>";

이건 현재 웹 페이지에 Hello world라는 문자열을 큰 글씨로 출력하게 된다. 이 말인즉은 사용자가 특정 웹 페이지로 이동할때 갑자기 저 문구가 뜬금없이 큰 글씨로 사용자 웹 브라우저에 보여지게 된다는 것이다.
즉 echo로 출력하게 되면 브라우저 콘솔이 아닌 브라우저 화면 자체에 출력이 된다.
그러면 일반 사용자에게는 보이지 않고 콘솔에 출력할려면 어떻게 해야 되는가?
다음과 같이 하면 된다.

echo '<script>';
echo 'console.log(“Hello world”)’;
echo '</script>';

그러면 이번에는 특정변수의 값을 출력할려면 어떻게 해야 하는가? 아래와 같이...

echo '<script>';
echo 'console.log("'.$sql_notice.'")';
echo '</script>';

그러면 이번에는 콘솔이 아닌 alert()을 이용해서 화면에 출력할려면? 아래와 같이...

echo '<script>';
echo 'alert("Yes, Mobile~");';
echo '</script>';

그러면 alert()에 특정 변수의 값을 출력할려면? 아래와 같이..

echo '<script>';
echo 'alert("isMobile : '.$isMobile .'");';
echo '</script>';

그러면 이번에는 콘솔에 특정 변수 하나의 값이 아닌 배열의 내용을 출력할려면?
다른 곳에서 퍼온 내용인데 아주 유용하다. 예를 들어서 DB에서 가져온 배열의 내용이 $result에 담겨 있을 때 이를 출력할려면 print_r($result)로 하면 화면 상에서 쉽게 확인이 되지만 실제 운영중인 사이트의 경우는 참으로 곤란해 진다. 이때 아래와 같이 하면 콘솔 상에서 배열에 담긴 많은 내용을 사용자 화면에 아무런 영향을 주지 않고 콘솔 상에서 쉽게 확인이 가능하다.

$result에 DB에서 가져온 값이 배열로 담겨 있다고 할때, 아래와 같이

//$result에 담긴 배열 값 콘솔에 출력하기
echo "<script>\r\n//<![CDATA[\r\nif(!console){var console={log:function(){}}}";
$arr = explode("\n", print_r($result, true));

foreach ($arr as $temp) {
  if (trim($temp)) {
      $temp = addslashes($temp);
      echo "console.log(\"{$temp}\");";
  }
}
echo "\r\n//]]>\r\n</script>";

위의 경우는 배열의 key-value중 value 값만 출력한 경우라면 이번에는 배열의 key-value 형태로 출력하는 경우를 보자.

//배열을 console에 출력하기($result에 배열 형태의 데이터가 있을 때 key-value 형태로 출력하기)
echo "<script>\r\n//<![CDATA[\r\nif(!console){var console={log:function(){}}}";
foreach ($result as $key => $line) {
        $key = addslashes($key);
        $line = addslashes($line);
        echo "console.log(\"${key} : {$line}\");";
}
echo "\r\n//]]>\r\n</script>";   
 

본 포스트는 네이버페이 연동하면서 진행했던 내용을 중심으로 정리하고자 한다.
다음과 같은 XML 데이터를 생성해서 응답하는 기능을 구현 한다고 가정해 보자.

<response>
   <item id="xxx">
      <name><![CDATA[ 상품명 ]]></name>
      <url>http://xxx.xxx.com/mainNew/.../xxx.php</url>
      <description><![CDATA[...상세설명...]]></description>
      <image>
         http://xxx.xxx.com/xxx_file/xxx.jpg
      </image>
      <thumb>
         http://xxx.xxx.com/xxx_file/xxx.jpg
      </thumb>
      <price>27000</price>
      <quantity>100</quantity>
      <category>
         <first id="xxx">대분류</first>
         <second id="xxx">중분류</second>
         <third id="">소분류</third>
      </category>
   </item>
</response>

이때 주의해야 할 사항 및 요령은
    
① 엘리먼트 값으로 한글이 들어가야 하는 부분에 대해 character encoding 처리를 잘 해줘야 한다. 
위의 경우는 name, description 엘리먼트에 한글 값이 설정되는 부분이다. 그리고 통상적으로 XML를 생성할 때 XML의 엘리먼트에 들어갈 값은 DB로부터 획득해서 설정하게 될 것이다. 이때 DB에 저장된 한글 데이터가 EUC-KR인지 UTF-8인지 잘 분별해서 엘리먼트에 값이 들어가도록 해야한다. 만일 DB에 저장된 데이터가 EUC-KR인데 XML 생성은 UTF-8로 한다면 다음과 같이 처리해야 한다. 그렇지 않으면 XML 생성시 Encoding error라는 XML parsing 에러가 발생되고 XML이 생성되지 않는다.

$nameFromDB = "여기에 DB로부터 가져온 name의 값이 들어있다고 하면";
$name = iconv("EUC-KR", "UTF-8", $nameFromDB);

$nameFromDB에 있는 EUC-KR 타입의 한글을 UTF-8로 변경해서 $name에 저장한다.

$descriptionFromDB = "여기에 DB로부터 가져온 description의 값이 들어있다고 하면";
$description = iconv("EUC-KR", "UTF-8", $descriptionFromDB);

② http url 정보가 들어가야 하는 엘리먼트에서(위의 경우 url, image, thumb) http url에 &가 포함되어 있을 경우 &라는 특수문자는 &문자 자체로 인식되지 않고 특수한 기능을 하는 문자로 취급되기 때문에 EntityRef: expecting ';'라는 에러 발생한다. 예를들어서 다음과 같은 경우이다.

http://xxx.xxx.com?id=1234&tid=3456
이를 경우 str_replace()함수를 이용해서 &를 &로 바꿔줘야 한다.

$itemUrl = str_replace("&", "&", $원본데이터);

③ XML을 생성중 다음과 같은 에러가 발생했다면 왜, 어디서, 어떤 이유때문에 에러가 발생했는지를 쉽게 파악할 수 있는 방법이 있다.
This page contains the following errors:
error on line 4 at column 19: xmlParseEntityRef: no name
Below is a rendering of the page up to the first error.

이 경우 웹 브라우저의 해당 페이지에서 마우스 우측 클릭하여 "페이지 소스 보기"(크롬의 경우)를 하면 아래와 같은 내용이 표시되는 4번 라인에서 url 엘리먼트에 특수문자들이 들어가 있다(아래의 경우는 에러를 의도적으로 발생시키기 위해 이 값들을 넣은 경우이다). 이를 경우 urlencode() 함수 등으로 특수 문자들을 변환해줘야 한다.

<?xml version="1.0" encoding="euc-kr"?><response>
<item id="itemid">
	<name><![CDATA[상품 명]]></name> 
	<url>http://"/:@&%=?.#"#$%=+/test.html</url> 
	<description><![CDATA[간지나는 아이템]]></description> 
	<image>http://localhost/test.jpg</image> 
	<thumb>http://localhost/test.jpg</thumb> 
	<price>1000</price> 
	<quantity>1</quantity>
	<category>
		<first id="MJ01">대분류</first>
		<second id="ML01">중분류</second>
		<third id="MN01">소분류</third> 
	</category>
</item> 
</response>

이제 본격적으로 PHP로 위의 예시와 같은 XML을 생성하는 코드를 작성해 보자.

<?php
    header('Content-Type: application/xml;charset=utf-8'); 
    echo ('<?xml version="1.0" encoding="utf-8"?>');
?>

<response>

<?php
    $dbData = "위의 XML예시에서 XML에 들어갈 item 요소가 여러개 일 경우의 데이터";	

    //아래와 같이 반복문을 통해 위의 예시의 XML에서 복수개의 item 항목을 가진 XML을 만들고자 할 경우
    for($i=0; $i<count($dbData); $i++) {
        $price = "DB로부터 가져온 가격 데이터";
        $quantity = 50;
        $itemUrl = "http://xxx.xxx.com/...";
        $imgUrl = "http://xxx.xxx.com/...";

        $nameFromDB = "여기에 DB로부터 가져온 name의 값이 들어있다고 하면";
        $name = iconv("EUC-KR", "UTF-8", $nameFromDB);

        $descriptionFromDB = "여기에 DB로부터 가져온 description의 값이 들어있다고 하면";
        $description = iconv("EUC-KR", "UTF-8", $descriptionFromDB);
?>

<item id="<?=$id?>">
	<name><![CDATA[<?=$name?>]]></name> 
	<url><?=$itemUrl?></url> 
	<description><![CDATA[<?=$description?>]]></description> 
	<image><?=$imgUrl?></image> 
	<thumb><?=$imgUrl?></thumb> 
	<price><?=$price?></price> 
	<quantity><?=$quantity?></quantity>
	<category>
		<first id="<?=$product[0][bdr_category_code1]?>">대분류</first>
		<second id="<?=$product[0][bdr_category_code2]?>">중분류</second>
		<third id="<?=$product[0][bdr_category_code3]?>">소분류</third>
	</category>
</item> 
<?php
	} //for
	//end while;
	echo('</response>');
?>

이렇게 하면 PHP에서 간단하게(?) XML을 생성해서 클라이언트들의 request에 응답할 수 있다. 
이상의 내용은 네이버페이 연동 개발을 하면서 진행했던 내용이었다.

PHP에서 DB에 저장되어 있는 데이터를 가져와서 도표(table) 형태로 표시할 때 모든 행이 같은 색상이면 가독성의 측면에서 바람직하지 않을 것이다. 이럴때 홀수 행의 색상을 약간 다르게 표시하면 가독성이 훨씬 높아 질 것이다.

이럴 경우 CSS를 이용하면 매우 간단하게 처리를 할수가 있다.

아래와 같은 코드가 있다면 이 코드가 생성해 내는 테이블은 짝수 행의 색상이 약간 짙은 회색(#f2f2f2)으로 표현되어 한 행 건너마다 기본 색상과 다르게 표현되어 가독성이 훨신 좋아 질 것이다.

이러한 기능을 하는 핵심 코드가 아래에서 CSS의 #tmTable tr:nth-child(even){background-color: #f2f2f2;}이다.

물로 이를 위해서는 table의 id를 tmTable로 지정해 주어야 하는 것은 당연한 일이다.


<!DOCTYPE html>

<html lang="en" dir="ltr">

  <head>

    <meta charset="utf-8">

    <meta name="viewport" content="width=device-width, initial-scale=1">

    <title>TM현황</title>

    <style type="text/css">

     ... 중 략 ...

      #tmTable tr:nth-child(even){background-color: #f2f2f2;}

    </style>

  </head>

  <body>

    <div id="wrap">

      <h1>업체현황</h1>

      <a href="./login.html">로그인</a>

      <table id="tmTable">

        <thead>

          <th>No.</th>

          <th>날짜</th>

          <th>업체명</th>

          ... 중 략 ...

          <th>복합기</th>

        </thead>

    <?php

include_once 'config.php';

$conn = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);

if(!$conn){

echo "Error: Unable to connec to MySQL.".PHP_EOL;

echo "Debugging errno: ".mysqli_connect_errno().PHP_EOL;

echo "Debugging error: ".mysqli_connect_error().PHP_EOL;

exit;

}


if(mysqli_connect_errno()){

echo "Failed to connect to TM Database".mysqli_connect_error();

exit;

}


$query = "SELECT * FROM tm order by seq desc;";

$rt = mysqli_query($conn, $query);


while($row = mysqli_fetch_assoc($rt))

{

        echo "<tr>";

          echo "<td>".$row['seq']."</td>";

          echo "<td>".$row['year'].".".$row['month'].".".$row['day']."</td>";

          echo "<td>".$row['company']."</td>";

                            ... 중 략 ...

echo "<td>".$row['copier']."</td>";

        echo "</tr>";

}


mysqli_close($conn);

    ?>

      </table>

    </div>

  </body>

</html>



PHP로 웹 프로그래밍시 "미팅 일시"를 기준으로 DB의 정보를 정렬해서 웹에 보여준다고 가정할때 어떤 식으로 처리하면 좋을까?

예를 들어 미팅 일시는 2018.6.19 15:30과 같은 시간이라고 가정해 보자. DB의 특정 필드에 이 값 그대로를 저장한다면 추후에 미팅 일시 필드를 기준으로 오름차순이나 내림 차순으로 정렬하기가 불편해 지게 된다.

이럴 경우에 '타임스탬프'를 이용하면 모든 것이 깔끔해진다.


타임스탬프란 1970년 1월 1일 0시 0분 0초를 기점으로 총 경과한 시간을 초 단위로 표현한 정수 값이다.

가령 2018.6.19 4:28분 정도의 시간이면(초는 귀찮으니 그냥 생략) 타임스탬프로 1529393299 정도의 값이 나올 것이다.


정리하면

 -. "미팅 일시"를 사람이 입력할때는 2018.6.19 15:30과 같은 형식으로 입력

 -. 2018.6.19 15:30의 시간을 DB에 저장할 때는 이에 해당하는 타임스탬프로 저장

 -. DB에 저장되어 있는 "미팅 일시" 필드의 타임스탬프를 기준으로 정렬 후 웹 페이지에 보여줄 때는 타임스탬프를 "년.월.일 시:분"과 같은 형태로 표시


결국은 이 과정을 위해서는 

타임스탬프 시간 ↔ 년.월.일 시:분

의 시간 형태로 상호 변환을 처리하는 과정이 필요하게 되어진다.


이를 위한 함수를 PHP에서는 제공해 주고 있다. 그 함수가

date()

strtotime() 두 함수이다.


년.월.일 시:분의 값을 타임스탬프로 변환해 보자. 

여기서 참고적으로 "1970.01.1 13:22"과 같은 형태는 strtotime() 함수가 인식하지 못하는 형태이다. 인식할수 있는 형태는

1970-01-01 13:22 혹은

1970/01/01 13:22과 같은 형태라야 한다.


$meetingTime = '1970-01-1 13:22';

echo "1970년 1월 1일 13:22을 타임스탬프 값으로 : ".strtotime($meetingTime)."<br/>";


1970년 1월 1일 13:22의 타임스탬프 값은 15720이다.

이번에는 타임스탬프의 값을 년.월.일 시:분의 형태로 변환해 보자.


$mTimeStamp = '15720';

echo "타임스탬프의 값을 한국형 시간형태로 변환 : ".date('Y.m.d H:i', $mTimeStamp)."<br/>";




PHP에서 2차원 배열의 내용을 출력하는 편리한 방법.


PHP에서 2차원 배열 전체를 출력하고자 할때 

list()함수와 each()함수를 이용하면 쉽게 구현할 수 있다.



<?php

$kkk = array(

        array('TIR', 'Tires', 100),

      array('OIL', 'Oil', 10),

      array('SPK', 'Spark Plugs', 4),

      array('ABC', 'Alphabet', 50)

          );


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

while(list($k, $v) = each($kkk[$i])) {

echo $k." => ".$v."<br>";

}

echo "<br/>";

}

?>


each()함수는 배열(여기서는 $kkk)의 처음부터 차례대로 하나씩 key-value의 쌍으로 반환하다가 끝에 도달하면 자동으로 멈춘다.

list()함수는 key-value의 쌍을 2개의 변수(여기서는 $k와 $v)에 나누어 담는 역할을 한다.


위의 코드를 실행하면 아래와 같이 출력된다.


0 => TIR

1 => Tires

2 => 100


0 => OIL

1 => Oil

2 => 10


0 => SPK

1 => Spark Plugs

2 => 4


0 => ABC

1 => Alphabet

2 => 50





안드로이드에서 JSON으로 보낸 데이터를 PHP에서 수신하기


$value = json_decode() 함수를 이용한다.


$value = 

     json_decode(file_get_contents('php://input'));



입력된 JSON 값을 출력해 볼려면


$value = json_encode($value);

echo("JSON 데이터 : ".$value);





<?
session_start();
echo "세션 시작";
?>

위의 php 코드에서 아래와 같은 에러가 발생할 때

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at C:\APM_Setup\htdocs\kkk\vvv.php:1) in C:\APM_Setup\htdocs\kkk\vvv.php on line 3


원인은 session_start() 앞에 다른 명령어가 없어야 되는데 있을 때 발생한다.
그런데 위의 코드에서 다른 명령어가 없는데도 이런 에러 발생하는 경우가 있는데
그 이유는 이 파일을 저장할 때 utf-8로 저장을 하면 발생한다.
이유는 utf-8의 경우는 문서를 저장할 때 문서 맨 앞에 특정한 3byte를 집어 넣는다.
이유는 utf-8임을 구별하기 위해서 이다.

따라서 이 문제가 발생하지 않을려면 방법은 두 가지

① ANSI로 저장하면 된다. 그런데 이건 웹 브라우저를 셋팅할 때 euc-kr로 설정되어 있으면 문제가 없지만 utf-8로 설정되어 있으면 ANSI로 저장한 상태에서 한 글을 사용하면 웹브라우저에서 한글이 깨지는 문제가 발생한다. 왜냐하면 ANSI는 한글을 euc-kr 형태로 표현하기 때문이다.


② utf-8로 저장하되 BOM 없음으로 저장하면 된다.
utf-8을 BOM 없음으로 저장할려면 윈도우 메모장에서는 안된다. 
Notepad++ 과 같은 것으로는 가능하다.


그런데 또 문제는 utf-8 BOM 없음으로 저장하면 한글이 깨지는 경우가 발생한다.
이 문제를 해결할려면 다음 코드를 넣으면 된다. 니하하하~~~

header("Content-Type:text/html; charset=utf-8"); ==> 이 코드를 넣어 주면 한글 깨지는 문제를 해결 할 수 있다.
혹시 euc-kr일 경우는 utf-8 대신에 euc-kr을 넣어 주면 된다.
아래 샘플 코드이다.


<?php

session_start();

header("Content-Type:text/html; charset=utf-8");

echo ("세션이 시작되었습니다. UTF-8 BOM 없음 입니다.");

?>


+ Recent posts