• ベストアンサー
  • すぐに回答を!

○LinuxでのPDO利用

  • 質問No.6007395
  • 閲覧数599
  • ありがとう数14
  • 回答数2

お礼率 80% (36/45)

○LinuxでのPDO利用

PHPで次のようなコードを記述しています。

-------------------------------------------------------------

$db = 'mysql:host=localhost;dbname=dbn';
$login = 'user';
$password = 'pass';

try {

$pdo = new PDO($db , $login, $password);

$sth = $pdo->prepare("SELECT * FROM USER WHERE NAME=? AND PASSWORD=?");
$sth->bindParam(1, $name);
$sth->bindParam(2, $password);
$sth->execute();


while($row = $sth->fetch(PDO::FETCH_ASSOC)){
$user[] = $row;
}

}catch(PDOException $e){
var_dump($e);
}

-------------------------------------------------------------

このコードがWindowsでxampp上で動かすと問題ないんですが、
Linux上で動かすと$sth->execute();でfalseが返ってきて、
値を取得できません。

設定の問題だと思うのですが、
どこにその問題があるのかが分かりません。

環境は
CentOS
apache 2.0
php 5.3
mysql 5.1


PDO driver,pdo_mysqlもphpinfo()から確認できてます。
php.iniにも
extension=pdo.so
extension=pdo_mysql.so
の記述はあります。

どなたか分かる方、宜しくお願いします。

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

  • 回答No.2
  • ベストアンサー
徹底的にコードを分解し、エラーが発生していないか追求しなければなりません。

接続には問題がないと言うことなら、バインド無しの簡単なクエリを発行してみることです。
例)"SELECT * FROM `user`"
http://www.php.net/manual/ja/pdo.query.php

正しくステートメントオブジェクトが得られるようなら、次のステップとして、プリペアメソッドの動作を確認します。
http://www.php.net/manual/ja/pdo.prepare.php

ここでは、接続のオブジェクトに対する設定により、真偽値か例外が返ってきます。好きなほうで確認してください。バインド関係も一つ一つ確認します。

準備が整ったところで、ステートメントを実行します。これもまた設定により返ってくるものが変わってくるでしょう。本当にここでのみエラーが出るということであれば、このタイミングで「PDOStatement::errorCode()」や「PDOStatement::errorInfo()」を利用して内容を確認してください。

それでも上手くいかない場合、他のやり方を試してみます。

CentOS にログインし、CLI で mysql クライアントを使って同じクエリを発行してみる。
PDO ではなく、別の拡張モジュールを経由してクエリを発行してみる。

既定値で例外を投げるのはコンストラクタのみであるようにマニュアルからは読み取れます。
追加の設定をしないのであれば、確認はトライキャッチ制御構造の外でするのがわかりやすいでしょう。
コンストラクタに driver_options を設定し、例外を投げるようにすれば、このままで捕捉できるのだと思います。

スッキリしたいですね!
お礼コメント
s_h_i_b_a

お礼率 80% (36/45)

samchayさん、回答ありがとうございました。

お礼が遅れまして申し訳ありませんでした。
apacheそのものが403エラーで接続不可になってしまい、その解決に追われていました。

で結論としては解決?しました。コードは変わりなしです。

上で言ったapacheがSELinuxがらみの問題で無効化したんですが、
その後から普通にDBから値をもってこれました(--;

しかしSELinux有効だと、そもそもapacheが繋がらないはずなのに、
質問したときはapacheはOKでmysqlはNG・・・
若干スッキリしないんですが、今のところ非常にスムーズに動作しているので、
とりあえず解決として、経過を追ってみたいと思います。

何度も回答頂いて誠にありがとうございました。
投稿日時:2010/07/03 17:46

その他の回答 (全1件)

  • 回答No.1
既定の動作では例外を捕捉出来ないようなことが書かれております。接続の実体を生成した後に必要な属性値を設定することにより、意図する例外の捕捉が可能となるのではないでしょうか。

例外を捕捉する以外にも、「PDO::errorCode()」「PDO::errorInfo()」、「PDOStatement::errorCode()」「PDOStatement::errorInfo()」を利用してエラーの内容を確認することも出来るようです。適所にコードを追加して、新たな情報を得ることにより解決の糸口が見つかるものと考えます。
お礼コメント
s_h_i_b_a

お礼率 80% (36/45)

samchayさん、解答有難うございます。

いろいろなところに入れて、故意にエラーを起こしてもみましたが、
特に問題らしい問題は見つからなかったです。

特にエラーは発生していないけど、
値は返ってこない。
sqlは間違っていないはずなのですが。

もう少し考えてみたいと思います。
投稿日時:2010/07/01 12:28
関連するQ&A

その他の関連するQ&Aをキーワードで探す

ページ先頭へ