DB接続関数化

このQ&Aのポイント
  • データベースに接続する関数を作成し、MySQLに接続してPDOクラスでデータベース情報を返す方法について解説します。
  • PHPでデータベースに接続する際に利用する関数を作成する方法について、MySQLを使用してPDOクラスで接続し、データベース情報を取得する手順をご紹介します。
  • データベースに接続するための関数を作成し、MySQLを使用してPDOクラスで接続したデータベース情報を取得する方法について説明します。
回答を見る
  • ベストアンサー

DB接続の関数化

下記のデータベースに接続する関数の意味は「MySQLに接続して、PDOクラスで接続したデータベース情報を返す」で合っていますか? function get_db_connect(){ // MySQL用のDSN文字列 $dsn = 'mysql:dbname='. DB_NAME .';host='. DB_HOST .';charset='.DB_CHARSET; try { // データベースに接続する $dbh = new PDO($dsn, DB_USER, DB_PASS, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8mb4')); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); } catch (PDOException $e) { exit('接続できませんでした。理由:'.$e->getMessage() ); } return $dbh; }

  • PHP
  • 回答数1
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

PDOは、データベースの接続を表す、ということになります。 https://www.php.net/manual/ja/class.pdo.php 「データベースの接続を表す」とは、現在データベース接続中ということで、変数$dbhに実装されているメソッドを実行することで、SQLにより、テーブル操作などを行うことができる状態になります。

関連するQ&A

  • PDOで取得される値がすべて文字列になる

    xamppを標準インストールした環境にてPHPのPDOを利用したデータベース処理を試しているのですが、SELECTで取得した値がすべて文字列として返されます。 $db = new PDO("sqlite:sample.db"); $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT); $rs = $db->query("select 1 as res"); $rs = $rs->fetch(); 結果: array(1) ( [res] => (string) 1 ) これに加え、やや強引なテストを行ってみたのですが、こちらも結果は同じく文字列となりました $db = new PDO("sqlite:sample.db"); $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT); $rs = $db->prepare("select ? as res"); $rs->bindValue(1, 1, PDO::PARAM_INT); $rs->execute(); $rs = $rs->fetch(); この現象を回避するにはどのようにすればよいでしょうか。

    • ベストアンサー
    • PHP
  • MySQL nuexpected(T_STRING

    ローカル開発環境にてphpとMysql接続の勉強をしている者です。 下記コードにて   } catch (PDOException $e) { 行にunexpected (T_STRING)と出て詰まっています スペルミスの注意して確認しましたが一人ではどうにも解りません...わかる方回答お願いしますm(_ _)m <?php define('DB_DATABASE', 'takagi_db'); define('DB_USERNAME', 'dbuser'); define('DB_PASSWORD', 'takagi'); define('PDO_DSN', 'mysql:dbhost=localhost;dbname=' . DB_DATABASE); try { //connect $db = new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $db->query("select * from users"); //全件抽出 $users = $stmt->fetchAll(PDO::FETCH_ASSOC);//FetchAll(抽出型指定) foreach ($users as $user){ } echo $stmt->rowCount() . "records found.";   } catch (PDOException $e) { echo $e->getMessage(); exit; } ?>

    • ベストアンサー
    • MySQL
  • php 66行目の関数に矛盾???

    いつも大変お世話になり誠にありがとうございます。 標記の件。 たくさんファイルがあるので、他の箇所に 問題があるのかもしれません。 エラーメッセージは Fatal error: Cannot redeclare Dbc::getBlog() in C:\xampp\htdocs\dbc.php on line 66 です。 度々申し訳ございません。 アドバイスを宜しくお願い申し上げます。      記 <?php require_once('env.php'); Class Dbc { protected $table_name; //1.データベース接続 //引数:なし //返り値:接続結果を返す protected function dbConnect() { $host = DB_HOST; $dbname = DB_NAME; $user = DB_USER; $pass = DB_PASS; $dsn = "mysql:host = $host;dbname = $dbname;charset=utf8"; try { $dbh = new \PDO($dsn,$user,$pass,[ \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, ]); } catch (PDOException $e) { echo '接続失敗'; $e->getMessage(); exit(); }; return $dbh; } //カテゴリー名を表示 //引数:数字 //返り値:カテゴリーの文字列 function setCategoryName($category) { if ($category == '1') { return '日常'; }elseif ($category == '2') { return '非日常'; }else{ return 'その他'; } } //引数:id //返り値:$result public function getBlog($id) { if(empty($id)) { exit('idが不正です。'); } } public function getAllBlog() { $dbh = $this->dbConnect(); //⓵SQLの準備 $stmt = $dbh->prepare('SELECT * FROM blog Where id = :id'); $stmt->bindValue(':id',(int)$id, \PDO::PARAM_INT); //⓶SQLの実行 $stmt->execute(); //⓷SQLの結果を受け取る $result = $stmt-> fetchall(\PDO::FETCH_ASSOC); if(!$result) { exit('本文がありません。'); } return $result; $dbh = null; } //引数:$id //返り値:$result public function getBlog($id) { ★ここが66行目です。 if(empty($id)) { exit('idが不正です。'); } $dbh = $this->dbConnect(); //SQL準備 $stmt = $dbh->prepare('SELECT * FROM blog Where id = :id'); $stmt->bindValue(':id',(int)$id, \PDO::PARAM_INT); //SQL実行 $stmt->execute(); //結果を取得 $result = $stmt->fetch(\PDO::FETCH_ASSOC); if(!$result) { exit('本文がありません。'); } } //return $result; } function delete($id) { exit('idが不正です。'); } return $result;

    • ベストアンサー
    • PHP
  • PDOを使いたい

    PHP初心者です PHP 5.2.5 MySQL 5.1.22 PDOでMYSQLに接続するにはどうすればいいのでしょうか? いままではこんな感じでしたがPDOにするとどんな感じになるんですか? $link=mysql_connect('localhost', 'user', 'pass')or die(mysql_error()); mysql_select_db(user'); mysql_query('SET NAMES UTF8'); PDOで接続する方法らしいのですが疑問を持ってしまったので教えてください 質問1 最初の$db_nameや$passなどの変数のとこに直接、localhostと書くのはまずいですか? 質問2 古いMYSQL系はカッコで囲めばいいので簡単だったのですがPDOの記号の意味を教えてください->とか=>です 質問3 PDO::ATTR_EMULATE_PREPARESは指定する必要があるんでしょうか?指定しないとパフォーマンスが下がるんですか?PDO::ATTR_EMULATE_PREPARESとはなんでしょうか? try { $pdo = new PDO("mysql:dbname=$db_name;host=$serv","$user","$pass", array( PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET 'utf8`")); } catch (PDOException $e) { die($e->getMessage()); } よろしくお願いします

    • ベストアンサー
    • PHP
  • ODBCによるSQL serverへの接続方法を教えてください。

    PHPでSQL ServerへのODBC接続をしたいのですが、SQL Serverの場合の例がみつけられません。以下の~部分を教えてください。 try{ $db=new PDO("~"); $db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); print('データベースへの接続を確立しました。'); }catch(PDOException $e){ die("エラーメッセージ:".$e->getMessage()); } ※SQL ServerへはWindows認証で接続しています。 PHP使用環境  OS:Windows2000 pro  PHP:5.1.6  ODBC:登録済み(Windows認証、登録時の接続テスト正常終了)  ※SQL Serverはリモートサーバ。

    • 締切済み
    • PHP
  • PHPでmysqlへの書き込みでエラー

    PHPとmysqlを最近勉強し始めました。 PHPでmysqlへデータベースの書き込みをする時に変数からデータを書き込むとエラーが出て、どうしてなのかが色々と検索してみたのですが、解決できずにいます。 どなたかご教示ください。 弁当の注文を把握するために作りました。 mysqlには ソースは以下の通りです。 表示だけなら、全項目表示は出来ます。 データベースに書き込みんで貯めたいのですが、phpmyadminでデータを記入し、SQL実行ならできました。 mysqlには order というテーブルに  orderid int(5) syain varchar(11) syohinmei varchar(11) kingaku int(11) timestamp datetime 上記のカラムが作成してあります。 <?php $gokojo = $_GET['gokojo']; $syain = $_GET['syain']; $bento = $_GET['bento']; $orderkojo = $_GET['orderkojo']; $syohinmei = $_GET['syohinmei']; $kingaku = $_GET['kingaku']; $db_user = "naka"; // ユーザー名 $db_pass = "naka"; // パスワード $db_host = "192.168.0.9"; // ホスト名 $db_name = "bento"; // データベース名 $db_type = "mysql"; // データベースの種類 $dsn = "$db_type:host=$db_host;dbname=$db_name;charset=utf8"; try { $pdo = new PDO($dsn, $db_user,$db_pass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); } catch(PDOException $Exception) { die('エラー :' . $Exception->getMessage()); } $timestamp = date("Y-m-d H:i:s") ; try { $pdo->beginTransaction(); $sql = 'INSERT INTO order(syain,syohinmei,kingaku,timestamp) VALUES("'.$syain.'","'.$syohinmei.'",'.$kingaku.',"'.$timestamp.'")'; $stmh = $pdo->prepare($sql); $stmh->bindValue(':syain',$syain,PDO::PARAM_STR); $stmh->bindValue(':syohinmei',$syohinme,PDO::PARAM_STR); $stmh->bindValue(':kingaku',$kingaku,PDO::PARAM_INT); $stmh->bindValue(':timestamp',$timestamp,PDO::PARAM_STR); $stmh->execute(); $pdo->commit(); print "データを更新しました。<br>"; } catch (PDOException $Exception) { $pdo->rollBack(); print "エラー:" . $Exception->getMessage(); } ?> エラーは以下の通りです。 エラー:SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'order(syain,syohinmei,kingaku,timestamp) VALUES("中川","サンマ弁当",450,"' at line 1 Syntax error なので、コマンドの間違えなのだろうと思いますが、解決できません。 同じことを二回してますが、片方ずつでやってもダメなので、色々試してます。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • exec関数の中に変数を入れたい

    CSVファイル(kabu.csv)をmysqlに記録すべく下記のPHPを組みました。 PHPのexec関数の中で、MySQLを動作させます。 下記でPHPファイルと同じ階層にあるkabu.csvをMySQLにインサートすることが可能でした。 <?php try { $con = new PDO("mysql:host=127.0.0.1;dbname=db", "root", "password", array(PDO::MYSQL_ATTR_LOCAL_INFILE => 1)); $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $con->exec('load data local infile \'kabu.csv\' IGNORE INTO TABLE photo_in fields terminated by \',\' enclosed by \'"\' escaped by \'"\''); } catch (PDOException $e) { echo $e->getMessage(); } ?> ********************************************************************************* 次に、 \'kabu.csv\'を外に出しました。($file = 'kabu.csv';) (将来的にこのkabu.csvはクエリーと連動して名前をが変わるようにする予定です。) ********************************************************************************** <?php $file = 'kabu.csv'; try { $con = new PDO("mysql:host=127.0.0.1;dbname=db", "root", "password", array(PDO::MYSQL_ATTR_LOCAL_INFILE => 1)); $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $con->exec('LOAD DATA LOCAL INFILE $file IGNORE INTO TABLE photo_in fields terminated by \',\' enclosed by \'"\' escaped by \'"\''); } catch (PDOException $e) { echo $e->getMessage(); } ?> 単純に \'kabu.csv\'を$fileに置き換えただけではうまく動作しません。(MySQLに入力されません) どのように記載すれば、作動するでしょうか? 初歩的な質問かと思いますが、よろしくお願いいたします。 環境はCentOS 6.6 + MySQL5.6 です。エラーは下記となります。  SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '$file IGNORE INTO TABLE photo_in fields terminated by ',' enclosed by '"' escape' at line 1

    • 締切済み
    • PHP
  • PDO_MYSQLを利用したDB接続ができない

    閲覧ありがとうございます。 次のコードを実行してMYSQLへの接続をしようとすると以下のようなエラーになってしまいます。 エラー!: SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) try { $dbh = new PDO('mysql:host=localhost;dbname=DB名', 'ユーザ名', 'パスワード'); } catch (PDOException $e) { print "エラー!: " . $e->getMessage() . "<br/>"; die(); } どなたか原因が分かる方はご教授いただければと思います。 ちなみにmysql_connect()でなら接続できます。 phpinfoを確認すると、確かにPDO、PDO_MYSQLは表示されています。

    • ベストアンサー
    • PHP
  • 簡単な投稿サイトを作りたい

    簡単な投稿サイトを作りたいのですが、下記のようにDBデータを表記することとDBにデータを入れることは何とか出来たのですが、実際に投稿サイトを作る場合、 inputに入力してもらった情報をDBのカラムに入れて、それを表記したい要素に渡してブラウザ上に表記し、削除ボタンを押したらカラムのデータを空にして表記していた要素を削除しないといけないですよね? これらの作業はすべてphpで行うよりサーバの負担を避けるためにinputに入力された文字列をphpの変数に入れるまではajaxを使ったjsで行うべきでしょうか? その場合どうやってphpのこの変数に入れるとするのでしょうか? そして$stmt->execute(array(値を受け取ったphpの変数名)); とすれば問題なくカラムにデータが入るでしょうか? 正直難しくてあまり検討が付きません。 ここまで来るとlaravelを使った方がよいのでしょうか? 生では厳しいですか? $db_host = "localhost"; // データベースのホスト $db_name = "toukoutest"; // データベースの名前 $db_user = "root"; // データベース接続ユーザー $db_pass = ""; // データベース接続パスワード // データベース接続を確立 try { $db = new PDO("mysql:host={$db_host};dbname={$db_name};charset=utf8", $db_user, $db_pass); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // エラーモードの設定 $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); // prepareのエミュレーションを停止 } catch (PDOException $e) { // エラー発生時 exit("データベースの接続に失敗しました"); } // データの問い合わせ $rows_post = array(); // 配列の初期化 try { // toukoutableの部分がテーブル名。itemの部分がカラム(フィールド)名 $stmt = $db->prepare("SELECT * FROM toukoutable ORDER BY item DESC"); $stmt->execute(); // クエリの実行 $rows_post = $stmt->fetchAll(); // SELECT結果を二次元配列に格納 } catch (PDOException $e) { // エラー発生時 exit("クエリの実行に失敗しました"); } if (count($rows_post) > 0) { echo '<ul>'; foreach ($rows_post as $row) { printf('<li>%s</li>', $row['item']); } echo '</ul>'; } else { // 取得行数が 0 だったときの処理 } // データをデータベースに入力 $stmt = $db->prepare('insert into `add` (addcol2) values (?)'); $stmt->execute(array('値222'));

    • ベストアンサー
    • MySQL
  • mysql 接続について

    こんにちわ カートを作っていてつまづいたのでお力かしていただきたいです。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title></title> </head> <body> <?php try{ require_once('../common/common.php'); $post=sanitize($_POST); $pro_name=$post['name']; $pro_namecode=$post['namecode']; $pro_kg=$post['kg']; $pro_price=$post['price']; $pro_gazou_name=$_POST['gazou_name']; $pro_gazou_name2=$_POST['gazou_name2']; $dsn='mysql:dbname=LAA******-******;host=mysql***.phy.lolipop.lan'; $user='LAA******'; $password='********'; $dbh=new PDO($dsn,$user,$password); $pdo=new PDO("mysql:host=mysq***.phy.lolipop.lan;dbname=LAA*****-*******;charset=utf8",'LAA*****','********←パスワード'); $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);                                                 $sql='INSERT INTO mst_product(namecode,name,kg,price,gazou,gazou2) VALUES(?,?,?,?,?,?)'; $stmt=$dbh->prepare($sql); $data[]=$pro_namecode; $data[]=$pro_name; $data[]=$pro_kg; $data[]=$pro_price; $data[]=$pro_gazou_name; $data[]=$pro_gazou_name2; $stmt->execute($data); $dbh=null; print$pro_name; print'を追加しました。<br/>'; } catch(Exception $e) { print'ただいま障害により大変ご迷惑をおかけします。<br/>'; exit(); } ?> <a href="pro_list.php">戻る</a> </body> </html> 一応エラーもでないで最後のprint$pro_name;print'を追加しました。<br/>'; までいくんですがデータベースを見ても商品は追加されていません。 エラーもでないで最後まで行くということは一応接続は出来ているということ なんでしょうか? どうしたらきちんと商品登録でしますか? レンタルサーバーはロりポップです。 必要かは分からないんですが phpバージョンは5.3 データベースバージョン5.6 よろしくおねがいします。

    • ベストアンサー
    • MySQL

専門家に質問してみよう