PHP は初期の頃から MySQL をサポートしており、その 2 番目のバージョンには API が含まれています。この 2 つの組み合わせは非常に一般的であるため、この拡張機能はデフォルトで有効になっています。ただし、PHP 5 では、MySQL 改良版 (略して mysqli) と呼ばれる新しい MySQL 拡張機能がリリースされました。
新しい拡張機能をリリースする理由は何ですか?理由は 2 つあります。まず、MySQL は急速に進化しており、古い拡張機能に依存しているユーザーは、プリペアド ステートメント、高度な接続オプション、セキュリティの強化などの新機能を利用できません。第 2 に、古い拡張機能は確かに使用には問題ありませんでしたが、多くの人が手続き型インターフェイスは時代遅れであると考え、他のアプリケーションとの緊密な統合だけでなく、必要に応じてインターフェイスを拡張できるオブジェクト指向インターフェイスを好みました。これらの欠点に対処するために、MySQL 開発者はその拡張機能を改良する時期が来たと判断し、内部動作を変更してパフォーマンスを向上させるだけでなく、新しいバージョンの MySQL で利用可能な機能の使用を容易にする追加機能も導入しました。
いくつかの重要な改善点:
# オブジェクト指向: MySQL 拡張機能は一連のクラスにカプセル化されているため、多くの人が PHP の従来の手続き型アプローチよりも便利で効率的であると考えるプログラミング パラダイムの使用が促進されます。ただし、手続き型パラダイムを好む人は心配する必要はありません。従来の手続き型インターフェイスも提供されるからです。
# プリペアドステートメント: SQL インジェクション攻撃を防ぐことができます。これにより、繰り返し実行されるクエリのオーバーヘッドや不便さが解消されます。
# トランザクションのサポート: PHP のオリジナルの MySQL 拡張機能もトランザクション関数をサポートできますが、mysqli 拡張機能はこれらの関数にオブジェクト指向のインターフェイスを提供します。
# 強化されたデバッグ機能: mysqli 拡張機能はクエリをデバッグするための多くのメソッドを提供し、開発プロセスをより効率的にします。
# 組み込みサーバーのサポート: MySQL 4.0 リリースでは組み込み MySQL サーバー ライブラリが導入されているため、興味のあるユーザーはデスクトップ プログラムなどのクライアント アプリケーションで完全な MYSQL サーバーを実行できます。 mysqli 拡張機能は、これらの組み込み MySQL サーバーに接続して操作するためのメソッドを提供します。
# マスター/スレーブのサポート: MySQL 3.23.15 以降、MySQL はレプリケーションのサポートを提供します。 mysqli 拡張機能を使用すると、クエリが複製された構成のマスター サーバーに確実にルーティングされるようになります。
オリジナルの MySQL 拡張機能に慣れているユーザーは、ほぼ同じ命名規則を持つ強化された mysqli 拡張機能に非常に親しみを感じるでしょう。たとえば、データベース接続関数は、mysql_connect ではなく mysqli_connect と呼ばれます。
1. インストールの前提条件
PHP 5 以降、MySQL サポートは標準の PHP 配布パッケージにバンドルされていません。したがって、この拡張機能を利用するには、PHP を明示的に構成する必要があります。
1.1. Linux/UNIX で mysqli 拡張機能を有効にする
PHP を設定するときに --with-mysqli フラグを使用します。これは、MySQL 4.1 以降の mysql_config プログラムの場所を指す必要があります。
1.2. Windows で mysqli 拡張機能を有効にするには
php.ini を変更し、この行のコメントを解除する必要があります: extension=php_mysqli.dll 。もちろん、拡張機能を有効にする前に、PHP の extension_dir ディレクティブが適切なディレクトリを指していることを確認してください。
1.3. MYSQL ローカル ドライバーを使用する
歴史的に、PHP では、MYSQL サーバーがローカルか他の場所にあるかに関係なく、PHP プログラムを実行するサーバーに MySQL クライアント ライブラリをインストールする必要がありました。 PHP 5.3 では、この要件が削除され、MySQL Native Driver (mysqlnd とも呼ばれる) と呼ばれる新しい MySQL ドライバーが導入されています。これには、先ほど述べたドライバーに比べて多くの利点があります。これは新しい API ではなく、既存の API (mysql、mysqli、PDO_MySQL) が MySQL サーバーと通信するために利用できる新しい「コンジット」です。 (よほどの理由がない限り) 他のドライバーの代わりに mysqlnd を使用することをお勧めします。
拡張機能を付けて mysqlnd を使用するには、PHP を再コンパイルする必要があります (例: --with-mysqli=mysqlnd)。 %>./configure --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd など、さらにいくつか指定することもできます
mysqlnd ドライバーにもいくつかの制限があります。現在、圧縮や SSL のサポートは提供されていません。
1.4. ユーザー権限の管理
スクリプトが MySQL サーバーへの接続を初期化すると、権限が渡されて検証されます。権限の検証が必要なコマンドを送信する場合も同様です。ただし、実行ユーザーを確認する必要があるのは、接続するときだけです。後で新しい接続が確立されない限り、それ以降のスクリプトの実行は常にそのユーザーになります。
1.5. サンプルデータを使用する
新しい知識を学ぶときにいくつかの例を追加するのは簡単です。データベース: 企業; テーブル: products
CREATE TABLE products (
id INT NOT NULL AUTO_INCREMENT、
sku VARCHAR(8) NOT NULL、
name VARCHAR(100) NOT NULL、
価格 DECIMAL(5,2) NOT NULL、
PRIMARY KEY(ID)
)
========================================== == ================================
2. mysqli 拡張機能を使用します
2.1.まずサーバーに接続し、次にデータベースを選択して、接続を閉じる必要があります。オブジェクト指向と手続き型は両方とも可能なスタイルです。
オブジェクト指向インターフェイスを使用して MySQL サーバーと対話するには、まず mysqli クラスのコンストラクターを使用してインターフェイスをインスタンス化する必要があります。
mysqli([string host [, string username [, string pswd
] ] パラメータは従来の mysql_connect() 関数と同じです。
$mysqli = new mysqli('localhost', 'catalog_user', 'secret', 'corporate');
ある時点で別のサーバーに切り替えるか、別のデータベースを選択したい場合は、connect() と select_db を使用できます。 ()方法。 connect() メソッドのパラメータは、mysqli クラスのコンストラクタと同じです。
// mysqli クラスをインスタンス化します
$mysqli = new mysqli();
// データベースサーバーに接続し、データベースを選択します
$mysqli->connect('localhost', 'root', '', 'corporate') ;
------------------------------------------------ ----------------------------------
or
// データベースサーバーに接続します
$mysqli = new mysqli ('localhost', 'catalog_user', 'secret');
// データベースを選択します
$mysqli->select_db('corporate');
スクリプトの実行が完了すると、開いているデータベース接続はすべて自動的に閉じられ、リソースは閉鎖されます。ただし、実行中にページで複数のデータベース接続を使用する必要がある場合もあり、これらの接続を正しく閉じる必要があります。使用する接続が 1 つだけの場合でも、スクリプトの最後で接続を閉じることをお勧めします。 $mysqli->close()。
2.2. 接続エラーの処理
接続エラーは注意深く監視し、それに応じて対策を講じる必要があります。 mysqli 拡張機能は、エラー メッセージをキャッチするために使用できるいくつかの機能を提供します。別の方法は、例外を使用することです。たとえば、mysqli_connect_errno() および mysqli_connect_error() を使用して、MySQL 接続エラー メッセージを診断および表示できます。
2.3. エラーメッセージの取得
2.3.1. エラーコードの取得
errno() メソッドは、最後の MySQL 関数の実行中に生成されたエラー コードを返します。 0 はエラーがないことを意味します。
$mysqli = new mysqli('localhost', 'catalog_user', 'secret', 'corporate'); printf("Mysql エラー番号が生成されました: %d", $mysqli->errno); >
2.3.2. エラーメッセージの取得
error() メソッドは、最後に生成されたエラーメッセージを返します。エラーがない場合は空の文字列が返されます。メッセージング言語は Mysql データベース サーバーに依存します。
2.4. 接続情報を別のファイルに保存する
安全なプログラミングの実践という観点からは、パスワードを定期的に変更することをお勧めします。データベースにアクセスするスクリプトも多く、一つ一つ修正するのは面倒です。解決策は、それを別のファイルに保存し、必要に応じて現在のファイルに含めることです。
たとえば、ヘッダー ファイル (mysql.connect.php) に mysqli コンストラクターを置くことができます。
$mysqli = new mysqli('localhost', 'catalog_user', 'secret', 'corporate');
?>それを他のファイルに含めます:
include 'mysql.connect.php';
// データベースの選択とクエリを開始します ?>
=========== ================================================= =================
3. データベースと対話します
3.1. データベースにクエリを送信します
query() メソッドを使用します。その形式は混合クエリ(string query [, int resultmode])です。オプションの resultmode パラメータは、このメソッドの動作を変更するために使用されます。これには 2 つの値があります:
はデフォルト値です。結果セットをキャッシュされたセットとして返すということは、結果セット全体をすぐにナビゲーションできる状態になることを意味します。多少メモリを消費しますが、結果セット全体を一度に使用できるため、結果セットを分析および管理する場合に便利です。たとえば、クエリから返されたデータの行数を知りたい場合や、結果セット内の特定の行にすぐにジャンプしたい場合があります。
. MYSQLI_USE_RESULT: 結果セットをバッファリングされていないセットとして返します。これは、データが必要に応じてサーバーから取得されることを意味します。大規模な結果セットの場合、これによりパフォーマンスが向上しますが、返されるデータの行数を決定したり、特定の行に合わせて調整したりすることはできません。
3.1.1 データの取得
$mysqli = new mysqli('localhost', 'catalog_user', 'secret', 'corporate')
// クエリを作成
$query = 'SELECT sku,名前、価格 商品から名前で注文します
;
// クエリを MySQL に送信します
$result = $mysqli->query($query, MYSQLI_STORE_RESULT)
// 結果セットを反復処理します
while(list($sku, $name, $price) = $result ->fetch_row())
データの挿入、更新、削除
query() メソッドも使用されます。
$result = $mysqli->query($query, MYSQLI_STORE_RESULT);
printf("%d 行が削除されました。", $mysqli->affected_rows);
もちろん、接続ユーザーが十分な認証情報を提供していると仮定すると、データベース、テーブル、インデックスの作成と変更を含む任意のクエリを実行でき、またユーザーへの権限の作成や付与などの MySQL 管理タスクを完了することもできます。
3.1.3. クエリ メモリの解放
非常に大きな結果セットを取得する場合、処理の完了後に結果セットによって要求されたメモリを解放する必要がある場合は、free() メソッドを使用して結果セットを解放します。は使用できません。 $result->free();
3.2. クエリ結果を解析します
3.2.1. 結果をオブジェクトにフェッチします
while ($row = $result->fetch_object())
{
$name = $row- >名前;
$sku = $row->sku;
$price = $row->price;
printf("(%s) %s: %s
", $sku, $name, $price)";
}
3.2.2. インデックスと連想配列を使用して結果を取得する
fetch_array() は両方、fetch_row() はインデックス配列です
メソッドのプロトタイプは次のとおりです:
class mysqli_result {
mixed fetch_array([int resulttype] )
} mysqli_result {
mixed fetch_row()}} mysqli_assocまたはmysqli_numまたはmysqli_both [
mysqli_assoc:フィールド名は鍵です。順序はクエリによって指定されます。* の場合、テーブル定義のフィールド順序に基づいてすべてのフィールドが検索されます。 sku, name FROM products ORDER BY name';
$result = $mysqli->query($query);
while ($row = $result->fetch_array(MYSQLI_ASSOC))
{
$name = $row['name '];
$sku = $row[ 'sku'];
echo "Product: $name ($sku)
";
}
または
while ($row = $result->fetch_array(MYSQLI_NUM))
{
$sku = $row[0];
$name = $row[2];
printf("(%s) %s: %d
", $sku, $ name, $price);
}
3.3 選択された行の数を決定する | 影響を受ける行の数
SELECT クエリによって返される行の数、または INSERT によって影響を受ける行の数を知りたいとします。 UPDATE または DELETE クエリ。
。 num_rows() メソッドは、SELECT クエリ ステートメントから返されるデータの行数を決定するために使用されます。例:
$query = 'SELECT name FROM products WHERE 価格 > 15.99';
$result = $mysqli->query($query);
printf("$15.99 を超える価格の製品が %f 個あります。 " , $result->num_rows);
。affected_rows() メソッドは、INSERT、UPDATE、および DELETE クエリによって影響を受ける行の数を決定するために使用されます。
3.4. プリペアドステートメントを使用する
毎回異なるパラメータ値を使用してクエリを繰り返し実行することは非常に一般的です。ただし、ループと組み合わせた従来の query() メソッドを使用すると、(妥当性を検証するためにほぼ同じクエリを繰り返し解析する必要があるため) コストがかかるだけでなく、コード作成にも不便です (新しい値で再利用する必要があるため)。クエリを構成する)、MySQL 4.1 ではプリペアド ステートメントが導入され、はるかに低いオーバーヘッドと少ないコードで上記のタスクを実現できます。
準備されたステートメントには 2 つのタイプがあります:
バインドされたパラメーター: MySQL サーバーにクエリを配置し、変更されたデータをクエリに統合して実行するだけです。 。たとえば、ユーザーが店舗アイテムを管理できる Web プログラムを作成するとします。初期化プロセスをすぐに開始するには、最大 20 個の製品の名前、ID、価格、および説明を受け入れるフォームを作成するとよいでしょう。この状況のために。
// 新しいサーバー接続を作成します
$mysqli = new mysqli('localhost', 'catalog_user', 'secret', 'corporate');
// クエリと対応するプレースホルダーを作成します
$query = "SELECT sku 、名前、価格、説明
FROM products ORDER BY sku";
// ステートメント オブジェクトを作成します
$stmt = $mysqli->stmt_init();
// ステートメントの実行準備をします
$stmt->prepare($ query);
.. 準備されたステートメントを使用して何かを実行します
// ステートメントのリソースを回復します
$stmt->close();
// 接続を閉じます
$mysqli->close();
boolean binding_param(string tables,mixed &var1 [,mixed &varN])
} types パラメーターは、後続の各変数 (つまり、&var1 など) のデータ型を表します。 , &varN) の場合、このパラメーターは、サーバーに送信されるデータの最も効率的なエンコードを保証するために必要です。現在、4種類のコードがサポートされています。
.i: すべての INTEGER 型
//新しいサーバー接続
$mysqli = new mysqli('localhost', 'catalog_user', 'secret', 'corporate');// クエリと対応するプレースホルダーを作成します
$query = "INSERT INTO products SET id= NULL, sku=?, NULL を使用, sku=? prepare($que ry);
// パラメータをバインドします
$stmt->bind_param('ssd', $sku, $name, $price); // 割り当てますポストされた SKU 配列
$skuarray = $_POST[ 'sku'];
// ポストされた名前配列を割り当てます
$namearray = $_POST['name'];
// ポストされた価格配列を割り当てます
$pricearray = $_POST['price'];
// カウンターを初期化します
$x = 0;
// 配列を循環し、クエリを繰り返し実行します
while ($x $ sku = $skuarray[$x];
$name = $namearray[$x]; $price = $pricearray[$x];
$mysqli->close();
3.4.5. 変数のバインド
クエリの準備ができて実行されたら、取得したフィールドにいくつかの変数をバインドできます。 bind_result() メソッドが使用されます。そのプロトタイプは次のとおりです。
class mysqli_stmt {
boolean binding_result(mixed &var1 [,mixed &varN])
}
たとえば、products テーブルの最初の 30 個の製品のリストを返したいとします。次のコードは、変数 $sku、$name、$price を取得したフィールドにバインドします。
// 新しいサーバー接続を作成します
$mysqli = new mysqli('localhost', 'catalog_user', 'secret', 'corporate');
// クエリを作成します
$query = 'SELECT sku, name,price FROM products ORDER BY sku';
// ステートメントオブジェクトを作成します
$stmt = $mysqli->stmt_init();
// ステートメントの実行を準備します
$stmt->prepare($query);
// ステートメントを実行します
$stmt->execute();
// 結果パラメータをバインドします
$stmt->bind_result($sku, $name, $price);
// 結果を循環してデータを出力します
while($stmt->fetch())
printf("%s, %s, %s
", $sku, $name, $price);
// ステートメントのリソースを回復します
$stmt->close();
// 接続を閉じる
$mysqli->close();
?>
3.4.6、準備されたステートメントからデータを取得します
fetch() メソッドは準備されたステートメントの結果を 1 つずつ取得し、フィールドを決定結果に送ります。 mysqli {
boolean fetch()}
====================================== =====================================
4、执行データベース库事务
4.1、开启自動提交モード
class mysqli {
boolean autocommit(boolean mode)}
传 TRUE は使用です、FALSE は禁止です。 sqli {
}
4.3、回滚一事务
class mysqli {
boolean rollback()
}