Just in Chronicles

Life as a Voyage

Archive for the ‘For PHP’ Category

State Fields Explicitly to Avoid Fetch Error in PHP

Reference: String returned to Output Parameter from Stored Procedure is truncated

In PHP scripts, calling stored procedures from MS-SQL is necessary depending on a web application. In this case, if you are using MSSQL driver for PHP instead of the MSSQL module provided as a default driver, the following error message is sometimes seen.

01004 – [Microsoft][SQL Native Client]String data, right truncation

This is caused because the SELECT query does not specify fields explicitly like:

SELECT * FROM dbo.TableName

In order to avoid this error, just state field name explicitly like:

SELECT Field1, Field2 FROM dbo.TableName

Then, the error message above will no longer come out.

Advertisements

Written by Justin Yoo

08/02/2010 at 23:46

Installing cURL Module for PHP on IIS

Reference: cURL Installation

When developers install PHP module onto IIS, cURL isn’t installed automatically, even though it is in the package.

There are two key files to use cURL.

  • ssleay32.dll
  • libeay32.dll

Installing cURL onto my IIS is:

  1. Copy both files stated above from C:\PHP5 and paste them to C:\Windows\System32.
  2. Uncomment extension=php_curl.dll in php.ini.
  3. Restart IIS.

That’s it! Enjoy your cURL life~


cURL 모듈이 PHP 패키지에 들어있음에도 불구하고 자동으로 IIS에 올라가지는 않는다. IIS에 올리려면 위와 같은 순서를 따라 하면 됨.

Written by Justin Yoo

14/07/2009 at 01:46

Posted in For PHP, For Windows

Tagged with , ,

Bug on __get() Method Occurs in PHP 5.x

Reference: Overloaded properties (__get)

One of improvements since PHP 5.x was introduced is that developers use the concept of object-oriented programming (OOP). However, PHP was not born for OOP, so still hundreds of OO related issues arise and developers complain them. One of complaints is the very __get($name) function called a "magic method".

In OO world, accessor (getter) and mutator (setter) are generally used to access property values of a class. For example in C# and VB:

   1: For C#:

   2: public class MyClass

   3: {

   4:     private string text = null;

   5:     public string MyText

   6:     {

   7:         get { return this.text; }

   8:         set { this.text = value; }

   9:     }

  10: }

   1: For VB:

   2: Public Class MyClass

   3:     Private text As String = Nothing

   4:     Public Property MyText() As String

   5:         Get

   6:             Return Me.text

   7:         End Get

   8:         Set(ByVal value As String)

   9:             Me.text = value

  10:         End Set

  11:     End Property

  12: End Class

In PHP 5.x, two magic methods, __get($name) and __set($name, $value) are used to imitate both accessor and mutator, respectively. The sample code is:

   1: <?php

   2: class Sample

   3: {

   4:     private $properties = array("ID" => null, "CssClass" => null);

   5:     private function __get($name) { return $this->properties[$name]; }

   6:     private function __set($name, $value) { $this->properties[$name] = $value; }

   7: }

   8:  

   9: $sample = new Sample();

  10: $sample->ID = "sampleID";

  11: $sample->CssClass = "sampleClass";

  12: ?>

  13:  

  14: <div id="<?php echo $sample->ID; ?>" class="<?php echo $sample->CssClass; ?>">

  15: This is the sample div area

  16: </div>

The post linked above argues that __get($name) function has a bug when property values of a class are accessed. Even though the class has no error, sometimes the bug happens and the error message is like:

Notice: Indirect modification of overloaded property sample::$ID has no effect in ../sample.php on line 14

This is because of the bug stated above. In order to wipe out this error, additional code lines should be set before accessing property values like:

   1: <?php

   2: class Sample

   3: {

   4:     private $properties = array("ID" => null, "CssClass" => null);

   5:     private function __get($name) { return $this->properties[$name]; }

   6:     private function __set($name, $value) { $this->properties[$name] = $value; }

   7: }

   8:  

   9: $sample = new Sample();

  10: $sample->ID = "sampleID";

  11: $sample->CssClass = "sampleClass";

  12: ?>

  13:  

  14: <?php

  15: $id = $sample->ID;

  16: $cssClass = $sample->CssClass;

  17: ?>

  18:  

  19: <div id="<?php echo ($id); ?>" class="<?php echo ($cssClass); ?>">

  20: This is the sample div area

  21: </div>

Like the line 15 and 16, before echoing the property values, it should be better to declare another variables to get the property. Then, it will not show the error message.


PHP 5.x 버전으로 넘어오면서 향상된 기능중 하나가 객체지향프로그램이 좀 더 원활하게 가능해졌다는 점이다. 여전히 PHP는 객체지향을 위한 언어로서는 부족한 점이 많지만 말이다. 그런데, 여전히 문제점들을 가지고 있다. PHP 사이트에서는 버그가 고쳐졌다고 하지만, 여전히 불평하는 개발자들이 넘쳐나고 있다. 그중 한가지가 바로 magic method들 중 하나인 __get($name) 함수이다.

일반적으로 클라스의 속성값에 액세스할 때 get{}, set{} 접근자를 사용한다. 이와 비슷한 흉내를 내도록 만든 것이 바로 이 __get($name), __set($name, $value) 함수들인데, 함수를 가지고 접근자 흉내를 내려니 여러모로 애로사항이 꽃피고 있다. 위의 링크에 걸린 내용은 바로 이 __get($name) 함수를 통해 클라스 속성값을 가져올때 생기는 버그에 대한 것이다. 분명히 소스코드 상에서 아무런 오류가 없을지라도 종종 위와 같은 에러메시지를 나타낸다. 이것은 바로 __get($name) 함수의 버그 때문에 생기는 것으로, 이 메시지를 없애려면 조금 번거롭지만 추가적인 작업을 해줘야 한다.

만약 위 코드의 echo 부분에서 에러가 생긴다면, 저렇게 직접 데이타를 클라스 오브젝트 안에서 가져오기 보다 $id = $sample->ID; 형태로 일단 받아놓고 $idecho로 내보내면 에러메시지가 생기지 않는다.

이게 뭔 뻘짓이여… PHP는 아무리 봐도 정이 잘 안가!!

Written by Justin Yoo

26/05/2009 at 05:44

VS.PHP for Visual Studio, the IDE for both .NET and PHP

References:

닷넷과 PHP를 함께 사용하는 웹 어플리케이션을 개발하다보면 종종 느끼곤 하는 것이 PHP의 객체지향 (Object-oriented, OO) 개념에 대한 것이다. 물론, 5.xx 버전으로 올라서면서 PHP 역시도 OO 개념을 많이 도입하여 꽤 괜찮아졌다고는 하지만, 아직까지는 자바나 닷넷의 그것과는 비교하기가 곤란할 정도의 수준이라고 할 수 있다. 논란의 여지가 있으므로 이부분은 여기서 그만~ ㅋ

근데, 다 좋다 이거야. PHP를 지원하는 IDE는 왜 없는 거냐규!! 자바는 이클립스라는 거대한 오픈소스 IDE가 있고, 닷넷은 비주얼스튜디오라는 걸출한 IDE가 있다. 근데, PHP는 번번한 IDE 하나 없어서 이클립스에 올라탄 PDT가 있어서 통합 개발환경을 원하는 개발자들에게 간신히 목마름을 해결해 줬을 뿐이다. 최근에 PhpEd라는 걸출한 IDE가 나와있기는 하다만, 닷넷을 개발하다가 또다른 IDE를 열어서 PHP를 개발하기에는 번거로운 면이 없지 않아 있다. 물론, 여전히 에디트플러스나 메모장, 아크로에디트, 울트라에디트, NotePad++와 같은 툴을 쓰는 개발자들도 많고, 그 툴들이 나쁘다는 것도 아니지만, OO 환경에서 수많은 객체들을 참조하고 디버그하고 등등 하는데 있어서 이런 툴들은 모자란점이 한참 많은 것은 사실이다.

그래서, 찾은 것이 바로 VS.PHP이다. 비주얼스튜디오의 기능들을 십분 활용하여 PHP와 닷넷을 동시에 개발할 수 있으며, 디버깅 및 단위테스트 등등 닷넷을 개발하면서 이용했던 모든 기능들을 그대로 이용할 수 있는 재미있는 툴이라고 할 수 있다. 이 VS.PHP는 VS2005, VS2008에 통합시켜 쓸 수도 있지만, 단독으로도 VS2005의 인터페이스를 흉내내어 사용이 가능하다.

이를 설치한 다음에 PHP의 디버깅을 위해서는 XDebug 또는 DBG라는 모듈을 설치해야 한다. 위의 XDebug 웹사이트, DBG 웹사이트를 방문하여 다운로드 받아 쓸 수 있다. 물론, VS.PHP에는 자체적으로 해당 디버깅 모듈이 들어있어서 걱정없이 디버깅을 할 수 있다. 내부적으로 아파치 모듈과 디버깅 모듈을 이용하여 디버깅을 하니 그또한 좋은 일이 아닐 수 없지만, 로컬작업이 아닌 원격 디버깅을 위해서는 반드시 XDebug 또는 DBG 모듈을 설치해야 한다. 설치 및 사용방법은 저 위의 링크에 있으니 참고하면 되겠다.

이걸로 닷넷 페이지도 열었다가 PHP 페이지도 열었다가 하면서 막 프로그램을 짜니까 편하긴 하구만. ㅋ 뽀스한테 얘기해서 정품 하나 사달라 해야겠당. 아직은 시험판 사용중이니깐… 흠흠…

Written by Justin Yoo

23/05/2009 at 09:16