「データベース接続PDO編」の編集履歴(バックアップ)一覧に戻る
データベース接続PDO編 - (2008/11/02 (日) 05:22:55) のソース
<h3>データベース接続PDO編</h3> <ul><li>PDOを使用したPHPからmysqlの接続</li> <li>extension=php_pdo_dll を使用できるように、php.iniファイルを修正する必要がある</li> <li>データベースの抽象化で、急なサーバ変更時(mysql→postgreSqlなど)に大きくソース修正の必要無し</li> <li>PEAR::DBなど他にもDB抽象化レイヤーはあるが、それらに比べて処理速度が早い</li> </ul><table width="594" cellspacing="1" cellpadding="1" border="0"><tbody><tr style="background-color:rgb(204,255,204);"><td>基本的なフォーマット</td> </tr><tr><td> <p><?php<br /><br /> $dsn = 'mysql:dbname=testDB;host:localhost'; <font color="#339966">//testDBは任意</font><br /> $user = 'root'; <font color="#339966">//DB接続ユーザ名</font><br /> $password = ''; <font color="#339966">//DB接続用パスワード</font><br /><br /> try{<br /> $db = new PDO($dsn, $user, $password);<br /> $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);<br /> print('接続成功' . '<br />');<br /> $sql = 'select * from db';<br /> foreach ($db->query($sql) as $value){<br /> print($value['id'] . '<br />');<br /> print($value['name'] . '<br />');<br /> }<br /> }catch(PDOException $e){<br /> print('Error:' . $e->getMessage());<br /> die();<br /> }<br /><br /> $db = NULL;<br /><br /> ?></p> </td> </tr></tbody></table><p><font size="4" color="#000080" style="background-color:rgb(255,204,153);"><br /> PDOExceptionクラスの主なメソッド</font></p> <table width="588" cellspacing="1" cellpadding="1" border="0"><tbody><tr><td style="background-color:rgb(192,192,192);">メソッド</td> <td style="background-color:rgb(192,192,192);">概要</td> </tr><tr><td>getFile()</td> <td>例外が発生したファイル名を取得</td> </tr><tr><td>getLine()</td> <td>例外が発生した行番号を取得</td> </tr><tr><td>getCode()</td> <td>エラーコードを取得</td> </tr><tr><td>getMessage()</td> <td>例外メッセージを取得</td> </tr><tr><td>getTraceAsString()</td> <td>バックトレースを文字列として取得</td> </tr></tbody></table><p><font size="4" color="#000080" style="background-color:rgb(255,204,153);">getAttribute / setAttribute メソッドで参照/設定可能な接続パラメータ</font></p> <table width="588" cellspacing="1" cellpadding="1" border="0"><tbody><tr><td style="background-color:rgb(192,192,192);">定数</td> <td style="background-color:rgb(192,192,192);">概要</td> </tr><tr><td>PDO::ATTR_AUTOCOMMIT</td> <td>オートコミットを有効化(0 | 1)</td> </tr><tr><td>PDO::ATTR_TIMEOUT</td> <td>タイムアウト値</td> </tr><tr><td>PDO::ATTR_ERRMODE</td> <td>エラーモード</td> </tr><tr><td> PDO::ERRMODE_SILENT</td> <td>エラー出力を行わない</td> </tr><tr><td> PDO::ERRMODE_WARNING</td> <td>警告を出力</td> </tr><tr><td> PDO::ERRMODE_EXCEPTION</td> <td>PDOExceptionを発生</td> </tr><tr><td>PDO::ATTR_SERVER_VERSION</td> <td>サーバのバージョン</td> </tr><tr><td>PDO::ATTR_CLIENT_VERSION</td> <td>クライアントのバージョン</td> </tr><tr><td>PDO::ATTR_SERVER_INFO</td> <td>サーバ情報</td> </tr><tr><td>PDO::ATTR_CONNECTION_STATUS</td> <td>サーバへの接続状態</td> </tr><tr><td>PDO::ATTR_CASE</td> <td>カラム名を大文字/小文字に変換</td> </tr><tr><td> PDO::CASE_LOWER</td> <td>カラム名を小文字に変換</td> </tr><tr><td> PDO::CASE_NATURAL</td> <td>ドライバからの戻り値のまま</td> </tr><tr><td> PDO::CASE_UPPER</td> <td>カラム名を大文字に変換</td> </tr><tr><td>PDO::ATTR_CURSOR_NAME</td> <td>カーソル名</td> </tr><tr><td>PDO::ATTR_ORACLE_NULLS</td> <td>空文字をNULLに変換するか(0 | 1)</td> </tr><tr><td>PDO::ATTR_PERSISTENT</td> <td>接続的持続を有効にするか</td> </tr></tbody></table><p> </p> <p> </p> <p><font size="4" color="#000080" style="background-color:rgb(255,204,153);">insert処理サンプル</font></p> <table width="631" cellspacing="1" cellpadding="1" border="0"><tbody><tr style="background-color:rgb(204,255,204);"><td>insert_form.php</td> </tr><tr><td> <p><html><br /> <head><title>メンバー登録</title></head><br /> <body><br /> <form method="post" action="insMember.php"><br /> <talbe border="0"><br /> <tr><br /> <th>名前:</th><br /> <td><input trype="text" name="name" size="15" maxlength="50" /></td><br /> </tr><br /> <tr><br /> <th>住所:</th><br /> <td><input trype="text" name="address" size="35" maxlength="170" /></td><br /> </tr> <br /> <tr><br /> <th>電話番号:</th><br /> <td><input trype="text" name="tel" size="20" maxlength="20" /></td><br /> </tr><br /> <tr><br /> <th>E-mail:</th><br /> <td><input trype="text" name="mail" size="50" maxlength="100" /></td><br /> </tr><br /> <tr><br /> <td colspan="2"><br /> <input type="submit" value="登録" /><br /> <input type="reset" value="クリア" /><br /> </td><br /> </tr><br /> </table><br /> </form><br /> </body><br /> </html></p> </td> </tr><tr style="background-color:rgb(204,255,204);"><td>insMember.php</td> </tr><tr><td><?php<br /> $dsn = 'mysql:dbname=testDB;host:localhost'; <font color="#339966">//testDBは任意</font><br /> $user = 'root'; <font color="#339966">//DB接続ユーザ名</font><br /> $password = ''; <font color="#339966">//DB接続用パスワード</font><br /><br /> try{<br /> $db = new PDO($dsn, $user, $password);<br /> $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);<br /> $db->exec("INSERT INTO memberDB(name, address, tel, mail) VALUES(" .<br /> $db->quote($_POST['name']) . "," .<br /> $db->quote($_POST['address']) . "," .<br /> $db->quote($_POST['tel']) . "," .<br /> $db->quote($_POST['mail']) . ")");<br /> header('Location: http://' . $_SERVER['HTTP_HOST'] .<br /> dirname($_SERVER['PHP_SELF']) . '/insert_form.php');<br /> } catch (PDOException $e){<br /> print('エラー発生 : ' . $e->getMessage());<br /> }<br /><br /> ?></td> </tr></tbody></table><p> </p> <p><font size="4" color="#000080" style="background-color:rgb(255,204,153);">名前付きパラメータ</font><br /><font size="4" color="#000080" style="background-color:rgb(255,204,153);"><br /></font>◆ここで、insMember.phpで別の方法でインサート処理しましょう<br /> ◆quoteメソッドによる処理を行う必要がなくコードをシンプルに記述できる<br /><br /></p> <table width="641" cellspacing="1" cellpadding="1" border="0"><tbody><tr style="background-color:rgb(204,255,204);"><td>insMember.php</td> </tr><tr><td><?php<br /> $dsn = 'mysql:dbname=testDB;host:localhost'; <font color="#339966">//testDBは任意</font><br /> $user = 'root'; <font color="#339966">//DB接続ユーザ名</font><br /> $password = ''; <font color="#339966">//DB接続用パスワード</font><br /><br /> try{<br /> $db = new PDO($dsn, $user, $password);<br /> $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);<br /><font color="#000080"> $stt = $db->prepare('INSERT INTO memberDB(name, address, tel, mail)<br /> VALUES(:name, :address, :tel, :mail )');<br /><br /> $stt->bindParam(':name', $_POST['name'], PDO::PARAM_STR, 50);<br /> $stt->bindParam(':address', $_POST['address'], PDO::PARAM_STR, 150);<br /> $stt->bindParam(':tel', $_POST['tel'], PDO::PARAM_STR, 20);<br /> $stt->bindParam(':mail', $_POST['mail'], PDO::PARAM_STR, 100);<br /> $stt->execute();</font><br /> header('Location: http://' . $_SERVER['HTTP_HOST'] .<br /> dirname($_SERVER['PHP_SELF']) . '/insert_form.php');<br /> } catch (PDOException $e){<br /> print('エラー発生 : ' . $e->getMessage());<br /> }<br /><br /> ?></td> </tr></tbody></table><br /><font size="4" color="#000080" style="background-color:rgb(255,204,153);">bindParamメソッドで指定できるデータ型</font> <table width="588" cellspacing="1" cellpadding="1" border="0"><tbody><tr><td style="background-color:rgb(192,192,192);">設定値</td> <td style="background-color:rgb(192,192,192);">概要</td> </tr><tr><td>PDO::PARAM_NULL</td> <td>NULL型</td> </tr><tr><td>PDO::PARAM_INT</td> <td>整数型</td> </tr><tr><td>PDO::PARAM_STR</td> <td>文字列型</td> </tr><tr><td>PDO::PARAM_LOB</td> <td>オージオブジェクト型</td> </tr><tr><td>PDO::PARAM_STMT</td> <td>SQLクエリ</td> </tr><tr><td>PDO::PARAM_INPUT_OUTPUT</td> <td>入出力パラメータ</td> </tr></tbody></table><p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <table width="593" cellspacing="1" cellpadding="1" border="0"><tbody><tr style="background-color:rgb(255,153,204);"><td colspan="2"><strong><font color="#FF0000">mysql_connect</font></strong>関数</td> </tr><tr><td style="background-color:rgb(204,255,204);">機能と返り値</td> <td>mysqlに接続。接続に成功すると、mysqlから接続IDが返されます。失敗した場合はfalse</td> </tr><tr><td style="background-color:rgb(204,255,204);">引数</td> <td>接続するためには、[mysqlサーバ名][ログインユーザ名][ユーザのパスワード]の順番で指定</td> </tr><tr><td colspan="2"> <p>$con = mysql_connect(サーバ名, ユーザ名, パスワード);</p> </td> </tr></tbody></table><p> </p> <table width="593" cellspacing="1" cellpadding="1" border="0"><tbody><tr style="background-color:rgb(255,153,204);"><td colspan="2"><strong><font color="#FF0000">mysql_select_db</font></strong>関数</td> </tr><tr><td style="background-color:rgb(204,255,204);">機能と返り値</td> <td>複数あるデータベースから、処理する1つのデータベースを選択</td> </tr><tr><td style="background-color:rgb(204,255,204);">引数</td> <td>第一引数に選択するデータベース名。第二引数に、mysql_connectで返されたmysql接続ID(省略可能)</td> </tr><tr><td colspan="2">$selectDB = mysql_select_db(データベース名, 接続情報);</td> </tr></tbody></table><p> </p> <table width="593" cellspacing="1" cellpadding="1" border="0"><tbody><tr style="background-color:rgb(255,153,204);"><td colspan="2"><strong><font color="#FF0000">mysql_query</font></strong>関数</td> </tr><tr><td style="background-color:rgb(204,255,204);">機能と返り値</td> <td>sql文を発行。select文では、取得された結果セットのIDが返される。insert / update / delete 文では、成功時は true、失敗時は false</td> </tr><tr><td style="background-color:rgb(204,255,204);">引数</td> <td>第一引数にsql文の文字列を指定。第二引数に、mysql_connectで返されたmysql接続ID(省略可能)</td> </tr><tr><td colspan="2">mysql_query('set names UTF-8'); <font color="#339966">//読み込み・書き込み用文字コード</font><br /> $rst = mysql_query(sql文);</td> </tr></tbody></table><p> </p> <table width="593" cellspacing="1" cellpadding="1" border="0"><tbody><tr style="background-color:rgb(255,153,204);"><td colspan="2"><strong><font color="#FF0000">mysql_num_rows</font></strong>関数</td> </tr><tr><td style="background-color:rgb(204,255,204);">機能と返り値</td> <td>mysql_query関数で発行したselect文より、何レコードのデータがあるかを返す</td> </tr><tr><td style="background-color:rgb(204,255,204);">引数</td> <td>mysql_query関数で返された結果セットIDを指定</td> </tr><tr><td colspan="2">$rst = mysql_query(sql文);<br /> $selectCnt = mysql_num_rows($rst);<br /> echo $selectCnt;</td> </tr></tbody></table><p> </p> <table width="593" cellspacing="1" cellpadding="1" border="0"><tbody><tr style="background-color:rgb(255,153,204);"><td colspan="2"><strong><font color="#FF0000">mysql_fetch_array</font></strong>関数</td> </tr><tr><td style="background-color:rgb(204,255,204);">機能と返り値</td> <td> mysql_query関数を使用してselect文を発行した返り値の結果セットから、1レコード文を取り出します。返り値を変数に代入することにより、取り出されたデータは自動的に連想配列または数値インデックスの配列として格納される。$変数名[フィールド名]という構文で連想配列としてデータを取得できる</td> </tr><tr><td style="background-color:rgb(204,255,204);">引数</td> <td> <p>第一引数に、mysql_query関数で返された結果セットID。第二引数に、取得された1レコード文のデータをどのように変数に格納するか指定する。<br /> 省略した場合には、MYSQL_BOTHが使われる<br /> MYSQL_BOTH <font color="#339966">//連想配列と数値インデックス配列の両方で格納</font><br /> MYSQL_ASSOC <font color="#339966">//連想配列として格納</font><br /> MYSQL_NUM <font color="#339966">//数値インデックス配列として格納</font></p> </td> </tr><tr><td colspan="2">$rst = mysql_query(sql文);<br /> while ($col = mysql_fetch_array($rst)) {<br /> echo $col['id'];<br /> echo $col['name'];<br /> echo $col['mail']<br /> }</td> </tr></tbody></table><p> </p> <table width="593" cellspacing="1" cellpadding="1" border="0"><tbody><tr style="background-color:rgb(255,153,204);"><td colspan="2"><strong><font color="#FF0000">mysql_free_result</font></strong>関数</td> </tr><tr><td style="background-color:rgb(204,255,204);">機能と返り値</td> <td>mysql_query関数で取得した結果セットを破棄して、メモリを解放する。成功時は true、失敗時は false</td> </tr><tr><td style="background-color:rgb(204,255,204);">引数</td> <td>mysql_query関数で返された結果セットIDを指定</td> </tr><tr><td colspan="2">$rst = mysql_query(sql文);<br /> $rst = mysql_free_result($tst);</td> </tr></tbody></table><p> </p> <table width="593" cellspacing="1" cellpadding="1" border="0"><tbody><tr style="background-color:rgb(255,153,204);"><td colspan="2"><strong><font color="#FF0000">mysql_close</font></strong>関数</td> </tr><tr><td style="background-color:rgb(204,255,204);">機能と返り値</td> <td>mysqlとの接続解除。成功時は true、失敗時は false</td> </tr><tr><td style="background-color:rgb(204,255,204);">引数</td> <td>mysql_connect関数で返された接続IDを指定</td> </tr><tr><td colspan="2">$con = mysql_connect(サーバ名, ユーザ名, パスワード);<br /> mysql_close($con);</td> </tr></tbody></table><p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <hr width="100%" size="2" /><hr width="100%" size="2" /><p> </p> <p> </p>