「PHPとデータベース - MySQL」の版間の差分

ナビゲーションに移動 検索に移動
240行目: 240行目:
  ?>
  ?>
  </syntaxhighlight>
  </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>
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:Web]]
[[カテゴリ:Web]]

案内メニュー