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

PHP における mysql と mysqli の違い

巴扎黑
巴扎黑オリジナル
2016-11-23 15:05:39849ブラウズ

その 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 までご連絡ください。