ホームページ  >  記事  >  バックエンド開発  >  PHP データベースでよくある 5 つの問題 (1)_PHP チュートリアル

PHP データベースでよくある 5 つの問題 (1)_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-22 09:02:30833ブラウズ

データベースの使用方法が 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

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/445827.html技術記事データベースの使用方法が 1 つだけ正しい場合、データベース設計、データベース アクセス、データベース ベースの PHP ビジネス ロジック コードをさまざまな方法で作成できますが、最終的には...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。