ホームページ >バックエンド開発 >PHPチュートリアル >プログラマーが犯しやすい MySQL の 11 の間違い (PHP 開発)
この記事では、PHP プログラマーが最もよく犯す MySQL の 11 の間違いを紹介します。一定の参考値があるので、困っている友達が参考になれば幸いです。
ほとんどの Web アプリケーションにとって、データベースは非常に基本的な部分です。 PHP を使用している場合は、LAMP ファミリの重要なメンバーである MySQL も使用していることでしょう。
多くの初心者にとって、PHP を使用すると、特定の関数を含むコードをわずか数時間で簡単に作成できます。ただし、安定した信頼性の高いデータベースを構築するには、ある程度の時間とスキルが必要です。以下に、私がこれまでに犯した MySQL 関連の最悪の 11 の間違いを示します (そのうちのいくつかは、他の言語/データベースの使用にも反映されています)。 。 。
1. InnoDB の代わりに MyISAM を使用する
MySQL には多くのデータベース エンジンがありますが、最もよく使用されるのは MyISAM と InnoDB です。
MySQL はデフォルトで MyISAM を使用します。ただし、非常に単純なデータベースや実験的なデータベースを作成する場合を除き、多くの場合、これは適切な選択ではありません。外部キー制約またはトランザクションはデータの整合性にとって非常に重要ですが、MyISAM はこれらをサポートしていません。また、レコードの挿入や更新を行うとデータテーブル全体がロックされるため、使用量が増えると作業効率が非常に悪くなります。
結論は簡単です。InnoDB を使用します。
2. PHP の mysql 関数を使用する
PHP は、作成された日から (あるいは、ほとんど違いがない限り) MySQL ライブラリ関数を提供してきました。 PHP マニュアルには次のように書かれていますが、多くのアプリケーションは依然として mysql_connect、mysql_query、mysql_fetch_assoc などの関数を使用しています。
MySQL v4.1.3 以降を使用している場合は、mysqli 拡張機能を使用することを強くお勧めします。
mysqli (MySQL 拡張機能の拡張バージョン) には次の利点があります。
オプションのオブジェクト指向インターフェイス
SQL インジェクション攻撃の防止に役立つ準備された式。パフォーマンスの向上
より多くの式とトランザクション処理のサポート
さらに、複数のデータベース システムをサポートしたい場合は、PDO を検討することもできます。
3. ユーザー入力を処理しない
これは次のように言えます #1: ユーザー入力を決して信頼しないでください。 JavaScript に依存せず、サーバー側の PHP を使用して各文字列を検証します。最も単純な SQL インジェクション攻撃では、次のコードが使用されます:
$username = $_POST["name"]; $password = $_POST["password"]; $sql = "SELECT userid FROM usertable WHERE username = '$username' AND passwd='$password';"; // クエリを実行...
ユーザー名フィールドに「admin';--」と入力している限り、それに応じてハッキングされます。 SQL ステートメントは次のとおりです。
SELECT userid FROM usertable WHERE username='admin';
狡猾なハッカーは管理者としてログインでき、パスワードを知る必要はありません。パスワード部分はコメントアウトされています。
4. UTF-8 は使用されません
米国、英国、オーストラリアでは、英語以外の言語を考慮することはほとんどありません。私たちは誇りを持って「傑作」を完成させましたが、他の場所ではうまく機能しないことがわかりました。
UTF-8 は、国際化に関する多くの問題を解決します。 PHP v6.0 より前では十分にサポートされていませんが、MySQL 文字セットを UTF-8 に設定することはできます。
5. SQL よりも PHP を好む
MySQL を短期間使用したことがあると、問題を解決するためにすでに習得した言語を使用する傾向があります。これは、冗長で非効率なコードを書くことになります。たとえば、MySQL に付属の AVG() 関数は使用せず、まずレコードセット内の値を合計し、次に PHP ループを使用して平均を計算します。
また、PHP ループ内の SQL クエリにも注意してください。一般に、クエリを実行する方が、結果を反復処理するより効率的です。
データを分析する際には、SQL を知っておくと非常に役に立ちますので、データベース システムを活用してください。
6. データベース クエリが最適化されていない
PHP パフォーマンスの問題の 99% はデータベースが原因です。たった 1 つの悪い SQL クエリが Web アプリケーションを台無しにする可能性があります。完全に麻痺します。 MySQL の EXPLAIN ステートメント、Query Profiler、およびその他の多くのツールは、これらの悪質な SELECT を見つけるのに役立ちます。
7. データ型を正しく使用できない
MySQL には、数値、文字列、日付などのデータ型が用意されています。時刻を保存する場合は、DATE 型または DATETIME 型を使用します。この時点で INTEGER または STRING 型を使用すると、その型を定義するために INTEGER または STRING を使用できる限り、SQL クエリが非常に複雑になります。
多くの人は、シリアル化された PHP オブジェクトを格納するために文字列を使用するなど、承認なしに一部のデータの形式をカスタマイズする傾向があります。これによりデータベースの管理が容易になる可能性がありますが、MySQL のデータ ストアとしては不十分になり、後で障害が発生する可能性が高くなります。
8. クエリでは *
を使用します。データ テーブルのすべての列のデータを返すために * を使用しないでください。これは怠惰です。必要なデータを抽出する必要があります。すべてのフィールドが必要な場合でも、データ テーブルは必然的に変更されます。
9. インデックスを使用しない、またはインデックスを過剰に使用しない
一般原則は、select ステートメントの where 句で表されるフィールドはすべてインデックスを使用する必要があるということです。
たとえば、数値 ID (主キー) と電子メール アドレスを含むユーザー テーブルがあるとします。ログインするとき、MySQL は電子メールに基づいて正しい ID を検索する必要があります。インデックスが使用されている場合 (ここでは電子メール)、MySQL はより高速な検索アルゴリズムを使用して、電子メールを瞬時にでも見つけることができます。それ以外の場合、MySQL は正しい電子メール アドレスが見つかるまで各レコードを順番にチェックすることしかできません。
各フィールドにインデックスを追加する人もいますが、残念ながら、これらのインデックスは INSERT または UPDATE の実行後に再生成する必要があるため、パフォーマンスに影響します。したがって、インデックスは必要な場合にのみ追加してください。
10. バックアップを忘れました!
まれではありますが、データベースがクラッシュする危険性があります。ハード ドライブが破損したり、サーバーがクラッシュしたり、Web ホスティング プロバイダーが破産したりする可能性があります! MySQL データを失うと壊滅的な事態になるため、自動バックアップを作成するか、コピーを作成しておくことを確認してください。
11. おまけの間違い - 他のデータベースの使用を検討しないでください
PHP 開発者にとって、MySQL は最も広く使用されているデータベース システムかもしれませんが、それだけではありません。選ぶ。 PostgreSQL と Firebird が最も有力な候補です。どちらもオープンソースであり、どちらも企業に買収されていません。 Microsoft は SQL Server Express、Oracle は 10g Express を提供しており、どちらもエンタープライズ クラスのデータベースの無料バージョンです。場合によっては、小規模な Web アプリケーションや組み込みアプリケーションの場合、SQLite が有力な代替手段となることがあります。
推奨学習: PHP ビデオ チュートリアル
以上がプログラマーが犯しやすい MySQL の 11 の間違い (PHP 開発)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。