13,005
回編集
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]] |