ホームページ データベース mysql チュートリアル PHP における mysql と mysqli の違い

PHP における mysql と mysqli の違い

Nov 23, 2016 pm 03:05 PM
php

その 1:
PHP-MySQL は、MySQL データベースを操作するための PHP のオリジナルの拡張機能です。PHP-MySQLi の i は、拡張機能に関する限り、比較的高度な機能を提供します。 PDO (PHP Data Object) はデータベースを操作するための抽象化レイヤーを提供します。実際には違いがわかりませんので、プログラムを見てください...
まず、PHP で書かれた段落を見てみましょう。 MySQL プログラム コード、このような例は世界中で一般的に使用されています:
コードは次のとおりです:

mysql_connect($db_host, $db_user, $db_password);
mysql_select_db($dn_name);
$result = mysql_query(" SELECT `name` FROM `users` WHERE `location` = '$location'");
while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
{
echo $row['name'];
}
mysql_free_result ($result);
?>

一見何も問題はありませんが、実は裏にある知識があります...
このメソッドは、前の SQL の説明で言えば、$location をバインドできません。 SQL インジェクションが起こりやすい。その後、この問題を解決するために mysql_escape_string() (注: 5.3.0 以降は非推奨) と mysql_real_escape_string() が開発されました。ただし、全体のストーリーは複雑で見苦しくなり、フィールドが多すぎるとどうなるかは想像できます。次のようになります...
コードは次のとおりです:

$query = sprintf("SELECT * FROM users WHERE user='%s' ANDpassword='%s'",
mysql_real_escape_string($user) ) ,
mysql_real_escape_string($password));
mysql_query($query);
?>

は、Bind Column を通じて上記の問題を解決することに加えて、トランザクションもサポートしています。 Multi Query のほか、オブジェクト指向スタイル (以下の PHP-MySQLi サンプルの記述方法) と手続き型スタイル (上記の PHP-MySQL サンプルの記述方法) の 2 つの記述メソッドも提供されます。
コードは次のとおりです:

$mysqli = new mysqli($db_host, $db_user, $db_password, $db_name);
$sql = "INSERT INTO `users` (id, name, 性別, location) VALUES (?, ?, ?, ?)";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('dsss', $source_id, $source_name, $source_gender, $source_location) ;
$stmt->execute();
$stmt->bind_result($id, $name, $gender, $location);
while ($stmt->fetch())
{
echo $id . $name . $location;
}
$stmt->close();
?>

しかし、ここで次のような欠点が見つかりました。バインド結果、これは少し冗長ですが、実際には問題ありません。最大の問題は、これが抽象化メソッドではないため、バックエンドがデータベースを変更すると、痛みが始まります...
つまり、PDO が表示されます (注: 現在、Ubuntu と Debian の場合、PDO には直接インストールするパッケージはありませんが、PECL を通じてインストールする必要があります)。

コードは次のとおりです:

roga@carlisten-lx:~$ pecl search pdo
============================ ==== ========
パッケージ 安定版/(最新) ローカル
PDO 1.0.3 (安定版) PHP Data Objects Interface.
PDO_4D 0.3 (ベータ版) 4D-SQL データベース用 PDO ドライバー
PDO_DBLIB 1.0 (安定版) PDO 用 FreeTDS/Sybase/MSSQL ドライバー
PDO_FIREBIRD 0.2 (ベータ) PDO 用 Firebird/InterBase 6 ドライバー
PDO_IBM 1.3.2 (安定版) IBM データベース用 PDO ドライバー
PDO_INFORMIX 1.2.6 (安定版) IBM Informix INFORMIX 用 PDO ドライバーデータベース
PDO_MYSQL 1.0 .2 (安定版) PDO用MySQLドライバー
PDO_OCI 1.0 (安定版) PDO用Oracle Call Interfaceドライバー
PDO_ODBC 1.0.1 (安定版) PDO用ODBC v3インターフェースドライバー
PDO_PGSQL 1.0.2 (安定版) PostgreSQLドライバーPDO
PDO_SQLITE 1.0 .1 (安定版) SQLite v3 PDO
用のインターフェースドライバー pdo_user 0.3.0 (ベータ版) PDO

用のユーザースペースドライバー PECL を通じてインストールすると、次の方法でデータベースを操作できます:
コードは次のとおりです。 :

$dsn = "mysql:host=$db_host;dbname=$db_name";
$dbh = 新しい PDO($dsn, $db_user, $db_password);
$sql = "SELECT `name `, `location` FROM `users` WHERE `location` = ? , `name` = ?";
$sth = $dbh->prepare($sql);
$sth->execute(array($location) , $ name));
$result = $sth->fetch(PDO::FETCH_OBJ);
echo $result->gt;location;
$dbh = NULL;
?>

zar PDO のコードは短くないようですが、どのような利点がありますか?
1. PDO がデータベースに接続するとき、接続文字列を使用して接続するデータベースを決定します。
2. PDO は PDO::setAttribute を使用して、永続的な接続などの接続設定とエラー (例外、E_WARNING、NULL) を返す方法を決定できます。返されるフィールド名の場合も…など。
2. PDO は、基本的な準備と実行に加えて、列のバインド機能をサポートし、列のタイプを指定することもできます。
4. PDO は抽象化レイヤーであるため、記憶媒体を変更した場合でも、それに比べて必要な労力は最小限です。
残念ながら、これらは長い間存在していたにもかかわらず、まだ十分に普及していません。市販の本を読み慣れているせいもあると思いますが、その本では最もシンプルで伝統的な方法しか紹介されていないことが多いです。その結果、多くの人が依然として MySQL を使用してデータベースに直接接続しています。
ただし、現時点では個人的には、ActiveRecord や Propel ORM (オブジェクト リレーショナル マッピング) などの DBI を介してデータベースに接続することを好みます。
例えばActiveRecordを例に挙げると、このようなSQL文を実装したい場合…
INSERT INTO `users` (id, name, 性別, location) VALUES(1, 'roga', 'male', ' tpe')
PDO を使用して記述します:
コードは次のとおりです:

$sql = "INSERT INTO `users` (id, name, sex, location) VALUES(?, ?, ?, ? )";
$sth = $ dbh->prepare($sql);
$sth->execute(array(1, 'roga', 'male', 'tpe'));
?>

しかし、ActiveRecord に関して言えば、Yes:
コードは次のとおりです:

$user = new User();
$user->id = 1;
$user->name = ' roga';
$user->gender = 'male';
$user->location = 'tpe';
$user->save();
?>

後者の方がずっと簡単ではないでしょうかまた、SQL 言語への依存の必要性も大幅に軽減されます。 (さまざまなデータベースでの SQL 実装に関する質問については、「さまざまな SQL 実装の比較」を参照してください。) 上記は簡単な説明です。省略や誤りがある場合は、追加してください。



mysqlは非永続接続機能、mysqliは永続接続機能です。つまり、
mysql は接続されるたびに接続プロセスを開き、mysqli を複数回実行すると同じ接続プロセスが使用されるため、サーバーのオーバーヘッドが軽減されます。
プログラミング時に new mysqli('localhost', usenamer' を使用する人もいます)。 , 'password', 'databasename'); は常にエラーを報告します。致命的なエラー: クラス 'mysqli' が d: に見つかりません... mysqli クラスは PHP に含まれていませんか?
Win では、php.ini を変更し、php_mysqli.dll の前の「;」を削除する必要があります。Linux では、mysqli をコンパイルする必要があります。
1: Mysqli.dll を使用すると、データベースをオブジェクトまたはプロセス内で操作でき、その使用も非常に簡単です。ここでは、いくつかの一般的な操作と mysql.dll の比較を示します。
1: mysql.dll (機能的な方法として理解できます):
コードは次のとおりです:

$conn = mysql_connect('localhost', 'user', 'password') //mysqlデータベースに接続します。
mysql_select_db('data_base '); //データベースを選択します

$result = mysql_query('select * from data_base');//オープン接続を指定するための 2 番目のオプションのパラメータがあります
$row = mysql_fetch_row( $result ) ) // Simple の場合、ここでは 1 行のデータのみを取得します
Echo $row[0]; // 最初のフィールドの値を出力します

Mysqli にも手続き型メソッドがありますが、それは mysqli プレフィックスで始まるだけです。それ以外はほぼ同じです。 mysqli が手続き型で動作する場合、一部の関数は mysqli_query (リソース識別子、SQL ステートメント) などのリソースを指定する必要があり、リソース識別子のパラメーターは前に配置されますが、mysql_query (SQL ステートメント、「オプション」) のパラメーターは前に配置されます。リソース識別子は最後に配置され、デフォルトで最後に開かれた接続またはリソースになります。
2mysqli.dll (オブジェクトモード):
コードは次のとおりです:

$conn = new mysqli('localhost', 'user', 'password','data_base');
//ここでの接続は新しいです、そして最後に 1 つのパラメータはデータベースを直接指定するもので、mysql_select_db() は必要ありません
//構築時に指定することもできません、その場合は $conn ->('data_base')
$result = $conn -> query( 'select * from data_base ' );
$row = $result -> fetch_row(); //データの行を取得します
echo row[0] //最初のフィールドの値を出力します

2: mysql_fetch_row(),mysql_fetch_array()
このどちらの関数も配列を返します。違いは、最初の関数によって返される配列には、配列の添字 $row[0],
$row[1] を使用したデータのみが含まれることです。 . 、そして mysql_fetch_array() によって返される配列には、キーと値のペアの最初のタイプと形式の両方が含まれています。 (データベースのフィールドがユーザー名、パスワードの場合):
$row[ 'username'], $row['passwd']
さらに、($row as $kay => $value)で操作すると、データベースのフィールド名を直接取得することもできます。
さらに重要なのは、mysqli が php5 によって提供される新しい関数ライブラリであり、その実行速度が向上しているということです。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

CakePHP プロジェクトの構成 CakePHP プロジェクトの構成 Sep 10, 2024 pm 05:25 PM

この章では、CakePHP の環境変数、一般設定、データベース設定、電子メール設定について理解します。

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

CakePHP の日付と時刻 CakePHP の日付と時刻 Sep 10, 2024 pm 05:27 PM

Cakephp4 で日付と時刻を操作するには、利用可能な FrozenTime クラスを利用します。

CakePHP ファイルのアップロード CakePHP ファイルのアップロード Sep 10, 2024 pm 05:27 PM

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

CakePHP ルーティング CakePHP ルーティング Sep 10, 2024 pm 05:25 PM

この章では、ルーティングに関連する次のトピックを学習します。

CakePHP について話し合う CakePHP について話し合う Sep 10, 2024 pm 05:28 PM

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

CakePHP バリデータの作成 CakePHP バリデータの作成 Sep 10, 2024 pm 05:26 PM

Validator は、コントローラーに次の 2 行を追加することで作成できます。

See all articles