English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
PHPから5.0からmysql(i)のサポートが追加され、新機能はすべてオブジェクトの形式で追加されています
iは改善を意味しており、機能が豊富で、効率が高く、安定しています
コンパイル時のパラメータ:
./configure --with-mysql=/usr/bin/mysql_config \ #Mysql ClientLibrary(libmysql)で構築する --with-mysqli=mysqlnd \ #Mysql Native Dirverであるmysqlndを使用する --with-pdo-mysql=mysqlnd #Mysql Native Dirverであるmysqlndを使用する
コピーライトの問題でPHPから5.3PHPがmysqlndを使用し始める
mysqlndはzend社が開発したMySQLデータベースドライバーで、元のものに比べてさまざまな面で向上しています
#mysqlndをコンパイルする
./configure --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd あなたのパラメータを追加して
mysqli プロセス、オブジェクト方式どちらもサポートされています
mysqliが提供する3つのクラス:
1、mysqli と接続関連の
2、MySQLi_Result 結果セット処理
3、mysqli_stmt プレースホルダクラス
#キャラクタセットを設定する
set_charset
#キャラクタセットを取得する
character_set_name
データベースオブジェクトを取得する
//创建mysqli对象方式 1 //接続から発生するエラーを抑制 $mysqli = new mysqli('127.0.0.1', 'root', '', 'test'); //只能用函数来判断是否连接成功 if(mysqli_connect_errno()) { echo mysqli_connect_error(); } //创建mysqli对象方式 2 一部のパラメータを設定できます $mysqli = mysqli_init(); $mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 2);//設定超時時間 $mysqli->real_connect('127.0.0.1', 'root', '', 'test');
クエリ: 失敗時はfalse、select成功時は結果セットオブジェクト、他はtrue falseでない、SQLの実行が成功したことを意味
無結果セットの例
$mysqli = mysqli_init(); $mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 2);//設定超時時間 $mysqli->real_connect('127.0.0.1', 'root', '', 'test'); $sql = "insert into limove(`name`, `order`) values('aa', 11)"; $rst = $mysqli->query($sql); $sql = "delete from limove where id = 221"; $rst = $mysqli->query($sql); if($rst === false) { ee($mysqli->errno); ee($mysqli->error); } # 影響された行数 ee($mysqli->affected_rows); # 投入されたid ee($mysqli->insert_id); ee($mysqli);
結果セットがあります
$mysqli = mysqli_init(); $mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 2);//設定超時時間 $mysqli->real_connect('127.0.0.1', 'root', '', 'test'); $sql = "select * from limove as limove_as"; $result = $mysqli->query($sql); if($result === false) { ee($mysqli->errno); ee($mysqli->error); } # 行数 ee($result->num_rows); # カラム数 ee($result->field_count); # 字段の数 ee($result->field_count); # すべての字段の情報を取得 $field_arr = $result->fetch_fields(); # 字段の指針を移動 // $result->field_seek(1); # 字段の情報を順次取得 while($field = $result->fetch_field()) { ee($field); } # レコード指針を移動 $result->data_seek(1); # すべてのデータを一度に取得 $data = $result->fetch_all(MYSQLI_ASSOC); # 結果セットを関連配列方式で取得 $data = array(); $result->data_seek(0); # 指针を先頭にリセット while($row = $result->fetch_assoc()) { $data[] = $row; } ee($data); $result->free(); $mysqli->close();
一度に複数の文を実行する multiquery (推奨しない)
無結果セット、この時 affected_rows は最後に影響を受けた行数のみを取得できます
$mysqli = mysqli_init(); $mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 2);//設定超時時間 $mysqli->real_connect('127.0.0.1', 'root', '', 'test'); $sql_arr = array( 'insert into limove(id,`name`, `order`) values(null, 1, 2)', 'insert into limove(id,`name`, `order`) values(null, 1, 222)', 'delete from limove where `order` = 2', ); $sql = implode(';', $sql_arr); $result = $mysqli->multi_query($sql); if($result === false) { ee($mysqli->errno); ee($mysqli->error); } $mysqli->close();
結果セットがあります
$mysqli = mysqli_init(); $mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 2);//設定超時時間 $mysqli->real_connect('127.0.0.1', 'root', '', 'test'); $sql_arr = array( 'show tables', 'desc select * from limove', 'show create table limove', ); $sql = implode(';', $sql_arr); $rst = $mysqli->multi_query($sql); if($rst === false) { ee($mysqli->errno); ee($mysqli->error); } do{ $result = $mysqli->store_result();#現在のカーソル位置の結果セットを取得 $data = $result->fetch_all(); ee($data); }while($mysqli->next_result());#カーソルを次の結果セットに移動 $mysqli->close();
トランザクション処理:
$mysqli=new mysqli("localhost", "root", "123456", "xsphpdb"); //トランザクション処理 $mysqli->autocommit(0); $error=true; $price=50; $sql="update zh set ye=ye-{$price} where name='zhangsan'"; $result=$mysqli->query($sql); if(!$result){ $error=false; echo "張三から振込失敗 "; }else{ if($mysqli->affected_rows==0){ $error=false; echo "張三の金額は変更されません"; }else{ echo "張三の口座から振込成功! "; } } $sql="update zh set ye=ye+{$price} where name='lisi1'"; $result=$mysqli->query($sql); if(!$result){ $error=false; echo "李四から振込失敗 "; }else{ if($mysqli->affected_rows==0){ $error=false; echo "李四の金額は変更されません"; }else{ echo "李四の口座に振込成功! "; } } if($error){ echo "振込成功!"; $mysqli->commit(); }else{ echo "振込失敗!"; $mysqli->rollback(); } $mysqli->autocommit(1); $mysqli->close();
mysqli_stmt:mysqliプレースホルダクラス(推奨):準備された文を表し、サーバー側で一度だけSQLをコンパイルします
mysqliとmysqli_resultを使って同じ機能を実現できます
利点:効率が高く、同じ文だけれどデータが異なる場合に適しています。SQLインジェクションの発生を防ぐことができます
mysqli_stmt例:非select文
require 'fns.php'; //创建mysqli对象方式 $mysqli = @new mysqli('127.0.0.1', 'root', '', 'test'); //只能用函数来判断是否连接成功 if(mysqli_connect_errno()) { echo mysqli_connect_error(); die; } $mysqli->set_charset('utf8); $sql = "insert into limove values(?, ?, ?)"; //语句一样值不相同情况 //mysqli中有直接的方法可用 $stmt = $mysqli->prepare($sql); //绑定参数 $stmt->bind_param('iss', $id, $name, $order); for($i=0;$i<5;$i++{ $id = 0; $name = 'name'; $order = mt_rand(1, 1000); $stmt->execute(); } //最后id ee($stmt->insert_id); //影响的行数 注:最后一条执行的 ee($stmt->affected_rows); //错误号 ee($stmt->errno); //错误信息 ee($stmt->error); //stmt对象中可以看到更多的信息 ee($stmt); eee($mysqli);
mysqli_stmt示例:select语句 1
require 'fns.php'; //创建mysqli对象方式 $mysqli = @new mysqli('127.0.0.1', 'root', '', 'test'); //只能用函数来判断是否连接成功 if(mysqli_connect_errno()) { echo mysqli_connect_error(); die; } $mysqli->set_charset('utf8); $sql = "select * from limove where id
以上这篇php操作mysqliデータベースの実現方法は、編集者が皆さんに提供する全ての内容です。皆様に参考になれば幸いですし、もっと応援してくれればと思います。