• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PDOを使いたい)

PDOを使いたい PHP初心者の疑問

このQ&Aのポイント
  • PHP初心者の質問:PDOでMYSQLに接続する方法は?
  • 質問1:$db_nameや$passなどの変数に直接localhostを書くのはまずい?
  • 質問2:PDO記号の意味を教えてください->とか=>です

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

  • ベストアンサー
noname#244856
noname#244856
回答No.3

ちょうどQiitaの記事作ったところなので。 http://qiita.com/mpyw/items/6539a0a65240103a5d43 そもそもPHP5.2の頃のPDOはバグ・セキュリティホールのオンパレードで使い物にならないレベルなので、非推奨であるmysql_○○関数を使うのと大差ないレベルだと思います・・・ PHPに存在するセキュリティホール問題が一通り解消されたのはPHP5.4.1以降なので、それより古いバージョンのものは極力使わないでください。 ちなみにPHP5.2.5環境をもし有料で提供しているレンタルサーバーならば、はっきり言って「タダ未満」です。私だったら速攻解約します。無料で5.3以上を使わせてくれるところもたくさんあります。 回答1 問題なし。ちなみに "$user" は冗長なので単に $user だけでOK。 回答2 PDOに関係なくPHPの基礎レベルの知識です。 http://korikorikorikori.blog.fc2.com/blog-entry-163.html http://www.shigeweb.jp/php/project_p/?page=class§ion=first 回答3 MySQLネイティブのプリペアドステートメントを使うかどうかの指定です。 PDO::ATTR_EMULATE_PREPARES => True → PDO側でエミュレートする(デフォルト) メリット ・MySQLとのやりとりが減るので、パフォーマンスが向上する。 ・名前付きプレースホルダで、複数の箇所に同時にバインドすることが出来る。 デメリット ・PDOがセキュリティホールをかかえたバージョンだと、プリペアドステートメントを使ってもSQLインジェクション攻撃の餌食になることがある。PHP5.3.8以降であれば問題なし。 PDO::ATTR_EMULATE_PREPARES => False → MySQLネイティブのを使う メリット ・SQLインジェクション攻撃が絶対に起こらないと保証できる。 デメリット ・MySQLとのやりとりが増えてパフォーマンスが低下する。 ・名前付きプレースホルダの複数個所同時バインドをしようとするとエラーになる。(ちょっと記憶が不確かだけどこんな記事を見た気がする。要検証。)

flash0
質問者

お礼

回答ありがとうございます PHP5.2.5だとpdoバグだらけだったんですね・・・ せっかくやる気出てきただけに残念です もう少し待ってみます。サーバーのphpバージョン上がるかもしれないので >SQLインジェクション攻撃が絶対に起こらないと保証できる。 コレはすごいメリットですね!

その他の回答 (2)

回答No.2

自分の場合はこんな感じ。 ↓ class PdoMysql { /** * PDO接続文字列 * * @var resource * @access private */ private $dsn = NULL; /** * PDOインスタンス * * @var resource * @access private */ private $dbh = NULL; /** * ページ用のパラメータ名 * * @var string * @access private */ private $param_page = 'page'; /** * ホスト名 * * @var string * @access private */ private $hostname = DB_HOST; /** * ユーザー名 * * @var string * @access private */ private $username = DB_USER; /** * パスワード * * @var string * @access private */ private $password = DB_PASS; /** * データベース名 * * @var string * @access private */ private $database = DB_NAME; /** * 文字コード(MySQL内部に使用している文字コード) * * @var string * @access private */ private $encoding = 'utf8mb4'; private function _connect() { try{ if (version_compare("5.3.6", phpversion(), '<=')) { $this->dsn = "mysql:dbname={$this->database};host={$this->hostname};charset={$this->encoding}"; $this->dbh = new PDO($this->dsn, $this->username, $this->password); } else { $this->dsn = "mysql:dbname={$this->database};host={$this->hostname}"; $this->dbh = new PDO( $this->dsn , $this->username , $this->password , array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET {$this->encoding}") ); } $this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // ログを記録 Logging::write("PDO", 'trace', 'コネクションを確立'); } catch (PDOException $e){ Logging::write("PDO", 'fatal', __CLASS__ . '::' . __FUNCTION__ . ' コネクション: ' . $e->getMessage()); throw new PDOException('コネクションを確立できません->' . $e->getMessage()); } }

flash0
質問者

お礼

回答ありがとございます。 レベルがすごい高いです! でも、初心者ですので解読できませんでした;;

回答No.1

質問1 問題ない 質問2 -> 「オブジェクト演算子・アロー演算子」といいます。 http://www.php.net/manual/ja/language.oop5.properties.php => 「ダブルアロー」 http://php.net/manual/ja/language.types.array.php 読み方が分かればググルことできますよね。 質問3 リファレンス読んでください。リファレンスに書いてあるようなことをいちいち聞くというのは聞くほうも答えるほうも時間の無駄です。 http://php.net/manual/ja/pdo.setattribute.php

flash0
質問者

お礼

回答ありがとうございます なんとなくわかりました しかし、PHP 5.3.6以前では、接続文字列にcharsetを指定できないようです みなさんは文字コードどうしてるんでしょうか?

関連するQ&A