こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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());
}


よろしくお願いします

投稿日時 - 2013-08-11 22:41:12

QNo.8215741

暇なときに回答ください

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

ちょうど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&section=first


回答3

MySQLネイティブのプリペアドステートメントを使うかどうかの指定です。


PDO::ATTR_EMULATE_PREPARES => True → PDO側でエミュレートする(デフォルト)

メリット
・MySQLとのやりとりが減るので、パフォーマンスが向上する。
・名前付きプレースホルダで、複数の箇所に同時にバインドすることが出来る。

デメリット
・PDOがセキュリティホールをかかえたバージョンだと、プリペアドステートメントを使ってもSQLインジェクション攻撃の餌食になることがある。PHP5.3.8以降であれば問題なし。


PDO::ATTR_EMULATE_PREPARES => False → MySQLネイティブのを使う

メリット
・SQLインジェクション攻撃が絶対に起こらないと保証できる。

デメリット
・MySQLとのやりとりが増えてパフォーマンスが低下する。
・名前付きプレースホルダの複数個所同時バインドをしようとするとエラーになる。(ちょっと記憶が不確かだけどこんな記事を見た気がする。要検証。)

投稿日時 - 2013-08-12 08:56:03

お礼

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

投稿日時 - 2013-08-12 12:39:39

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

自分の場合はこんな感じ。

class PdoMysql
{
/**
* PDO接続文字列
*
* @varresource
* @accessprivate
*/
private $dsn = NULL;


/**
* PDOインスタンス
*
* @varresource
* @accessprivate
*/
private $dbh = NULL;


/**
* ページ用のパラメータ名
*
* @varstring
* @accessprivate
*/
private$param_page= 'page';


/**
* ホスト名
*
* @varstring
* @accessprivate
*/
private $hostname= DB_HOST;


/**
* ユーザー名
*
* @varstring
* @accessprivate
*/
private $username= DB_USER;


/**
* パスワード
*
* @varstring
* @accessprivate
*/
private $password= DB_PASS;


/**
* データベース名
*
* @varstring
* @accessprivate
*/
private $database= DB_NAME;


/**
* 文字コード(MySQL内部に使用している文字コード)
*
* @varstring
* @accessprivate
*/
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());
}
}

投稿日時 - 2013-08-12 03:02:28

お礼

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

投稿日時 - 2013-08-12 12:33:39

質問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

投稿日時 - 2013-08-11 23:17:42

お礼

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

投稿日時 - 2013-08-12 00:32:10

あなたにオススメの質問