![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
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());
}
よろしくお願いします
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- …
http://www.shigeweb.jp/php/project_p/?page=class …
回答3
MySQLネイティブのプリペアドステートメントを使うかどうかの指定です。
PDO::ATTR_EMULATE_PREPARES => True → PDO側でエミュレートする(デフォルト)
メリット
・MySQLとのやりとりが減るので、パフォーマンスが向上する。
・名前付きプレースホルダで、複数の箇所に同時にバインドすることが出来る。
デメリット
・PDOがセキュリティホールをかかえたバージョンだと、プリペアドステートメントを使ってもSQLインジェクション攻撃の餌食になることがある。PHP5.3.8以降であれば問題なし。
PDO::ATTR_EMULATE_PREPARES => False → MySQLネイティブのを使う
メリット
・SQLインジェクション攻撃が絶対に起こらないと保証できる。
デメリット
・MySQLとのやりとりが増えてパフォーマンスが低下する。
・名前付きプレースホルダの複数個所同時バインドをしようとするとエラーになる。(ちょっと記憶が不確かだけどこんな記事を見た気がする。要検証。)
回答ありがとうございます
PHP5.2.5だとpdoバグだらけだったんですね・・・
せっかくやる気出てきただけに残念です
もう少し待ってみます。サーバーのphpバージョン上がるかもしれないので
>SQLインジェクション攻撃が絶対に起こらないと保証できる。
コレはすごいメリットですね!
No.2
- 回答日時:
自分の場合はこんな感じ。
↓
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());
}
}
No.1
- 回答日時:
質問1 問題ない
質問2
-> 「オブジェクト演算子・アロー演算子」といいます。
http://www.php.net/manual/ja/language.oop5.prope …
=> 「ダブルアロー」
http://php.net/manual/ja/language.types.array.php
読み方が分かればググルことできますよね。
質問3 リファレンス読んでください。リファレンスに書いてあるようなことをいちいち聞くというのは聞くほうも答えるほうも時間の無駄です。
http://php.net/manual/ja/pdo.setattribute.php
回答ありがとうございます
なんとなくわかりました
しかし、PHP 5.3.6以前では、接続文字列にcharsetを指定できないようです
みなさんは文字コードどうしてるんでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP DBのハッシュ化したパスワードをpassword_verifyで戻し照合したのですが上手く行きません 2 2023/02/06 13:24
- PHP PHP一覧表示した項目にリンクをはりたい 1 2023/07/12 17:08
- PHP 重複を防ぐ記述について教えて下さい。 3 2023/04/03 14:35
- PHP PHPSpreadsheetによる書き出し時のページネーション方法について 1 2023/03/20 10:35
- MySQL 参考書に従って入力したつもりでしたが、最後はエラーがでました。 1 2022/09/28 03:45
- MySQL SQL任意に並び替えをしたい 2 2023/08/28 10:47
- PHP 【PHP/MySQL】コード上で生成したクエリを基に集計クエリを作りたい 1 2022/07/28 15:06
- PHP php my adminより取り出したデータ表示 2 2022/06/15 11:56
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PHP PHP MySql ページング 2 2022/09/20 06:38
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
phpのエラーについてです
-
mysql_fetch_objectのエラー
-
XAMMPが起動しません。
-
PHPから、MySQL内に日本語名の...
-
MySQLへデータ入力時の文字化け
-
リストから詳細画面に遷移する...
-
MySQLに登録したデータをPHPで...
-
MYSQLと連動したBASIC認証について
-
連想二次元配列のUNIXTIMEでの...
-
これでSQLインジェクション対策...
-
検索結果の分割表示時のSQLエラー
-
PHP と Mysql の連携時に発生す...
-
PHPの記述で値が取れません。
-
DBから抜き出した値を表示する方法
-
ランダム文字列をDBにINSERT
-
変数にNULLを代入したい
-
php テーブルを作れない
-
DBで検索結果に該当するデータ...
-
phpでmysqlを使ってデータベー...
-
OracleからAccessへのインポート
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
phpのエラーについてです
-
テーブルに入っているデータと...
-
sqlから多次元配列に要素を格納...
-
PHPで絞り込み検索結果の件数を...
-
MySQLのデータを使ってプルダウ...
-
XAMMPが起動しません。
-
mysql_fetch_objectのエラー
-
mysql_resultのエラー
-
stringaddslashes 半角¥が消える
-
CSVをダウンロードさせた際、CS...
-
「mysqlclient」の事が分からな...
-
XAMPPで画面が真っ白になります。
-
会員登録したらメールが送られ...
-
PHP+mysqlでSQL文に文字数制限...
-
連想二次元配列のUNIXTIMEでの...
-
PHP/MySQL SQLエラーについて。
-
変数同士の引き算が出来ない
-
PHPでMySQLのレコードを削除したい
-
すいません。
-
インクルードによる不具合
おすすめ情報