MySQL関数のまとめ
MySQLサーバに接続する
MySQLのクエリを実行する
文字列をエスケープする
文字セットを変更する
SELECTなどの結果セットの扱い方
複数のデータベースに接続する
[参考記事] MySQLで文字コードを指定する方法
[参考記事] 日付型のフォーマットにスラッシュを使ってはいけません(文字コードによって値が変わる)
MySQLサーバに接続する
[参考記事] MySQLサーバに接続できるかどうかを確認する
// データベースサーバへの接続を試みる if (!$con = @mysql_connect($server,DB_USERNAME,DB_PASSWORD)){ print "Can not connect Server! host or username or password is wrong"; exit; } // データベースへの接続を試みる if(!mysql_select_db(DB_DATABASE,$con)){ print "Can not connect Database! database name is wrong"; exit; }
MySQLのクエリを実行する
mysql_query(【SQL文】);
このときの戻り値は、エラーの場合、falseを返します。
成功した場合、結果セットを返すSQL文(SELECT、SHOW、DESCRIBE、EXPLAINなど)では、resource を返し、
結果セットを返さないSQL文(DELETE、INSERT、REPLACE、UPDATEなど)では、trueを返します。
エラーの場合エラーメッセージはmysql_error()、エラー番号はmysql_errno()で受け取れます。
たとえばエラーが発生した場合に処理を停止して、SQLのエラーメッセージを表示させるには次のようにします。
if(!mysql_query ($sql)){ die(mysql_errno() . ':' . mysql_error()); }
if文は、空やブランクでもfalseと同様に扱いますが、SELECT文のmysql_queryの戻り値は結果が0件であってもResource idを返すので, 次のようなコードでもSQL文でエラーが発生しない限りif文の中は通りません。
if(!$resource = mysql_query (【結果がヒットしないSELECT文】)){ die(mysql_errno() . ':' . mysql_error()); }
SELECT文によって返された行の数を知るには mysql_num_rows() を用います。
また DELETE、INSERT、REPLACEまたはUPDATE文で変更された行の数を知るには mysql_affected_rows() を用います。
INSERT文で挿入された自動採番(AUTO INCREMENT)の値を知るには mysql_insert_id() を用います。
文字列をエスケープする
INSERTやUPDATE文、WHERE句などで値をMySQLで実行できるようエスケープするにはmysql_real_escape_string()を使用します。
エスケープする関数には、ほかに mysql_escape_string()がありますが、この関数はPHP5.3.0で非推奨になっています。
mysql_real_escape_string()は現在の接続の文字セットで特殊文字をエスケープしますが、mysql_escape_string()は文字セットを考慮しません。
このためエスケープにはmysql_escape_string()ではなく、mysql_real_escape_string()を使用するようにします。
エスケープされる文字
NULL (null文字) | 0x00 |
\n LF(改行) | 0x0a |
\r CR(復帰) | 0x0d |
\ | 0x5c |
' (シングルクオート) | 0x27 |
" (ダブルクオート) | 0x22 |
SUB (置換) | 0x1a |
LIKE演算子での『 % 』や『 _ (アンダーバー)』はエスケープされません。
たとえば『 %test" aaaa\ 』は『 %test\" aaaa\\ 』になります。
$str = "%test\" aaaa\\";
$str = mysql_real_escape_string($str);
print_r($str);
%test\" aaaa\\
文字セットを変更する
[参考記事] MySQLで文字コードを指定する方法
[参考記事] 日付型のフォーマットにスラッシュを使ってはいけません(文字コードによって値が変わる)
SQL文で文字セットを変更するには、SET NAMESを使用します。
UTF-8なら
SET NAMES utf8
ShiftJISなら
SET NAMES sjis
EUC-JPなら
SET NAMES ujis
ただSET NAMESで文字セットを変更する方法は、PHPでは推奨されません。
PHPでMySQLの文字セットを変更するには、mysql_set_charset()を使用します。
UTF-8なら
mysql_set_charset("utf8");
SET NAMESで文字セットを変更した場合、PHPの他のMySQL関数で文字セットの変更を判断できません。
たとえば、文字セット名を返すmysql_client_encoding()では、次のようにSET NAMESとmysql_set_charset()で結果が異なります。
mysql_query("SET NAMES sjis"); echo mysql_client_encoding(); utf8 mysql_set_charset("sjis"); echo mysql_client_encoding(); sjis
ただmysql_set_charset()が使用できるのはPHP5.2.3以上、MySQL5.0.7以上の場合です。
if (version_compare(PHP_VERSION,'5.2.3', '>=') && version_compare(mysql_get_server_info(),'5.0.7', '>=')) { mysql_set_charset("utf8"); }else{ mysql_query("SET NAMES utf8"); }
SELECTなどの結果セットの扱い方
SELECT文で得られた結果行数はmysql_num_rows($resource)、結果行はmysql_fetch_array($resource)で得ることができます。
mysql_fetch_arrayは、添字配列と、カラム名をキーとする連想配列で行の値を返します。
if(!$resource = mysql_query ("SELECT id, name FROM testtable")){ die(mysql_errno() . ':' . mysql_error()); } $row_num = mysql_num_rows($resource); for($i=0;$i<$row_num;$i++){ $row = mysql_fetch_array($resource); echo $row['id']; echo $row['name']; }
mysql_fetch_arrayは行がもうない場合には FALSE を返すので、whileを使用すると次のようになります。
if(!$resource = mysql_query ("SELECT id, name FROM testtable")){ die(mysql_errno() . ':' . mysql_error()); } $lists = array(); while($row = mysql_fetch_array($resource)){ echo $row['id']; echo $row['name']; }
mysql_fetch_assoc() | カラム名をキーとする連想配列で行の値を返します。 |
mysql_fetch_row() | 添字配列 |
mysql_fetch_array() | 第二引数により違います。 MYSQL_ASSOC : 連想配列 MYSQL_NUM : 添字配列 MYSQL_BOTH : 連想配列と添字配列 デフォルト値はMYSQL_BOTH |
結果レコードに同一名のカラムがあった場合には、mysql_fetch_assoc()やmysql_fetch_array()の連想配列では、
最後のものが優先されるので1つしかえることができません。
同一名のカラムを区別するには、mysql_fetch_array()やmysql_fetch_row()の添字配列を使用します。
複数のデータベースに接続する
複数のデータベースに接続するとき、mysql_connectの戻り値の接続IDでそれぞれを区別することができます。
mysql_query(SQL文, 接続ID)
1つの接続情報でそれぞれのデータベースに接続する権限がある場合は、SQL文で区別することもできます。
SELECT * FROM database1.table_name1 SELECT * FROM database2.table_name1
複数の接続IDで区別する場合は、mysql_connectのみを変更するだけでデータベースを変更できますが、
接続IDの数ほどMySQLサーバにはコネクションが張られるため、その分だけリソースを消費します。
MySQLサーバの最大接続数は次のmysqladminコマンドでわかります。
[root@hoge ~]# mysqladmin -u root -p variables | grep max_connections Enter password: | max_connections | 100 |
またはSQL文では次のようにします。
mysql> show variables like 'max_connections'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | max_connections | 100 | +-----------------+-------+
ちなみに最大接続数を変更するにはmax_connectionsで変更できます。
SQL文では
set global max_connections = 500;
my.iniでは
[mysqld] max_connections=500
SQL文で変更した場合、MySQLサーバを再起動した時点で元の値に戻ります。
[root@hoge ~]# mysqladmin -u root -p extended-status | egrep '(Max|Threads_)' Enter password: | Max_used_connections | 5 | | Threads_cached | 0 | | Threads_connected | 3 | | Threads_created | 23 | | Threads_running | 1 |
パラメータ | 意味 |
---|---|
Max_used_connections | これまでに記録された同時接続数の最大値 |
Threads_connected | 現在開いている接続の数 |
Threads_created | 接続を処理するために生成されたスレッド数 |
Threads_running | スリープ状態になっていないスレッド数 |
Max_used_connectionsの最大値は、理論上max_connectionsの値より1大きい値になります。
max_connectionsで最大値に達しても、SUPER権限ユーザが接続できるよう1つ別枠で用意されているためです。
関連記事
- PHPでwebサーバー(apache/nginx)の実行ユーザー・グループを確認する方法
- リクエストヘッダーやリクエストボディーなどを取得する方法
- 負荷が高いときには503エラーを返す方法
- サイトの更新情報をPINGサーバに送信する方法
- PHPでロードアベレージを表示させる方法
- PHPでTwitterのツイートをする/ツイート一覧を取得する/検索する(API v1.1)
- インクルードパスを設定する方法
- オブジェクト(Object)を配列(Array)に変換する方法
- PHPでgzip圧縮形式(gz圧縮)のファイルを読み書きする方法
- PHPでfacebook投稿時に公開範囲を指定する方法
- PHPで複数の画像をfacebookに投稿する方法
- PHPでfacebookのフィード(ウォール)に投稿する方法
- PHPでのfacebookアプリの認証処理(APIを使うユーザー認証)
- MySQLサーバに接続できるかどうかを確認する
- ディレクトリ内のファイルのパーミッションを一括で変更する
- POSTでアップロードできるファイルサイズの制限を変更する方法
- 暗号化・複合化を行う ブロック暗号
- date型やdatetime型と年月日時分秒への変換
- 関数・メソッドの存在を調べる方法
- PHPでTwitterのbotを作る方法 ツイートをする/ツイート一覧を取得する(API v1)
- strtotimeの指定
- PHPでHTMLメールを送る方法
- ディレクトリセパレータを短く定義する DIRECTORY_SEPARATOR
- モザイク画像を作る方法
- HTML内のアクセス解析タグを除去する方法
- HTMLのTABLEタグを簡単にCSVファイルに変換する方法
- 画像表示のときに指定サイズにリサイズする(画像の拡大縮小)
- テキストを可逆的な暗号化する Crypt_Blowfish
- PHPでwhois検索をする Net_Whois
- よく使うヘッダー関数のまとめ
- キャリア・世代を判別する
- mb_send_mailでCCやBCCを指定する 表示名を指定する
- より高速に、推測困難な一意なIDを生成する方法
- 画像ファイルを指定容量ぎりぎりに圧縮する
- 指定したHTTPヘッダーが送信済みあるいは送信予定に含まれているか
- DOCUMENT ROOTを得る $_SERVER["DOCUMENT_ROOT"]は使えない!
- マルチバイト文字列(日本語文字)を一文字づつ取り出す
- ファイルを削除する/フォルダを削除する
- ファイルを読み込む/ファイルに書き込む
- ディレクトリ内のファイル一覧を取得する
- quoted-printable文字列の変換
スポンサーリンク