MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
PHPとデータベース - MySQLのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
PHPとデータベース - MySQL
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == PHPにおいて、MySQLへの接続とCRUDの手順を記載する。<br> <br><br> == MySQLの接続・切断 == ==== MySQLの接続 ==== MySQLへ接続するには、<code>mysqli_connect</code>関数を使用する。<br> <br> resource mysqli_connect(string host, string username, string passwd, string dbname [, int port [, string socket ]]) MySQLサーバへ接続または再利用する。 引数: host 接続先のMySQLサーバを指定する。 <ホスト名またはIPアドレス>:<ポート番号>のように、ポート番号を指定することが可能であり、 ホスト名またはIPアドレスでは、:/path/to/socketのようにソケットへのパスを指定することも可能である。 <ホスト名またはIPアドレス>または<ホスト名またはIPアドレス>:<ポート番号>を指定する場合、 MySQLクライアントライブラリはそれをオーバーライドして、ローカルソケット(Windowsでは名前付きパイプ)に接続する。 username ユーザ名 password パスワード dbname 接続するデータベース名を指定する。 port 接続するMySQLサーバーのポート番号を指定する。 socket 使用するソケットを指定する。 戻り値: MySQLサーバへの接続オブジェクトを返す。 <br> 以下の例では、MySQLサーバへ接続している。<br> <syntaxhighlight lang="php"> <?php // データベースへの接続に必要な変数を指定 $host = 'localhost'; // 以下の指定方法も可能 // localhost:3307(ホスト名とポート番号) // 127.0.0.1:3307(IPアドレスとポート番号) // /tmp/mysql(ソケットのみ) $username = 'root'; $passwd = 'root'; $dbname = 'mydb'; // データベースへ接続 $link = mysqli_connect($host, $username, $passwd, $dbname); // 接続チェック if(!$link) { die('データベースの接続に失敗しました。'); } echo "データベースの接続に成功しました! \n"; // データベースの接続を閉じる mysqli_close($link); ?> </syntaxhighlight> <br><br> ==== MySQLの切断 ==== MySQLへの接続を切断するには、<code>mysqli_close</code>関数を使用する。<br> <br> bool mysqli_close(mysqli link_identifier]) link_identifierが指すMySQLへの非持続的リンクを閉じる。 link_identifierを省略する場合、最後に開いたリンクが使用される。 持続的ではないリンクは、スクリプトの実行終了時に自動的に閉じるため、通常は、mysql_close関数は不要である。 引数: link_identifier mysqli_connect関数の戻り値のリンクIDを指定する。 戻り値: MySQLの切断に成功する場合はtrue、失敗する場合はfalseを返す。 <br> 以下の例では、MySQLへの接続を明示的に切断している。<br> <syntaxhighlight lang="php"> $host = 'localhost'; $username = 'root'; $passwd = 'root'; $dbname = 'mydb'; // データベースへ接続 $link = mysqli_connect($host, $username, $passwd, $dbname); // ...MySQLのCRUD処理 mysqli_close($link); </syntaxhighlight> <br><br> ==== エラー処理 ==== MySQLに対する処理でエラーが発生する場合、<code>mysqli_error</code>関数を使用して、エラーメッセージを取得することができる。<br> <br> string mysqli_error(mysqli link_identifier]) 直近のMySQL関数からのエラー文字列を返す。 MySQLのバックエンドのエラーは警告が発生しないため、 代わりに、mysqli_error関数を使用してエラー文字列を取得する。 引数: link_identifier MySQLのリンクID 戻り値: 直近のMySQL関数からのエラー文字列を返す。 エラーが発生していない場合は、空文字列を返す。 <br> 以下の例では、mysqli_connect関数でエラーが発生した場合にエラーメッセージを取得している。<br> <syntaxhighlight lang="php"> $host = 'localhost'; $username = 'root'; $passwd = 'root'; $dbname = 'mydb'; // データベースへ接続 $link = mysqli_connect($host, $username, $passwd, $dbname); if(!$link) { print(mysqli_error()); } // ...MySQLに対するCRUD処理 mysqli_close($link); </syntaxhighlight> <br> MySQLの接続に失敗する場合、その後のMySQLに対する処理を実行できないため、<br> exit関数またはdie関数を使用して、プログラムを終了する。<br> exit関数およびdie関数の詳細は、[[PHPの基礎 - PHPの終了処理]]を参照すること。<br> <syntaxhighlight lang="php"> $host = 'localhost'; $username = 'root'; $passwd = 'root'; $dbname = 'mydb'; // データベースへ接続 $link = mysqli_connect($host, $username, $passwd, $dbname); if(!$link) { die('接続失敗です。'.mysqli_error()); } // ...MySQLに対するCRUD処理 mysqli_close($link); </syntaxhighlight> <br> 以下の例では、MySQLの接続と切断を実行している。<br> <syntaxhighlight lang="php"> <?php $host = 'localhost'; $username = 'root'; $passwd = 'root'; $dbname = 'mydb'; // データベースへ接続 $link = mysqli_connect($host, $username, $passwd, $dbname); if(!$link) { die('接続失敗です。'.mysqli_error()); } print('<p>接続に成功しました。</p>'); // ...MySQLに対するCRUD処理 $close_flag = mysqli_close($link); if($close_flag) { print('<p>切断に成功しました。</p>'); } ?> </syntaxhighlight> <br><br> == データベースの選択 == MySQLへ接続後、データベースを選択するには、<code>mysqli_select_db</code>関数を使用する。<br> <br> bool mysqli_select_db(mysqli link_identifier, string dbname) データベース名を指定して、アクティブなデータベースに設定する。 それ以降に実行するmysqli_query関数は、全てアクティブなデータベース上で実行される。 link_identifierを指定しない場合は、直近に接続したリンクを指定したとみなされる。 mysqli_select_db関数は、接続のデフォルトデータベースを変更する際にのみ使用する。 デフォルトデータベースは、mysqli_connect関数の第4引数でも指定できる。 引数: link_identifier MySQLのリンクID database_name アクティブにするデータベース名 戻り値: 成功した場合はtrue、失敗する場合はfalseを返す。 <br> SELECT文等のクエリを発行する場合は、アクティブなデータベースに対して実行されるため、<br> クエリを発行する前に、データベース名を指定してデータベースを選択する必要がある。<br> <br> また、存在しないデータベースを選択する場合、以下のようなエラーが表示される。<br> Access denied for user '<ユーザ名>'@'<ホスト名またはIPアドレス>' to databese '<データベース名>' <br> <syntaxhighlight lang="php"> <?php $link = mysqli_connect('localhost', 'user', 'pass', 'my_db'); if(!$link) { die('接続失敗です。'.mysqli_error()); } print('<p>接続に成功しました。</p>'); // 現在のデフォルトデータベース名を返す if($result = mysqli_query($link, "SELECT DATABASE()")) { $row = mysqli_fetch_row($result); printf("Default database is %s.\n", $row[0]); mysqli_free_result($result); } // データベースをworldに変更する $db_selected = mysqli_select_db($link, "world"); if(!$db_selected) { die('データベース選択失敗です。'.mysql_error()); } print('<p>uriageデータベースを選択しました。</p>'); // ...MySQLに対するCRUD処理 $close_flag = mysqli_close($link); if($close_flag) { print('<p>切断に成功しました。</p>'); } ?> </syntaxhighlight> <br><br> == データの取得(SELECT文) == クエリを発行するには、<code>mysqli_query</code>関数を使用する。<br> <u>SQL文の最後にセミコロン(;)を付加してはならないことに注意すること。</u><br> <br> mixed mysqli_query(mysqli link, string query [, int resultmode]) 指定したクエリを発行する。 引数: query 発行するクエリを記述したSQL。 クエリ文字列は、セミコロンを付加してはならない。 link_identifier MySQLのリンクID 戻り値: 成功した場合はtrue、失敗する場合はfalseを返す。 SELECT、SHOW、DESCRIBE、EXPLAINの場合は、mysqli_query関数は結果オブジェクトを返す。 <br> 以下の例では、一時テーブルを作成して、レコードを10行取得している。<br> <syntaxhighlight lang="php"> <?php $link = mysqli_connect("localhost", "my_user", "my_password", "my_db"); // 接続状況の確認 if(mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit(); } // 一時テーブルの作成(結果セットを返さない) if(mysqli_query($link, "CREATE TEMPORARY TABLE myCity LIKE City") === TRUE) { printf("Table myCity successfully created.\n"); } // SELECT文の実行(結果セットを返す) if($result = mysqli_query($link, "SELECT Name FROM City LIMIT 10")) { printf("Select returned %d rows.\n", mysqli_num_rows($result)); // 結果セットを開放する mysqli_free_result($result); } // 大量のデータを取得する場合、MYSQLI_USE_RESULTを使用する if($result = mysqli_query($link, "SELECT * FROM City", MYSQLI_USE_RESULT)) { // この結果セットが閉じるまで、サーバとやりとりする関数は一切実行できないことに注意する // もし、関数を実行した時、out of syncエラーが発生する if(!mysqli_query($link, "SET @a:='this will not work'")) { printf("Error: %s\n", mysqli_error($link)); } // 結果セットを開放する mysqli_free_result($result); } mysqli_close($link); ?> </syntaxhighlight> <br> SELECT文は、テーブルから条件に合うレコードに含まれる指定フィールドの値を取得するものである。<br> したがって、結果として、複数のカラムの値が複数のレコード数だけ取得できる。<br> <br> 結果セットから実際のデータを取得するには、<code>mysqli_fetch_assoc</code>関数を使用する。<br> array mysqli_fetch_assoc(mysqli_result result) mysqli_fetch_assoc関数は、取得した結果セットの最初のレコードの値を、連想配列で取得する。 連想配列のキーは、結果セットのカラムを表す。 mysqli_fetch_assoc関数の実行後、レコードは1行進む。 もし、2つ以上のカラムが同じフィールド名であった場合、最後に現れたカラムが優先され、以前のデータを上書きする。 同名の複数のカラムにアクセスする場合、mysqli_fetch_row関数を使用して数値添字配列を使用するか、カラム名にエイリアスを指定する。 注意 この関数により返されるフィー ルド名は、大文字・小文字を区別する。 カラムの値がNULLの場合、PHPのNULL値が代入される。 引数: result クエリを発行して取得した出力セットの値 戻り値: 取得したレコードにおいて、カラム名と値に対応する連想配列を返す。 結果セットの全てのレコードを取得した場合は、NULLを返す。 <br> SELECT文の出力結果には、複数のレコードが含まれる。<br> 出力結果のレコードに対するカーソルがあり(最初は先頭の行を指す)、<code>mysqli_fetch_assoc</code>関数を実行する時、<br> カーソルがあるレコードに対する処理が行われて、処理が終わればカーソルは自動的に次のレコードに移る。<br> そのため、<code>mysqli_fetch_assoc</code>関数を連続して実行することにより、出力結果に含まれる全てのレコードに対する処理が実行できる。<br> <br> <code>mysqli_fetch_assoc</code>関数では、現在、カーソルがあるレコードの各カラムの値を連想配列の形にして返す。<br> <br> 例えば、SELECT id, name from T_SampleのようなSELECT文を実行する場合、<br> 以下のように記述することで、現在のレコードの各カラムの値を取得できる。<br> <syntaxhighlight lang="php"> $result = mysqli_query($link, 'SELECT id, name from T_Sample'); $row = mysqli_fetch_assoc($result); print($row['id']); print($row['name']); </syntaxhighlight> <br> クエリの出力結果に含まれる全てのレコードを取得するには、以下のように記述する。<br> <syntaxhighlight lang="php"> $result = mysqli_query($link, 'SELECT id, name from T_Sample'); while($row = mysqli_fetch_assoc($result)) { print($row['id']); print($row['name']); } </syntaxhighlight> <br> 以下の例では、データベースuriageのテーブルshouhinから該当する全てのレコードを取得している。<br> <syntaxhighlight lang="php"> <?php $link = mysqli_connect('localhost', 'user', 'passwd', 'my_db'); if(!$link) { die('接続失敗です。'.mysqli_error()); } print('<p>接続に成功しました。</p>'); $db_selected = mysqli_select_db($link, 'uriage'); if(!$db_selected) { die('データベースの選択に失敗しました。'.mysqli_error()); } print('<p>uriageデータベースを選択しました。</p>'); // 文字コードをutf8mb4 に変更 if(!mysqli_set_charset($link, "utf8mb4")) { printf('文字コードの変更に失敗しました。'.mysqli_error($link)); exit(); } $result = mysqli_query($link, 'SELECT id,name FROM shouhin'); if(!$result) { die('クエリが失敗しました。'.mysqli_error()); } while($row = mysqli_fetch_assoc($result)) { print('<p>'); print('id='.$row['id']); print(',name='.$row['name']); print('</p>'); } $close_flag = mysqli_close($link); if($close_flag) { print('<p>切断に成功しました。</p>'); } ?> </syntaxhighlight> <br> <u>※注意</u><br> <u>MySQLの設定によっては文字化けを引き起こすため、SELECT文等の出力結果を取得する前に、</u><br> <u><code>mysqli_set_charset('utf8mb4');</code>等を実行して、MySQLのクライアントの文字コードを変更すること。</u><br> <br><br> == データの追加(INSERT) == INSERT文の場合、<code>mysqli_query</code>関数の出力結果において、成功する場合はtrue、失敗する場合はfalseを返す。<br> <br> 以下の例では、データベースuriageのテーブルshouhinにレコードを挿入している。<br> <syntaxhighlight lang="php"> <?php $link = mysqli_connect('localhost', 'user', 'passwd', 'my_db'); if(!$link) { die('接続失敗です。'.mysql_error()); } print('<p>接続に成功しました。</p>'); $db_selected = mysqli_select_db($link, 'uriage'); if(!$db_selected) { die('データベース選択失敗です。'.mysql_error()); } print('<p>uriageデータベースを選択しました。</p>'); // 文字コードをutf8mb4 に変更 if(!mysqli_set_charset($link, "utf8mb4")) { printf('文字コードの変更に失敗しました。'.mysqli_error($link)); exit(); } print('<p>データを追加します。</p>'); $sql = "INSERT INTO shouhin(id, name) VALUES(4, 'プリンター')"; $result_flag = mysqli_query($link, $sql); if(!$result_flag) { die('INSERTクエリが失敗しました。'.mysql_error()); } print('<p>追加後のデータを取得します。</p>'); $result = mysqli_query($link, 'SELECT id, name FROM shouhin LIMIT 10 ORDER BY id'); if(!$result) { die('SELECTクエリが失敗しました。'.mysql_error()); } while($row = mysqli_fetch_assoc($result)) { print('<p>'); print('id='.$row['id']); print(',name='.$row['name']); print('</p>'); } $close_flag = mysqli_close($link); if($close_flag) { print('<p>切断に成功しました。</p>'); } ?> </syntaxhighlight> <br><br> __FORCETOC__ [[カテゴリ:Web]]
PHPとデータベース - MySQL
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse