데이터베이스를 사용하는 방법 중 하나만 맞다면 데이터베이스 설계, 데이터베이스 액세스 및 데이터베이스 기반 PHP 비즈니스 로직 코드를 생성할 수 있는 방법은 여러 가지가 있습니다. 그러나 그것은 대개 잘못된 것으로 끝난다. 이 문서에서는 데이터베이스 설계 및 데이터베이스에 액세스하는 PHP 코드에서 발생하는 다섯 가지 일반적인 문제와 이러한 문제가 발생할 때 이를 해결하는 방법에 대해 설명합니다.
문제 1: MySQL을 직접 사용
일반적인 문제는 이전 PHP 코드가 mysql_ 함수를 직접 사용하여 데이터베이스에 액세스한다는 것입니다. 목록 1은 데이터베이스에 직접 액세스하는 방법을 보여줍니다.
목록 1. Access/get.php
<ol class="dp-c"><li class="alt"><span><span><?php </span></span></li><li><span class="keyword">function</span><span> get_user_id( </span><span class="vars">$name</span><span> ) </span></li><li class="alt"><span>{ </span></li><li><span> </span><span class="vars">$db</span><span> = mysql_connect( </span><span class="string">'localhost'</span><span>, </span><span class="string">'root'</span><span>, </span><span class="string">'password'</span><span> ); </span></li><li class="alt"><span> mysql_select_db( </span><span class="string">'users'</span><span> ); </span></li><li><span> </span></li><li class="alt"><span> </span><span class="vars">$res</span><span> = mysql_query( </span><span class="string">"SELECT id FROM users WHERE login='"</span><span>.</span><span class="vars">$name</span><span>.</span><span class="string">"'"</span><span> ); </span></li><li><span> </span><span class="keyword">while</span><span>( </span><span class="vars">$row</span><span> = mysql_fetch_array( </span><span class="vars">$res</span><span> ) ) { </span><span class="vars">$id</span><span> = </span><span class="vars">$row</span><span>[0]; } </span></li><li class="alt"><span> </span></li><li><span> </span><span class="keyword">return</span><span> </span><span class="vars">$id</span><span>; </span></li><li class="alt"><span>} </span></li><li><span> </span></li><li class="alt"><span>var_dump( get_user_id( </span><span class="string">'jack'</span><span> ) ); </span></li><li><span>?> </span></span></li></ol>
mysql_connect 함수는 데이터베이스에 액세스하는 데 사용됩니다. 또한 문자열 연결을 사용하여 $name 매개 변수를 쿼리에 추가하는 쿼리에 유의하세요.
이 기술에 대한 두 가지 좋은 대안이 있습니다. PEAR DB 모듈과 PDO(PHP Data Objects) 클래스입니다. 둘 다 특정 데이터베이스 선택의 추상화를 제공합니다. 결과적으로 IBM® DB2®, MySQL, PostgreSQL 또는 연결하려는 기타 데이터베이스를 크게 조정하지 않고도 코드를 실행할 수 있습니다.
PEAR DB 모듈과 PDO 추상화 계층을 사용하는 또 다른 가치는 SQL 문에서 ? 연산자를 사용할 수 있다는 것입니다. 이렇게 하면 SQL을 유지 관리하기가 더 쉬워지고 SQL 삽입 공격으로부터 애플리케이션을 보호할 수 있습니다.
PEAR DB를 이용한 대체 코드는 아래와 같습니다.
목록 2. Access/get_good.php
<ol class="dp-c"> <span><span> </span></span><li><span><?php </span></li><li class="alt"><span class="keyword">require_once</span><span>(</span><span class="string">"DB.php"</span><span>); </span></li><li><span> </span></li><li class="alt"><span class="keyword">function</span><span> get_user_id( </span><span class="vars">$name</span><span> ) </span></li><li><span>{ </span></li><li class="alt"><span> </span><span class="vars">$dsn</span><span> = </span><span class="string">'mysql://root:password@localhost/users'</span><span>; </span></li><li><span> </span><span class="vars">$db</span><span> =& DB::Connect( </span><span class="vars">$dsn</span><span>, </span><span class="keyword">array</span><span>() ); </span></li><li class="alt"><span> </span><span class="keyword">if</span><span> (PEAR::isError(</span><span class="vars">$db</span><span>)) { </span><span class="keyword">die</span><span>(</span><span class="vars">$db</span><span>->getMessage()); } </span></li> <li><span> </span></li> <li class="alt"> <span> </span><span class="vars">$res</span><span> = </span><span class="vars">$db</span><span>->query( </span><span class="string">'SELECT id FROM users WHERE login=?'</span><span>, </span> </li> <li> <span> </span><span class="keyword">array</span><span>( </span><span class="vars">$name</span><span> ) ); </span> </li> <li class="alt"> <span> </span><span class="vars">$id</span><span> = null; </span> </li> <li> <span> </span><span class="keyword">while</span><span>( </span><span class="vars">$res</span><span>->fetchInto( </span><span class="vars">$row</span><span> ) ) { </span><span class="vars">$id</span><span> = </span><span class="vars">$row</span><span>[0]; } </span> </li> <li class="alt"><span> </span></li> <li> <span> </span><span class="keyword">return</span><span> </span><span class="vars">$id</span><span>; </span> </li> <li class="alt"><span>} </span></li> <li><span> </span></li> <li class="alt"> <span>var_dump( get_user_id( </span><span class="string">'jack'</span><span> ) ); </span> </li> <li><span>?> </span></li> </ol>
$dsn의 데이터베이스 연결 문자열을 제외하고 MySQL에 대한 모든 직접 참조가 제거되었습니다. 또한 ? 연산자를 통해 SQL에서 $name 변수를 사용합니다. 그런 다음 쿼리 데이터는 query() 메서드 끝에 있는 배열을 통해 전송됩니다.
1