Category Archives: PHP

PHP7 Uncaught Error: Class “ZipArchive” 오류시

Centos 6.x x86_64 기준

remi REPO 활성화 되어 있어야함.

remi REPO 추가
# rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

#yum install php70-php-pecl-zip

centos 6 PHP7 + MSSQL

YUM REPO 추가
1. epel
# rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

2. remi
# rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

기존 PHP 삭제
# yum remove php*

PHP 7 설치 (php 패키지는 개인의 용도에 맞게 설치)
# yum –enablerepo=remi install php70 php70-php php70-php-cli php70-php-common php70-php-gd php70-php-json php70-php-mbstring php70-php-mcrypt php70-php-mysqlnd php70-php-opcache php70-php-pear php70-php-xml php70-php-devel php70-php-imagick php-pdo

※ php.ini 파일은 /etc/opt/remi/php70/php.ini로 변경 됨

PHP 7에서 MSSQL로의 쿼리는 PDO를 통해 가능하며 접속 및 테스트 코드는 아래와 같음

”config.php”

<?
 // 반드시 DRIVER는 dblib로
 $_DB_INFO_MSSQL = array(
  "_DRIVER" => "dblib", 
  "_HOST" => "", 
  "_PORT" => "1433", 
  "_USER" => "", 
  "_PASS" => "", 
  "_DB" => ""
 );
?>

”MSSQL_SAMPLE.php”

<?
/*
* Project : MSSQL DBMS Class (PHP 7 PDO)
* Author : colorweb <enjoyteam@nate.com>
* Last : 2016-08-02
*/
class MSSQL extends PDO
{
    private $dns;
    private $engine; 
    private $host; 
    private $database; 
    private $user; 
    private $pass; 
    private $port; 
    private $_CONN; 
    private $_RESULT;
    
    public function __construct(){ 
        $this->engine = $GLOBALS["_DB_INFO_MSSQL"]["_DRIVER"]; 
        $this->host = $GLOBALS["_DB_INFO_MSSQL"]["_HOST"]; 
        $this->database = $GLOBALS["_DB_INFO_MSSQL"]["_DB"]; 
        $this->user = $GLOBALS["_DB_INFO_MSSQL"]["_USER"]; 
        $this->pass = $GLOBALS["_DB_INFO_MSSQL"]["_PASS"]; 
        $this->port = $GLOBALS["_DB_INFO_MSSQL"]["_PORT"]; 
        $this->dns = $this->engine.\':dbname=\'.$this->database.";host=".$this->host.":".$this->port; 
    } 

    function connect()
    {
        try {
            $this->_CONN = new PDO ($this->dns, $this->user, $this->pass);
        } catch (PDOException $e) {
            //$this->logsys .= "Failed to get DB handle: " . $e->getMessage() . "\\n";
            echo "Failed to get DB handle: " . $e->getMessage();
        }
    }

 function select($sql)
 {
  if(!$this->_CONN) { $this->connect(); }

  $_CONN = $this->_CONN;

  $this->_RESULT = $_CONN->query($sql);

  return $this->_RESULT;
 }

 function get_rows()
 {
  return $this->_RESULT->fetchAll();
 }

 function excute($sql)
 {
  if(!$this->_CONN) { $this->connect(); }

  $_CONN = $this->_CONN;

  $this->_RESULT = $_CONN->prepare($sql);
  $this->_RESULT->execute();

  return $this->_RESULT;
 }
}
?>

”MSSQL_TEST.php”

<?
include "config.php";
include "MSSQL_SAMPLE.php";

$_MSSQL = new MSSQL($_DEBUG);
$_MSSQL->connect();
$db_list = $_MSSQL->select("select * from [table_name]");
$db_data = $_MSSQL->get_rows();

// 전체 데이터를 가져와서 출력하는 예제 #1
for($i=0; $i<sizeof($db_data); $i++)
{
    echo $db_data[$i][FIELD_NAME];
}
?>

 

PHP Thumbnail Class

<?php
/**
 * 섬네일 생성 클래스
 * PHPSchool 괴부기님의 코드를 원본으로 상당부분 수정하였습니다.
 *
 * @class		Thumbnail
 * @author		괴부기, KAi
 * @version		0.2 (2011-06-21)
 * @see			http://phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=46878
 * @modified	KAi (2011-06-21)
 *
 *
 * - 주요기능
 *   - 섬네일 width, height 지정 가능 (둘 중 하나만 지정할 경우 해당 이미지 비율에 맞춰 섬네일 크기 설정)
 *   - 축소 방법 설정 (섬네일 안에 이미지 모두 보이게, 섬네일 크기에 꽉차게 설정 가능)
 *   - 출력 섬네일 파일형식 설정 가능 (GIF, JPG, PNG)
 *   - 섬네일 처리 전/후 콜백 함수 등록 가능 (콜백함수로 테두리 및 워터마크 등 사용자가 쉽게 추가 가능)
 *   - 섬네일 저장 경로를 쉽게 설정 가능 (키워드 사용으로 섬네일 경로에 이미지 크기나 경로를 쉽게 사용)
 *
 *
 * - examples
 *
 *  // 섬네일 크기를 폭만 80 픽셀로 설정하여, 폭을 기준으로 원본 이미지 비율에 맞게 섬네일 크기를 설정한다.
 *  // 섬네일 크기를 width, height 중 하나만 설정할 경우 scale 방식은 상관없이 SCALE_SHOW_ALL로 설정된다.
 *  // setOption() 함수로 기본적인 설정값을 변경할 수 있으며, create() 함수에서 옵션을 설정하지 않으면 기본적인
 *  // 설정값 대로 섬네일을 생성한다.
 *  Thumbnail::setOption('export', EXPORT_PNG);// 섬네일 출력을 PNG 로 변경 (옵션을 지정하지 않으면 jpg로 출력)
 *  Thumbnail::create('image.jpg',
 *					  80, null// 섬네일 width, height
 *					  );
 *
 *  // 섬네일 크기 80x80 픽셀로 이미지를 SCALE_SHOW_ALL 형식으로 축소한다.
 *  // 섬네일은 콜백함수를 등록하여 배경 및 테두리를 그리고, 저장 경로에 _thumb-widthxheight 문자열을
 *  // 추가한다.
 *  $watermark = new ThumbnailWatermark;
 *  Thumbnail::create('image.jpg',
 *					  80, 80,// 섬네일 width, height
 *					  SCALE_SHOW_ALL,// 섬네일 축소 형식
 *					  Array(
 *						  'export' => EXPORT_JPG,
 *						  'preprocess' => Array(&$watermark, 'preprocess'),
 *						  'postprocess' => Array(&$watermark, 'postprocess'),
 *						  'savepath' => '%PATH%%FILENAME%_thumb-%THUMB_WIDTH%x%THUMB_HEIGHT%.%EXT%'
 *					  ));
 */

define('SCALE_EXACT_FIT', 'exactfit');
define('SCALE_SHOW_ALL', 'showall');

define('EXPORT_JPG', 'jpg');
define('EXPORT_GIF', 'gif');
define('EXPORT_PNG', 'png');

class Thumbnail
{
	// {{{ Variables

	// 기본 옵션 정보
	private static $_TdefaultOptions = Array(
		'debug' => false,
		'export' => 'jpg',
		'preprocess' => null,
		'postprocess' => null,
		'savepath' => '%PATH%%FILENAME%_thumb.%EXT%'
	);

	// }}}
	// {{{ Functions

	/**
	 * 섬네일 이미지 생성
	 *
	 * @param	String	$filepath	원본 파일이 있는 경로를 지정한다.
	 * @param	Number	$width		(optional) 섬네일 넓이. width와 height 둘 중 하나는 반드시 지정되어야 하며,
	 *  하나가 null 인 경우 다른 값(width 또는 height)을 기준으로 이미지의 비율에 맞게 크기가 설정된다.
	 * @param	Number	$height		(optional) 섬네일 높이.
	 * @param	String	$scale		(optional) 축소 방식. 만약, width 또는 height 값 중 하나라도 지정이 안된경우
	 *  scale 은 자동적으로 SCALE_SHOW_ALL이 되며 이미지 전체가 표시 된다.
	 *  SCALE_EXACT_FIT, SCALE_SHOW_ALL 둘 중 하나를 지정가능 하고, width 및 height 값이 지정된 경우 해당 방식에
	 *  맞게 축소가 되는데, SCALE_EXACT_FIT 의 경우 지정된 섬네일 크기에 이미지가 꽉차게 축소된다.
	 *  SCALE_SHOW_ALL 의 경우 섬네일 크기 안에 원본 이미지가 모두 보이도록 축소된다. 이 경우 섬네일에 여백이
	 *  생길 수 있다. 기본적으로 여백의 색은 검은색이지만, preprocess 함수를 지정하여 다른색으로 변경 가능하다.
	 * @param	Array	$options	(optional) 기타 옵션. 기타 옵션에서는 출력될 섬네일 파일 형식과, 섬네일 전/후
	 *  처리 콜백 함수, 섬네일 저장 경로를 설정 가능하다.
	 *
	 *	- 옵션 항목
	 *		$options = Array(
	 *			'export' => 'jpg',
	 *			'preprocess' => Array(&$class, 'preprocess'),
	 *			'postprocess' => 'postprocess',
	 *			'savepath' => '%PATH%%FILENAME%_thumb.%EXT%'
	 *		);
	 *
	 *  export 에서는 gif, jpg, png 를 선택할 수 있다. (기본값은 jpg)
	 *  preprocess, postprocess 에서는 섬네일 생성시 이미지 축소 전/후에 콜백함수를 호출하여 배경 및 워터마크를
	 *  넣도록 할 수 있다. 설정방법은 여타 PHP 함수 호출과 마찬가지로, 클래스 메소드를 호출할 경우 preprocess
	 *  내용 처럼 배열로 클래스 객체와 메소드를 넘겨주면되고, 일반 함수를 호출할 경우 postprocess 처럼 함수명을
	 *  적으면 된다.
	 *  savepath 는 섬네일이 저장된 경로를 설정하는 것으로 미리 설정된 키워드를 통해 원본이미지 경로 정보를 이용
	 *  할 수 있다. 기본값은 원본이미지 경로 뒤에 _thumb 이 붙는것으로 원본이미지와 같은 폴더에 저장이 된다.
	 *  다른 폴더에 저장을 하려면 %PATH% 키워드 앞이나 뒤에 다른 경로를 적거나 %PATH% 대신 다른 경로를 적으면 되며
	 *  만약 해당 경로에 폴더가 없다면 자동으로 생성 된다.
	 *  ※ 중요: savepath 설정할때 %EXT% 와 같은 확장자가 빠지면 확장자 없이 이미지 경로가 생성되기 때문에 문제가
	 *           될 수 있습니다.
	 *
	 *	- 설정된 키워드
	 *		%PATH%			원본 이미지 경로
	 *		%FILENAME%		원본 이미지 파일명 (확장자 제외)
	 *		%EXT%			섬네일 출력 형식 확장자 (옵션에서 export 로 설정된 형식의 확장자 사용)
	 *		%THUMB_WIDTH	섬네일 넓이
	 *		%THUMB_HEIGHT	섬네일 높이
	 *		%IMAGE_WIDTH	원본 이미지 넓이
	 *		%IMAGE_HEIGHT	원본 이미지 높이
	 *
	 * @return	String				섬네일 경로
	 */
	public static function create($filepath, $width = null, $height = null, $scale = 'exactfit', $options = null)
	{
		// 원본 이미지가 없는 경우
		if ( ! file_exists($filepath))
			Thumbnail::raiseError('#Error: Thumbnail::create() : File not found or permission error.'.' at '. __LINE__);

		// 섬네일 크기가 잘못 지정된 경우
		if ($width <= 1 && $height <= 1)
			Thumbnail::raiseError('#Error: Thumbnail::create() : Invalid thumbnail size.'.' at '. __LINE__);

		// 스케일 지정이 안되어 있거나 틀릴 경우 기본 SCALE_SHOW_ALL 으로 지정
		if ( ! $scale || ($scale != SCALE_EXACT_FIT && $scale != SCALE_SHOW_ALL))
			$scale = SCALE_SHOW_ALL;

		// 기타 옵션
		if ($options)
			$options = array_merge(Thumbnail::$_TdefaultOptions, $options);

		// 옵션 중 출력 이미지 형식이 잘못 지정된 경우
		if ( ! in_array($options['export'], Array('jpg', 'gif', 'png')))
			Thumbnail::raiseError('#Error: Thumbnail::create() : Invalid export format.'.' at '. __LINE__);

		// 이미지 타입이 지원되지 않는 경우
		// 1 = GIF, 2 = JPEG, 3 = PNG
		$type = getimagesize($filepath);
		if (($type[2] < 1 || $type[2] > 3) ||
			($type[2] == 1 && ! function_exists('imagegif')) ||
			($type[2] == 2 && ! function_exists('imagejpeg')) ||
      ($type[2] == 3 && ! function_exists('imagepng'))
      )
		{
			Thumbnail::raiseError('#Error: Thumbnail::create() : Filetype not supported. Thumbnail not created.'.' at '. __LINE__);
		}

		// 원본 이미지로부터 Image 객체 생성
		switch ($type[2])
		{
			case 1: $image = imagecreatefromgif($filepath); break;
			case 2: $image = imagecreatefromjpeg($filepath); break;
			case 3: $image = imagecreatefrompng($filepath); break;
		}

		// AntiAlias
		if (function_exists('imageantialias'))
			imageantialias($image, TRUE);

		// 이미지 크기 설정
		$image_attr = getimagesize($filepath);
		$image_width = $image_attr[0];
		$image_height = $image_attr[1];

		if ($width > 0 && $height > 0)
		{
			// 섬네일 크기 안에 모두 표시
			// 이미지의 가장 큰 면을 기준으로 지정
			switch ($scale)
			{
				case SCALE_SHOW_ALL: $side = ($image_width >= $image_height) ? 'width' : 'height'; break;
				case SCALE_EXACT_FIT:
				default: $side = ($image_width / $width <= $image_height / $height) ? 'width' : 'height'; break;
			}

			$thumb_x = $thumb_y = 0;
			if ($side == 'width')
			{
				$ratio = $image_width / $width;
				$thumb_width = $width;
				$thumb_height = floor($image_height / $ratio);
				$thumb_y = round(($height - $thumb_height) / 2);
			}
			else
			{
				$ratio = $image_height / $height;
				$thumb_width = floor($image_width / $ratio);
				$thumb_height = $height;
				$thumb_x = round(($width - $thumb_width) / 2);
			}
		}
		else
		{
			// width 또는 height 크기가 지정되지 않았을 경우,
			// 지정된 섬네일 크기 비율에 맞게 다른 면의 크기를 맞춤
			$thumb_x = $thumb_y = 0;
			if ( ! $width)
			{
				$thumb_width = $width = intval($image_width / ($image_height / $height));
				$thumb_height = $height;
			}
			elseif ( ! $height)
			{
				$thumb_width = $width;
				$thumb_height = $height = intval($image_height / ($image_width / $width));
			}
		}

		// 섬네일 객체 생성
		$thumbnail = imagecreatetruecolor($width, $height);

		if ($options['preprocess'])
			@call_user_func($options['preprocess'], $thumbnail, $width, $height, $thumb_width, $thumb_height);
                        // php5 사용간 warning 출력 제거를 위해 &$thumbnail -> $thumbnail 로 변경

		@imagecopyresampled($thumbnail, $image, $thumb_x, $thumb_y, 0, 0, $thumb_width, $thumb_height, $image_width, $image_height);

		if ($options['postprocess'])
			@call_user_func($options['postprocess'], $thumbnail, $width, $height, $thumb_width, $thumb_height);
                        // php5 사용간 warning 출력 제거를 위해 &$thumbnail -> $thumbnail 로 변경

		// 저장할 경로 생성 및 디렉토리 검사
		preg_match('@^(.+/)?([^/]+).([^.]+)?$@', $filepath, $m);
		$savepath = str_replace(Array('%PATH%', '%FILENAME%', '%EXT%', '%THUMB_WIDTH%', '%THUMB_HEIGHT%', '%IMAGE_WIDTH%', '%IMAGE_HEIGHT%'), Array($m[1], $m[2], $options['export'], $width, $height, $image_width, $image_height), $options['savepath']);
		Thumbnail::validatePath($savepath);

		// 지정된 포멧으로 섬네일이미지 저장
		$iserror = false;
		switch ($options['export'])
		{
			case EXPORT_GIF: if ( ! imagegif($thumbnail, $savepath)) $iserror = true; break;
			case EXPORT_PNG: if ( ! imagepng($thumbnail, $savepath)) $iserror = true; break;
			case EXPORT_JPG:
			default: if ( ! imagejpeg($thumbnail, $savepath)) $iserror = true; break;
		}

		if ($iserror)
			Thumbnail::raiseError('#Error: Thumbnail::create() : invalid path or permission error.'.' at '. __LINE__);
		elseif (Thumbnail::getOption('debug'))
		{
			echo '@Debug: Thumbnail::create() - source='. $filepath .', image[width='. $image_width .',height='. $image_height .'], '
				.'thumb[width='. $width .',height='. $height .'], scale='. $scale .', scaled[x='. $thumb_x .',y='. $thumb_y
				.',width='. $thumb_width .',height='. $thumb_height .']<br />'."n";
		}

		return $savepath;
	}// END: function create();

	/**
	 * 기본 옵션 항목을 변경한다.
	 *
	 * @param	String	$name	옵션명
	 * @param	mixed	$value	값
	 * @return	void
	 */
	public static function setOption($name, $value)
	{
		Thumbnail::$_TdefaultOptions[ $name ] = $value;
	}

	/**
	 * 기본 옵션 항목의 값을 반환한다.
	 *
	 * @param	String	$name	옵션명
	 * @return	mixed			값
	 */
	public static function getOption($name)
	{
		return Thumbnail::$_TdefaultOptions[ $name ];
	}

	/**
	 * 경로가 존재하는지 체크하고 없다면 폴더를 생성
	 * @param	String	$path					체크할 경로
	 * @return	Boolean							true
	 */
	public static function validatePath($path)
	{
		$a = explode('/', dirname($path));
		$p = '';
		foreach ($a as $v)
		{
			$p.= $v .'/';
			if ( ! is_dir($p))
				mkdir($p, 0757);
		}

		return true;
	}// END: function validatePath();

	/**
	 * 오류 처리 핸들러
	 * @param	String	$msg	메시지
	 * @param	int		$code	오류 코드
	 * @param	int		$type	오류 형식
	 */
	public static function raiseError($msg, $code = 0, $type = 0)
	{
		die($msg);
	}// END: function raiseError();

	// }}}
}// END: class Thumbnail

/**
 * 샘플 워터마크 클래스
 * 이 클래스에서는 이미지 배경색과 테두리 선을 추가하는 예를 보여줍니다.
 * preprocess 및 postprocess 함수에서는 Thumbnail 클래스에서 지정한 파라메터를 넘겨 받습니다.
 */
class ThumbnailWatermark
{
	/**
	 * Thumbnail 클래스에서 preprocess 및 postprocess 함수 호출시 넘겨주는 파라메터들
	 *
	 * @param	Resource	$resource		GD Image 함수용 섬네일 리소스
	 * @param	Number		$thumb_width	섬네일 넓이
	 * @param	Number		$thumb_height	섬네일 높이
	 * @param	Number		$image_width	섬네일 안에서 축소된 이미지의 넓이
	 * @param	Number		$image_height	섬네일 안에서 축소된 이미지의 높이
	 * ※만약, 섬네일 scale 이 SCALE_SHOW_ALL 일 경우, 섬네일 크기보다 이미지가 작아질 수 있습니다.
	 * @return	void
	 */
	public function preprocess($resource, $thumb_width, $thumb_height, $image_width, $image_height)
	{
		// 입력한 색상으로 전체 이미지를 칠한다.
		$color = ImageColorAllocate($resource, 240, 240, 240);
		ImageFilledRectangle($resource, 0, 0, $thumb_width, $thumb_height, $color);
	}

	public function postprocess($resource, $thumb_width, $thumb_height, $image_width, $image_height)
	{
		$color = ImageColorAllocate($resource, 0, 0, 0);
		ImageLine($resource, 0, 0, $thumb_width - 1, 0, $color);
		ImageLine($resource, $thumb_width - 1, 0, $thumb_width - 1, $thumb_height - 1, $color);
		ImageLine($resource, $thumb_width - 1, $thumb_height - 1, 0, $thumb_height - 1, $color);
		ImageLine($resource, 0, $thumb_height - 1, 0, 0, $color);
	}
}// END: class ThumbnailWatermark
?>

사용 예

<?
// source file $src
// destination file $dst
$watermark = new ThumbnailWatermark;
Thumbnail::setOption('debug', false);
Thumbnail::create($src,
  90, 90,
  SCALE_EXACT_FIT,
  Array(
    'savepath' => $dst
  ));
?>

 

nicEdit Internet Explorer Upload

nicEdit 확인간 Internet Explorer 10이하에서 HTML5가 제대로 지원되지 않아
이미지가 업로드 되지 않는 현상을 해결하기 위해 작업 한 결과를 업데이트 해봅니다.

FCK와 같은 다른 WYSIWYG Editor와 달리 아주 가벼운 에디터라 이번에 작업 한번 해봤습니다..

// Edit By Colorweb : 2012-11-01 부분을 참조하면 됩니다.

우선 업로드 파일을 처리하는 nicUpload.php

[crayon lang=”php” toolbar=”false”]
/* NicEdit – Micro Inline WYSIWYG

* Copyright 2007-2009 Brian Kirchoff
*
* NicEdit is distributed under the terms of the MIT license
* For more information visit http://nicedit.com/
* Do not remove this copyright message
*
* nicUpload Reciever Script PHP Edition
* @description: Save images uploaded for a users computer to a directory, and
* return the URL of the image to the client for use in nicEdit
* @author: Brian Kirchoff <briankircho@gmail.com>* @sponsored by: DotConcepts (http://www.dotconcepts.net)
* @version: 0.9.0
*/

// Set the path (relative or absolute) to the directory to save image files
define(’NICUPLOAD_PATH’, ’’);

// Set the URL (relative or absolute) to the directory defined above
define(’NICUPLOAD_URI’, ’’);

$nicupload_allowed_extensions = array(’jpg’,’jpeg’,’png’,’gif’,’bmp’);

// You should not need to modify below this line
$rfc1867 = function_exists(’apc_fetch’) && ini_get(’apc.rfc1867’);

if(!function_exists(’json_encode’)) {
die(‘{”error” : ”Image upload host does not have the required dependicies (json_encode/decode)”}’);
}

$id = $_POST[’APC_UPLOAD_PROGRESS’];

// Edit By Colorweb : 2012-11-01
if(empty($id)) {
$d = $_GET[’d’];
}
// Edit By Colorweb : 2012-11-01

if($_SERVER[’REQUEST_METHOD’]==’POST’) { // Upload is complete
if(!is_dir(NICUPLOAD_PATH) || !is_writable(NICUPLOAD_PATH)) {
nicupload_error(’Upload directory ’.NICUPLOAD_PATH.’ must exist and have write permissions on the server’);
}

$file = $_FILES[’image’];
$image = $file[’tmp_name’];

$max_upload_size = ini_max_upload_size();
if(!$file) {
nicupload_error(’Must be less than ’.bytes_to_readable($max_upload_size));
}

$ext = strtolower(substr(strrchr($file[’name’], ’.’), 1));
@$size = getimagesize($image);
if(!$size || !in_array($ext, $nicupload_allowed_extensions)) {
nicupload_error(’Invalid image file, must be a valid image less than ’.bytes_to_readable($max_upload_size));
}

$id = md5_file($image);
$filename = $id.”.”.$ext;

// Edit By Colorweb : 2012-11-01
$_UPLOAD_DIR = $d.’/tmp’;
$path = NICUPLOAD_PATH.’/’.$_UPLOAD_DIR.’/’.$filename;

$_CUT_UPLOAD_DIR = explode(”/”, $_UPLOAD_DIR);

for($i=0; $i<sizeof($_CUT_UPLOAD_DIR); $i++) { $_SET_DIR .= $_CUT_UPLOAD_DIR[$i].”/”; if(!is_dir(NICUPLOAD_PATH.’/’.$_SET_DIR)) { @mkdir(NICUPLOAD_PATH.’/’.$_SET_DIR, 0777); @chmod(NICUPLOAD_PATH.’/’.$_SET_DIR, 0777); } } // Edit By Colorweb : 2012-11-01 if(!move_uploaded_file($image, $path)) { nicupload_error(’Server error, failed to move file’); } if($rfc1867) { $status = apc_fetch(’upload_’.$id); } if(!$status) { $status = array(); } // $status[’done’] = 1; // $status[’width’] = $size[0]; // $status[’url’] = nicupload_file_uri($filename); if($rfc1867) { apc_store(’upload_’.$id, $status); } $status[”upload”][”image”][”name”] = $filename; $status[”upload”][”image”][”title”] = null; $status[”upload”][”image”][”caption”] = null; $status[”upload”][”image”][”hash”] = $id; $status[”upload”][”image”][”deletehash”] = ””; $status[”upload”][”image”][”datetime”] = date(’Y-m-d H:i:s’); $status[”upload”][”image”][”type”] = $size[”mime”]; $status[”upload”][”image”][”animated”] = ”false”; $status[”upload”][”image”][”width”] = $size[0]; $status[”upload”][”image”][”height”] = $size[1]; $status[”upload”][”image”][”size”] = filesize($image); $status[”upload”][”image”][”views”] = 0; $status[”upload”][”image”][”bandwidth”] = 0; $status[”upload”][”links”][”original”] = ”http://”.$_SERVER[”HTTP_HOST”].nicupload_file_uri($filename, $_UPLOAD_DIR); $status[”upload”][”links”][”imgur_page”] = ”http://”.$_SERVER[”HTTP_HOST”].nicupload_file_uri($filename, $_UPLOAD_DIR); $status[”upload”][”links”][”delete_page”] = null; $status[”upload”][”links”][”small_square”] = ”http://”.$_SERVER[”HTTP_HOST”].nicupload_file_uri($filename, $_UPLOAD_DIR); $status[”upload”][”links”][”large_thumbnail”] = ”http://”.$_SERVER[”HTTP_HOST”].nicupload_file_uri($filename, $_UPLOAD_DIR); nicupload_output($status, $rfc1867); exit; } else if(isset($_GET[’check’])) { // Upload progress check $check = $_GET[’check’]; if(!is_numeric($check)) { nicupload_error(’Invalid upload progress id’); } if($rfc1867) { $status = apc_fetch(’upload_’.$check); if($status[’total’] > 500000 && $status[’current’]/$status[’total’] < 0.9 ) { // Large file and we are < 90% complete $status[’interval’] = 3000; } else if($status[’total’] > 200000 && $status[’current’]/$status[’total’] < 0.8 ) { // Is this a largeish file and we are < 80% complete $status[’interval’] = 2000; } else { $status[’interval’] = 1000; } nicupload_output($status); } else { $status = array(); // $status[’noprogress’] = true; foreach($nicupload_allowed_extensions as $e) { if(file_exists(NICUPLOAD_PATH.’/’.$check.’.’.$e)) { $ext = $e; break; } } if($ext) { // $status[’url’] = nicupload_file_uri($check.’.’.$ext); } nicupload_output($status); } } // UTILITY FUNCTIONS function nicupload_error($msg) { echo nicupload_output(array(’error’ => $msg));
}

function nicupload_output($status, $showLoadingMsg = false) {
$script = ’
try {
’.(($_SERVER[’REQUEST_METHOD’]==’POST’) ? ’top.’ : ’’).’nicUploadButton.statusCb(’.json_encode($status).’);
} catch(e) { alert(e.message); }
’;

if($_SERVER[’REQUEST_METHOD’]==’POST’) {
// echo ’’;
echo json_encode($status);
// Edit By Colorweb : 2012-11-01
if($_POST[”ie_type”] == ”Y”) {
echo ””;
}
// Edit By Colorweb : 2012-11-01
} else {
echo $script;
}

if($_SERVER[’REQUEST_METHOD’]==’POST’ && $showLoadingMsg) {

echo <<<END


Uploading…
Please wait

END;

}

exit;
}

function nicupload_file_uri($filename, $_UPLOAD_DIR) {
return NICUPLOAD_URI.’/’.$_UPLOAD_DIR.’/’.$filename;
}

function ini_max_upload_size() {
$post_size = ini_get(’post_max_size’);
$upload_size = ini_get(’upload_max_filesize’);
if(!$post_size) $post_size = ’8M’;
if(!$upload_size) $upload_size = ’2M’;

return min( ini_bytes_from_string($post_size), ini_bytes_from_string($upload_size) );
}

function ini_bytes_from_string($val) {
$val = trim($val);
$last = strtolower($val[strlen($val)-1]);
switch($last) {
// The ’G’ modifier is available since PHP 5.1.0
case ’g’:
$val *= 1024;
case ’m’:
$val *= 1024;
case ’k’:
$val *= 1024;
}
return $val;
}

function bytes_to_readable( $bytes ) {
if ($bytes<=0) return ’0 Byte’; $convention=1000; //[1000->10^x|1024->2^x]
$s=array(’B’, ’kB’, ’MB’, ’GB’, ’TB’, ’PB’, ’EB’, ’ZB’);
$e=floor(log($bytes,$convention));
return round($bytes/pow($convention,$e),2).’ ’.$s[$e];
}
[/crayon]

nicEditor 의 js파일의 일부 입니다.
[crayon lang=”javascript” toolbar=”false”]
// Edit By Colorweb : 2012-11-01
var iframe_element = ””;
var old_action = ””;
var iframe_callback = function()

{
iframe_element.removePane();
try {
var res = JSON.parse(document.frames[’fileUpload_ie_frame’].document.body.innerText.replace(”parent.iframe_callback()”, ””));
} catch(e) {
return iframe_element.onError();
}
var el = document.getElementById(’fileUpload_ie_frame’);
var remElement = (el.parentNode).removeChild(el);
var el = document.getElementById(’image’);
var remElement = (el.parentNode).removeChild(el);
var el = document.getElementById(’ie_type’);
var remElement = (el.parentNode).removeChild(el);
iframe_element.onUploaded(res.upload);
}
// Edit By Colorweb : 2012-11-01
var nicUploadButton = nicEditorAdvancedButton.extend({

…. 중략 ….

uploadFile : function() {
// Edit By Colorweb : 2012-11-01
if(typeof window.FormData === ”undefined”) {

var ie_frame = new bkElement(’iframe’)
.setAttributes({ ’name’ : ’fileUpload_ie_frame’ })
.setAttributes({ ’id’ : ’fileUpload_ie_frame’ })
.appendTo(document.getElementById(this.ne.options.dataForm));

var input_type = new bkElement(’input’)
.setAttributes({ ’name’ : ’ie_type’ })
.setAttributes({ ’id’ : ’ie_type’ })
.setAttributes({ ’value’ : ’Y’ })
.appendTo(document.getElementById(this.ne.options.dataForm));

this.fileInput.appendTo(document.getElementById(this.ne.options.dataForm));

document.getElementById(’image’).style.display = ”none”;
document.getElementById(’fileUpload_ie_frame’).style.display = ”none”;
iframe_element = this;
old_action = document.getElementById(this.ne.options.dataForm).action;
document.getElementById(this.ne.options.dataForm).target = ”fileUpload_ie_frame”;

document.getElementById(this.ne.options.dataForm).action = this.ne.options.uploadURI;
document.getElementById(this.ne.options.dataForm).submit();

document.getElementById(this.ne.options.dataForm).target = ””;
document.getElementById(this.ne.options.dataForm).action = old_action;

} else {
var file = this.fileInput.files[0];
if (!file || !file.type.match(/image.*/)) {
this.onError(”Only image files can be uploaded”);
return;
}
this.fileInput.setStyle({ display: ’none’ });
this.setProgress(0);

var fd = new FormData(); // https://hacks.mozilla.org/2011/01/how-to-develop-a-html5-image-uploader/
fd.append(”image”, file);
fd.append(”key”, ”b7ea18a4ecbda8e92203fa4968d10660”);
var xhr = new XMLHttpRequest();
xhr.open(”POST”, this.ne.options.uploadURI || this.nicURI);

xhr.onload = function() {
try {
var res = JSON.parse(xhr.responseText);
} catch(e) {
return this.onError();
}
this.onUploaded(res.upload);
}.closure(this);
xhr.onerror = this.onError.closure(this);
xhr.upload.onprogress = function(e) {
this.setProgress(e.loaded / e.total);
}.closure(this);
xhr.send(fd);
}
// Edit By Colorweb : 2012-11-01
},
[/crayon]

호출시 샘플 입니다.
[crayon lang=”javascript” toolbar=”false”]

bkLib.onDomLoaded(function() {
new nicEditors.allTextAreas({
iconsPath : ’/Editor/nicEditorIcons.gif’,
uploadURI : ’/Editor/nicUpload.php?d= // Editor가 있는 form의 이름 입니다.
// 반드시 dataFrom을 입력해야 IE에서 작동 합니다.
dataForm : ’input_form’

});
});

[/crayon]

 

php 컴파일시 gptr Error

ext/mysqli/mysqli_api.c: In function ’zif_mysqli_stmt_bind_param’:
ext/mysqli/mysqli_api.c:144: error: ’gptr’ undeclared (first use in this function)
ext/mysqli/mysqli_api.c:144: error: (Each undeclared identifier is reported only once
ext/mysqli/mysqli_api.c:144: error: for each function it appears in.)
ext/mysqli/mysqli_api.c: In function ’zif_mysqli_stmt_execute’:
ext/mysqli/mysqli_api.c:603: error: ’gptr’ undeclared (first use in this function)

위와 같은 오류 출력시

ext/mysqli/mysqli_api.c 파일의 gptr을 char* 모두 변경 후 컴파일~

Shell PHP 작성시 Zend Error 관련

Failed loading /usr/local/Zend/lib/Optimizer_TS-3.3.0/php-5.2.x/ZendOptimizer.so: /usr/local/Zend/lib/Optimizer_TS-3.3.0/php-5.2.x/ZendOptimizer.so: cannot restore segment prot after reloc: Permission denied

요런 에러가 뜨면~

# chcon -t texrel_shlib_t /usr/local/Zend/lib/Optimizer_TS-3.3.0/php-5.2.x/ZendOptimizer.so

요걸 쓰면 된답니다~

DB 백업

[crayon lang=”php” toolbar=”false”]
<?
# 디비 정보 입력
$_HOSTNAME=”localhost”;
$_USERNAME=””;
$_PASSWORD=””;
$_DATABASE=””;

$filename = $_DATABASE.”_”.date(’Ymd’).”.sql”;
set_time_limit(0);

if(eregi(”msie”,$HTTP_USER_AGENT)) $browser=”1”; else $browser=”0”;
header(”Content-Type: application/octet-stream”);
if ($browser) {
header(”Content-Disposition: attachment; filename=”$filename””);
header(”Expires: 0”);
header(’Cache-Control: must-revalidate, post-check=0, pre-check=0’);
header(’Pragma: public’);
} else {
header(”Content-Disposition: attachment; filename=”$filename””);
header(”Expires: 0”);
header(”Pragma: public”);
}
flush();

echo ”# enjoyteam Board MySQL Dumpnr”;
echo ”#nr”;
echo ”# Database: $_DATABASEnr”;
echo ”# ——————————————————–nr”;
echo ”#nr”;
echo ”nr”;
flush();

$db_connection = mysql_connect($_HOSTNAME, $_USERNAME, $_PASSWORD) or die(error(’MySQL Server에 접속할수 없습니다.’));
mysql_select_db($_DATABASE, $db_connection) or die(error(’MySQL Server에 접속할수 없습니다’));

function get_fileds($table_name)
{
$db_list = mysql_query(”show fields from $table_name”);
$db_cnt = mysql_affected_rows();

for($i=0; $i<$db_cnt; $i++)
{
$db_data = mysql_fetch_assoc($db_list);
$fields[$i] = $db_data[Field];
flush();
}
return $fields;
}

function make_field_data($table_name, $fields)
{
$db_list = mysql_query(”select * from $table_name”);
$db_cnt = mysql_affected_rows();

for($i=0; $i<$db_cnt; $i++)
{
$db_data = mysql_fetch_assoc($db_list);
echo ”INSERT INTO $table_name VALUES(”;
for($l=0; $l<sizeof($fields); $l++)
{
echo ”””.$db_data[$fields[$l]].”””;
if($l<sizeof($fields)-1) { echo ”, ”; }
flush();
}
echo ”);nr”;
flush();
}
echo ”nr”;
}

$db_list = mysql_query(”show tables”);
$db_cnt = mysql_affected_rows();

for($i=0; $i<$db_cnt; $i++) { $db_data = mysql_fetch_assoc($db_list); $set_fields = get_fileds($db_data[$list_field]); $list_field = ”Tables_in_”.$_DATABASE; $set_create_query = @mysql_result(mysql_query(”show create table $db_data[$list_field]”),0,1); echo ”#nr”; echo ”# Table structure for table ’$db_data[$list_field]’nr”; echo ”#nr”; echo ”nr”; echo ”$set_create_querynr”; echo ”nr”; flush(); make_field_data($db_data[$list_field], $set_fields); } ?>
[/crayon]

enjoyteam 게시판 만들때 사용한 것들~

실행시 DATABASE명_오늘날짜(20070116).sql로 저장~