データベースMySQL関数(クエリ)
- mysql_query〔MySQLクエリ送信〕
- mysql_unbuffered_query〔MySQLにクエリ送信するが、結果に対してのフェッチやバッファリングは行わない〕
- mysql_free_result〔結果IDのメモリを開放〕
- mysql_result〔結果データを取得〕
- mysql_num_fields〔結果のフィールド数を取得〕
- mysql_num_rows〔結果の行数を取得〕
- mysql_data_seek〔内部的な結果ポインタを移動〕
- mysql_affected_rows〔直近のクエリで変更された行の数を取得〕
mysql_query
MySQLクエリ送信
unknown
接続IDで指定されたサーバー上にある現在アクティブなデータベースにクエリを送信します。
-
SQL文が、SELECT文/SHOW文/DESCRIBE文/EXPLAIN文の場合は、成功した場合に結果IDを返し、失敗した場合にFALSEを返します。 返り値の結果IDは、mysql_result()関数やmysql_num_rows()関数などの引数になります。
-
それ以外のSQL文(UPDATE文/DELETE文/DROP文など)の場合は、成功した場合にTRUE、失敗した場合にFALSEを返します。
- SQL文の末尾にセミンコロンを付けないように。
- 以下の場合にも、FALSEが返されます。
- SQL文が参照するテーブルにアクセスする権限がない場合。
- SQL文の文法が間違っている場合。
返り値の結果IDにアクセスするには、mysql_fetch_array()関数などの関数に返り値を渡します。
例えば・・・
SELECT文によって返された行数を取得するには、mysql_num_rows()関数を使用します。
DELTE、INSERT、REPLACE、UPDATE文で変更された行数を取得するには、mysql_affected_rows()関数を使用します。
結果処理を終えた後、結果を保持する結果IDを、mysql_free_result()関数で解放することもできます。
オプションの第2引数接続IDが指定されていない場合は、mysql_connect()関数により直近に開かれた接続が使用されます。 接続が確立されていない場合は、引数を指定せずmysql_connect()関数がコールされた時と同様に接続を確立します。 それでも接続が確立できない場合は、E_WARNINGレベルのエラーが発生します。
<?
$dbc=mysql_connect("localhost","root","") or die("MySQL接続失敗: ".mysql_error());
mysql_select_db("db_customer") or die("データベース選択失敗: ".mysql_error());
/* ユーザーが指定した値と仮定 */
$firstname='paul';
$lastname='smith';
/* SQL文生成(末尾にセミコロンをつけないように!)*/
$sql=sprintf(
"SELECTd id, firstname, lastname,age FROM tbl_customer WHERE firstname='%s' AND lastname='%s'",
mysql_real_escape_string($firstname),
mysql_real_escape_string($lastname)
);
//SELECT firstname, lastname, age FROM tbl_customer WHERE firstname='paul' AND lastname='smith'
/* クエリ送信 */
$res=mysql_query($sql,$dbc) or die("クエリ失敗: ".mysql_error());
/* 結果ID($res)は、そのまま出力してもリソース内部の情報にはアクセスできません
そのため結果IDに、mysql_fetch_array()関数などのMySQL関数に渡します */
while($dat=mysql_fetch_array($res, MYSQL_NUM)){
printf("id:%s Name: %s %s Age: %s<br>\n", $dat[0], $dat[1], $dat[2],$dat[3]);
//id:2 Name: paul smith Age: 22
}
?>
mysql_unbuffered_query
MySQLにクエリ送信するが、結果に対してのフェッチやバッファリングは行わない
unknown
MySQLにクエリを送信しますが、その際mysql_query()関数が行っているような自動バッファリングを行いません。 そのため、クエリ送信にかかるメモリ消費が抑えられます。 また、SQL文の処理が終るのを待たずに、最初の1行目が取得されたら直ぐに処理を始められます。
複数のデータベース接続を利用する場合には、オプションの第2引数接続IDは省略できません。
-
SQL文が、SELECT文/SHOW文/DESCRIBE文/EXPLAIN文の場合は、成功した場合に結果ID、失敗した場合にFALSEを返します。 返り値の結果IDは、mysql_result()関数やmysql_num_rows()関数などの引数になります。
-
それ以外のSQL文(UPDATE文/DELETE文/DROP文など)の場合は、成功した場合にTRUE、失敗した場合にFALSEを返します。
オプションの第2引数接続IDが指定されていない場合は、mysql_connect()関数により直近に開かれた接続が使用されます。 接続が確立されていない場合は、引数を指定せずmysql_connect()関数がコールされた時と同様に接続を確立します。 それでも接続が確立できない場合は、E_WARNINGレベルのエラーが発生します。
この関数から返される結果IDには、mysql_num_rows()関数やmysql_data_seek()関数が使用できません。 また結果の行を全てフェッチするまで、MySQLに新しいクエリ送信をすることもできませんので注意して下さい。
<?
$dbc=mysql_connect("localhost","root","") or die("MySQL接続失敗: ".mysql_error());
mysql_select_db("db_customer") or die("データベース選択失敗: ".mysql_error());
$query="SELECT * FROM tbl_customer";
$sql="CREATE TEMPORARY TABLE MyQuery ".$query;
if(mysql_query($sql,$dbc)){
$numRows=mysql_affected_rows();
if($numRows==0){
/* handle empty selection */
}else{
$res=mysql_unbuffered_query("SELECT * FROM MyQuery");
while($dat=mysql_fetch_array($res)){
printf("id: %s Name: %s %s Age: %s",$dat[0],$dat[1],$dat[2],$dat[3]."<br>\n");
}
}
mysql_query('DROP TABLE MyQuery');
}else{
die("クエリ失敗: ".mysql_error());
}
/* 出力例
id: 1 Name: ana sui Age: 33
id: 2 Name: paul smith Age: 22
id: 3 Name: tom cruise Age: 43
*/
?>
mysql_free_result
結果IDのメモリを開放
unknown
結果IDに関する全てのメモリを解放します。 成功した場合にTRUE、失敗した場合にFALSEを返します。
第1引数の結果IDは、mysql_query()関数の返り値です。 指定した結果IDがリソース型でない場合には、E_WARNINGレベルのエラーが発生します。
mysql_query()関数がリソースを返すのは、SELECT、SHOW、EXPLAIN、DESCRIBE文の場合だけです。それ以外のSQL文の場合は真偽値が返るので注意して下さい。
指定した結果IDに関する全てのメモリはスクリプト実行時に自動的に開放されるため、通常の処理では使用する必要はありません。 スクリプト実行のメモリ消費が大きすぎると懸念される場合に使用して下さい。
<?
$dbc=mysql_connect("localhost", "root", "") or die("MySQL接続失敗: ".mysql_error());
mysql_select_db("db_customer") or die("データベース選択失敗: ".mysql_error());
$sql="SELECT age FROM tbl_customer WHERE firstname='ana' AND lastname='sui'";
$res=mysql_query($sql, $dbc) or die("クエリ失敗: ".mysql_error());
/* 結果IDの利用(ここでは、その後結果を利用したものと仮定) */
$dat=mysql_fetch_assoc($res);
/* 結果IDを開放し、さらにスクリプトの処理を進める */
mysql_free_result($res);
echo "年齢は".$dat['age']."歳です<br>"; //年齢は33歳です
?>
mysql_result
結果データを取得
unknown
結果IDから、1つの節の内容を取得します。 第1引数の結果IDは、mysql_query()関数の返り値です。 成功した場合に結果IDの1つの説の内容を返し、失敗した場合にFALSEを返します。
第2引数行は、結果から取得する行番号(0始まり)です。
オプションの第2引数フィールドは、取得したいフィールド名またはフィールドのオフセット数値を指定します。
- 大量の結果IDで作業を行う場合は、この関数ではなく行全体を取り込む関数(フェッチ関数)を使用しましょう。 1回の関数コールで複数セルの内容を返すので高速です。
- オフセット数値を指定する方が、
フィールド名
やテーブル名.フィールド名
のように指定するよりもかなり高速です。 - この関数は、結果IDを処理する他の関数との同時に使用することはできません。
<?
$dbc=mysql_connect("localhost", "root", "") or die("MySQL接続失敗: ".mysql_error());
mysql_select_db("db_customer") or die("データベース選択失敗: ".mysql_error());
$sql="SELECT firstname FROM tbl_customer";
$res=mysql_query($sql, $dbc) or die("クエリ失敗: ".mysql_error());
/* 2番目の節の内容を取得(0始まりのためオフセットには1を指定) */
echo mysql_result($res,1); //paul
?>
<?
$dbc=mysql_connect("localhost", "root", "") or die("MySQL接続失敗: ".mysql_error());
mysql_select_db("db_customer") or die("データベース選択失敗: ".mysql_error());
$sql="SELECT id, firstname, lastname FROM tbl_customer";
$res=mysql_query($sql, $dbc) or die("クエリ失敗: ".mysql_error());
/* 結果の行数を取得 */
$num_rows=mysql_num_rows($res);
echo "<table border='1'>\n";
if($num_rows>0){
/* 表頭生成 */
echo "<tr>";
for($i=0; $i<mysql_num_fields($res); $i++){
echo "<td align=nter>".mysql_field_name($res, $i)."</td>";
}
echo "</tr>\n";
/* データ部分生成 */
for($i=0; $i<$num_rows; $i++){
echo "<tr>";
for($j=0; $j<mysql_num_fields($res); $j++){
echo "<td>".mysql_result($res, $i, $j)."</td>";
}
echo "</tr>\n";
}
}
echo "</table>\n";
/* 出力例
<table border='1'>
<tr><td align=nter>id</td><td align=nter>firstname</td><td align=nter>lastname</td></tr>
<tr><td>1</td><td>ana</td><td>sui</td></tr>
21:04 2006/10/29<tr><td>2</td><td>paul</td><td>smith</td></tr>
<tr><td>3</td><td>tom</td><td>cruise</td></tr>
</table>
*/
?>
mysql_num_fields
結果のフィールド数を取得
unknown
結果IDにおけるフィールド数を取得します。 成功した場合に結果IDのフィールド数、失敗した場合にFALSEを返します。 第1引数の結果IDは、mysql_query()関数の返り値です。
<?
$dbc=mysql_connect("localhost", "root", "") or die("MySQL接続失敗: ".mysql_error());
mysql_select_db("db_customer") or die("データベース選択失敗: ".mysql_error());
$sql="SELECT * FROM tbl_customer";
$res=mysql_query($sql, $dbc) or die("クエリ失敗: ".mysql_error());
/* 結果のフィールド名を取得 */
for($i=0; $i<mysql_num_fields($res); $i++){
echo mysql_field_name($res, $i)."<br>\n";
}
/* 結果のフィールド数を取得 */
$res=mysql_query("DESCRIBE tbl_customer");
$numFields = mysql_num_rows($res);
echo $numFields."件<br>\n";
/* 出力例
id
firstname
lastname
age
4件
*/
?>
mysql_num_rows
結果の行数を取得
unknown
結果IDにおける行数を取得します。 成功した場合に結果IDの行数、失敗した場合にFALSEを返します。 第1引数の結果IDは、mysql_query()関数の返り値です。
この関数は、SELECT文でしか使用できません。 INSERT文/UPDATE文/DELETE文で変更された行数を取得するには、mysql_affected_rows()関数を使用して下さい。
<?
$dbc=mysql_connect("localhost", "root", "") or die("MySQL接続失敗: ".mysql_error());
mysql_select_db("db_customer") or die("データベース選択失敗: ".mysql_error());
$sql="SELECT * FROM tbl_customer";
$res=mysql_query($sql, $dbc) or die("クエリ失敗: ".mysql_error());
/* 結果の行数取得 */
$numRows=mysql_num_rows($res) or die("行数取得失敗: ".mysql_error());
echo $numRows."行<br>\n";
?>
<?
#mysql_num_rows()関数を使用せずに、結果の行数を取得
$dbc=mysql_connect("localhost", "root", "") or die("MySQL接続失敗: ".mysql_error());
mysql_select_db("db_customer") or die("データベース選択失敗: ".mysql_error());
/* count()を使用して行数を取得 */
$sql="SELECT count(*) AS TOTAL FROM tbl_customer LIMIT 3";
$res=mysql_query($sql, $dbc) or die("クエリ失敗: ".mysql_error());
echo mysql_result($res, 0, "TOTAL")." 行<br>\n";
?>
<?
#例:テーブルの行数を比較
$dbc=mysql_connect("localhost", "root", "") or die("MySQL接続失敗: ".mysql_error());
mysql_select_db("db_customer") or die("データベース選択失敗: ".mysql_error());
/* 各テーブルの行数を取得 */
$res1=mysql_query("SELECT * FROM tbl_customer");
$res2=mysql_query("SELECT * FROM tbl_customer");
/* 行数を比較 */
if(mysql_num_rows($res1)==mysql_num_rows($res2)){
echo "table1 and table2 is same.";
}elseif(mysql_num_rows($res1) > mysql_num_rows($res2)){
echo "table1 is large.<br>";
}else{
echo "table2 is large.<br>";
}
?>
mysql_data_seek
内部的な結果ポインタを移動
unknown
指定した結果IDが指す、内部的な結果ポインタが指定した行数(row_number)を指すように移動します。 成功した場合にTRUE、失敗した場合にFALSEを返します。 行番号は0始まり。
<?
#Sample1
$dbc=mysql_connect("localhost", "root", "") or die("MySQL接続失敗: ".mysql_error());
mysql_select_db("db_customer") or die("データベース選択失敗: ".mysql_error());
$sql="SELECT id, firstname, lastname FROM tbl_customer";
$res=mysql_query($sql, $dbc) or die("クエリ失敗: ".mysql_error());
/* 節の内容を取得して出力(オフセットは0始まり) */
for($i=0; $i<=2; $i++){
echo mysql_result($res, $i, "firstname")."<br>";
}
/* 内部ポインタを先頭に戻す */
mysql_data_seek($res, 0);
while($dat=mysql_fetch_array($res)){
echo $dat["firstname"]."<br>";
}
/* 出力例
ana
paul
tom
ana
paul
tom
*/
?>
<?
#Sample2
$dbc=mysql_connect("localhost", "root", "") or die("MySQL接続失敗: ".mysql_error());
mysql_select_db("db_customer") or die("データベース選択失敗: ".mysql_error());
$sql="SELECT id, firstname, lastname FROM tbl_customer";
$res=mysql_query($sql, $dbc) or die("クエリ失敗: ".mysql_error());
/* 結果の行数を取得 */
$max=mysql_num_rows($res)-1;
/* 結果の利用 */
for($i=$max; $i>=0; $i--){
/* 内部的な結果ポインタ移動 */
if(!mysql_data_seek($res, $i)){
echo "Cannot seek to row $i<br>\n"; /* 移動できなかった無効な行番号を出力 */
continue;
}
/* 結果をオブジェクトとして取得し、出力 */
$dat=mysql_fetch_object($res);
if(!$dat) continue;
echo "$dat->firstname $dat->lastname<br>\n";
}
/* 出力例
tom cruise
paul smith
ana sui
*/
?>
mysql_affected_rows
直近のクエリで変更された行の数を取得
unknown
指定した接続IDが指すサーバにおいて直近のINSERT文/UPDATE文/DELETE文よって変更された行数を取得します。 成功した場合に変更された行数を返し、失敗した場合に-1を返します。
この関数は、レコードを修正する文でしか使用できません。 SELCT文を使用する場合は、mysql_num_rows()関数を使用して下さい。
オプションの第1引数接続IDが指定されていない場合は、mysql_connect()関数により直近に開かれた接続が使用されます。 接続が確立されていない場合は、引数を指定せずmysql_connect()関数がコールされた時と同様に接続を確立します。 それでも接続が確立できない場合は、E_WARNINGレベルのエラーが発生します。
-
直近のSQL文がWHERE句を含まないDELETE文だった場合、テーブルから全レコードが削除されますが、MySQL4.1.2以前のバージョンでは0が返ります。
-
UPDATE文を使用する場合、MySQLでは新旧の値が同じ場合には更新処理が行われません。 そのため、必ずしもこの関数が返す値がマッチする行数と一致するとは限りません。 返り値は、実際に更新処理が行われた行数であることに注意して下さい。
-
REPLACE文を使用する場合、まず最初に同じ主キーのレコードを削除した後に新しいレコードを挿入します。 返り値は、「削除された行数」+「挿入された行数」となります。
<?
$dbc=mysql_connect("localhost", "root", "") or die("MySQL接続失敗: ".mysql_error());
mysql_select_db("db_customer") or die("データベース選択失敗: ".mysql_error());
/* 削除されたレコードの正しい数を返す */
mysql_query('DELETE FROM tbl_customer WHERE id > 3') or die("クエリ失敗: ".mysql_error());
printf("削除したレコード数: %d\n", mysql_affected_rows()."<br>");
//削除したレコード数: 2
/* 決して真にはならない WHERE条件なので、結果は0となる */
mysql_query('DELETE FROM tbl_customer WHERE 0');
printf("削除したレコード数: %d\n", mysql_affected_rows()."<br>");//削除したレコード数: 0
?>