データベースの使用方法が 1 つだけ正しい場合、データベース設計、データベース アクセス、データベース ベースの PHP ビジネス ロジック コードを作成できる方法はたくさんありますが、通常はエラーが発生します。この記事では、データベース設計およびデータベースにアクセスする PHP コードで発生する 5 つの一般的な問題と、それらが発生した場合の修正方法について説明します。
問題 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 モジュールと PHP データ オブジェクト (PDO) クラスという 2 つの優れた代替手段があります。どちらも、特定のデータベース選択からの抽象化を提供します。その結果、コードは、IBM® DB2®、MySQL、PostgreSQL、または接続先のその他のデータベース上でほとんど調整せずに実行できます。
PEAR DB モジュールと PDO 抽象化レイヤーを使用するもう 1 つの利点は、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