ホームページ >バックエンド開発 >PHPの問題 >3 分で PHP の MySQLi を理解できます

3 分で PHP の MySQLi を理解できます

醉折花枝作酒筹
醉折花枝作酒筹転載
2021-06-24 16:30:301964ブラウズ

この記事から始めて、MySQLi 拡張機能について学びます。 MySQL (オリジナル) 拡張機能は、私たちの多くが初めて PHP を学習し始めるときにデータベースに接続するための入門講師であると言えます。プロシージャル コードを使用してデータベースを操作する場合は、mysqli 拡張機能のみを使用できます。

3 分で PHP の MySQLi を理解できます

PDO の学習は終了しました。この記事から、PDO 以外のコア MySQLi 拡張機能である別の MySQL 拡張機能について学び続けます。おそらく、その祖先である MySQL (オリジナル) 拡張機能は、私たちの多くが最初に PHP を学習し始めたときに、データベースに接続するための頼りになるガイドでした。しかし、時代の変化とともに、MySQL (オリジナル) 拡張機能は PHP7 では完全に放棄されました。プロシージャル コードを使用してデータベースを操作する場合は、mysqli 拡張機能のみを使用できます。もちろん、mysqli 拡張機能はオブジェクト指向の記述もサポートしています。

MySQLi とは

#MySQLi 拡張機能を使用すると、MySQL4.1 以降のバージョンのデータベースが提供する機能にアクセスできます。異なる DNS を介して異なるデータベースに接続できる PDO とは異なり、特に MySQL データベースを対象としています。

MySQL と PDO の違いと関連性

まず最初に、初期の MySQL 拡張機能を確認しましょう。

    #プロシージャのみ
  • #ストアド プロシージャ、複数ステートメントの実行、およびプリペアド ステートメントはサポートされません
  • PHP7 は削除され、まったくサポートされていません
  • ##その後、PDO

##オブジェクト指向の使用のみをサポート

  • さまざまなデータベースに接続でき、データベースを切り替えると変更が少なくなり、コードを変更する必要さえない場合もあります

  • ストアド プロシージャ、マルチステートメントの実行と準備されたステートメント

  • 最後は MySQLi です。

  • #オブジェクト指向とプロセス指向の両方の記述方法をサポート

    MySQL データベースのみをサポート
  • # #サポートされているストアド プロシージャ、複数ステートメントの実行、プリペアド ステートメント
  • PHP と MySQL のバージョン更新に従って、より迅速に MySQL の高度な機能をサポートできます
  • 3 つの特性から判断すると、MySQL (オリジナル) 拡張機能は決して推奨されません。古いプロジェクトであっても、PHP 版の PDO または MySQLi をサポートしている限り、データベース接続の変換を検討する必要があります。 2 つの方法のうちの 1 つです。 PHP5 環境での MySQL (オリジナル) 拡張機能の使用方法をまだ学習している場合は、やめても構いません。
  • PDO と MySQLi のどちらを選択するかについては、意見の問題です。実際、それらの間に大きな違いはありませんが、最新の大規模フレームワークは基本的に PDO をデフォルトのデータベース接続としてカプセル化するため、その移植性により、これらの一般的なフレームワークをさまざまなデータベースに接続することが容易になります。一部の小規模なフレームワークやプロジェクトでは、MySQLi が依然として使用されていることがあります。

    もちろん、ニッチが悪いというわけではありません。日常の開発と同じように、PHP 環境で他のデータベースを使用することはめったにないため、独自の小規模プロジェクトの運用には MySQLi のセットを完全に使用できます。より便利で速いです。同時に、古いプロジェクトを PHP7 バージョンに切り替えたい場合、MySQL (オリジナル) 接続データベースが以前に使用されていた場合、MySQL (オリジナル) コードを MySQLi にすぐに置き換えることができます。
拡張機能のインストールと MySQL8 に関する注意事項

MySQLi 拡張機能は PHP ソース コードとともにリリースされており、PHP をコンパイルするときに --with-mysqli を追加するだけです。デフォルトのデータベースドライバーは mysqlnd を使用するようになり、libmysql は基本的に削除されました。したがって、コンパイル時に他のパラメーターを追加する必要はなく、直接コンパイルするだけです。

MySQL8 サーバーはデフォルトでパスワード暗号化として caching_sha2_password を使用するため、MySQL8 に接続するときは注意する必要があります。 PHP7.2.4 より前のバージョンの MySQLi は、mysql_native_password を使用して接続パスワードを暗号化するため、データベースに接続できなくなります。 my.cnf ファイルを変更し、default_authentication_plugin=mysql_native_password を設定すると、MySQL8 でもユーザー パスワードの暗号化に mysql_native_password を使用できるようになります。

プロセス指向

前述したように、MySQLi はオブジェクト指向とプロセス指向という 2 つの記述方法をサポートしています。簡単に理解すると、1 つの書き方は MySQL (オリジナル) の拡張子であり、もう 1 つの書き方は PDO に似ています。まずはプロセス指向のライティングについて見てみましょう。

$mysqli = mysqli_connect("localhost", "root", "", "blog_test");
$res = mysqli_query($mysqli, "SELECT * FROM zyblog_test_user");
$row = mysqli_fetch_assoc($res);
print_r($row);

MySQL (オリジナル) 拡張コードを移植すると本当に便利だと思いますか?すべてのメソッド名を mysqli_xxx に変更するだけです。

オブジェクト指向

オブジェクト指向は PDO に少し似ています。まず接続ハンドル クラスを取得し、次にこのクラスを操作する必要があります。

$mysqli = new mysqli("localhost", "root", "", "blog_test");
$res = $mysqli->query("SELECT * FROM zyblog_test_user");
$row = $res->fetch_assoc();
print_r($row);

面向对象和面向过程混用

另外,这两种方式还可以混合使用,不过并不推荐。混合起来使用的话很容易让看代码的人晕头转向。所以,最好还是在一个项目中就坚持使用一种方式。

$mysqli = new mysqli("localhost", "root", "", "blog_test");
$res = mysqli_query($mysqli, "SELECT * FROM zyblog_test_user");
$row = $res->fetch_assoc();
print_r($row);

在这段代码中,我们实例化了一个 mysqli 对象,然后使用面向过程的 mysqli_query() 函数来执行语句,接着又使用面向对象的方式来获取结果集。是不是很乱?但是它是可以正常运行的。

总结

从上面的内容中可以看出,PDO 的特点是支持多种不同类型的数据库,就像 Java 中的 JDBC 一样。而 MySQLi 虽然只支持 MySQL 数据库,但它却可以同时支持面向对象和面向过程两种写法。是我们针对老项目代码进行升级优化的好帮手。同时,它还是现在入门 PHP 学习相关数据库操作的首选。在接下来的文章中,我们将默认只使用 面向对象 式的写法来继续学习 MySQLi 扩展相关的知识。

测试代码:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202009/source/4.PHP中的MySQLi扩展学习(一)MySQLi介绍.php

推荐学习:php视频教程

以上が3 分で PHP の MySQLi を理解できますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。