トップページphp
1001コメント326KB

【PHP】下らねぇ質問はID出して書き込みやがれ 111

レス数が1000を超えています。これ以上書き込みはできません。
0001 忍法帖【Lv=40,xxxPT】 2011/09/29(木) 02:56:06.94ID:???
質問者はまず>>1を良く読むこと(必須!)
過去スレ、関連スレ、FAQなどは>>2-10辺り
次スレは>>980が立てる。10分以内に立たない場合、宣言してから立てたい人が立てること。

◆前スレ
【PHP】下らねぇ質問はID出して書き込みやがれ 110
http://hibari.2ch.net/test/read.cgi/php/1314692611/

◆質問用テンプレ
【OS名】CentOS
【PHPのバージョン】5.3
【連携ソフトウェア】MySQL ImageMagick
【質問内容】

◆質問する時の注意
・ スレを上げて自分のIDを表示させること。(メール欄に何も記述しない。専ブラのsageチェックを外す)
・ 己の行った操作、変更などを詳しく明記すること。
・ エラーメッセージはそのまま表記すること。「エラーが出ます」だけでは回答不可。
・ 質問者として、態度をわきまえること。
・ 事前に関連リンクの公式マニュアル、リファレンス本くらいはちゃんと目を通しておくこと。
(PHPで最良の教本はこの公式マニュアル。市販の書籍は嘘が多いので鵜呑みにしない。)

◆質問後の注意
・2回目以降は最初に質問した際のレス番号を入れて、偽者防止に必ずIDを表示させること。
・解決しなくても回答をもらった場合はお礼を言うこと。
 (荒らし、煽りは除く。煽られたときも、無闇に反論せずスルーすること。)

◆回答者への注意
・誰にレスしているのか分からないと困るので、>>(アンカー)をつけて回答すること。

【その他諸注意】
・SQL・正規表現・PEAR・テンプレート(Smarty等)・フレームワークは各該当スレへ
0978nobodyさん2011/10/30(日) 13:56:53.00ID:???
そういうのはOSとか書けよバカ
0979nobodyさん2011/10/30(日) 15:34:46.50ID:???
>>977
10分とかだと、時計が合ってない説が最有力
0980nobodyさん2011/10/30(日) 15:43:34.27ID:???
PHPに
$array = $array.font(X=X[1] == "hit");
とかないんだっけ?
0981nobodyさん2011/10/30(日) 15:45:39.71ID:???
あれ、なぜfont・・・
$array = $array.find(X=X[1] == "hit");
0982nobodyさん2011/10/30(日) 15:46:39.62ID:???
あーもうやだ
わすれてくれ

=>
0983nobodyさん2011/10/30(日) 17:51:51.12ID:???
>>966
フォーム以外からのPOST対策ってのはさすがに無理があると思う。
例えばDBの内容をアップデートするときとか、
値の型ぐらいは検査するにしても、アップデート対象の主キーが存在するかまで、
サブクエリでいちいちアップデート前検索とかやってられん。
かといってエラー起きるとログがたまるのも困るし難しいところ。
あらゆるケースを想定したプログラムも妥協点が必要だな。
0984nobodyさん2011/10/30(日) 18:01:18.76ID:???
>>979
どことどこの時計が合ってないの?
0985nobodyさん2011/10/30(日) 20:22:30.33ID:???
>>958
get方渡すわけじゃないよ。
配列いれるとこにそういう形式の文字列入れるんだが、もういっか。
0986nobodyさん2011/10/31(月) 00:59:24.06ID:hS+EiQVL
PDOでのエラーハンドリングがうまくいきません

try{
$con = new PDO($dsn, $user, $password);
$con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e){
echo $e->getMessage();
}

try{
$sql = "SELECT * FROM :table";
$stmt = $con->prepare($sql);
$stmt->bindValue(":table","testtable");
if($stmt->execute()){
$info = $stmt->fetch(PDO::FETCH_ASSOC);
var_dump($info);
}else{
throw new PDOException("sql error occured.");
}
}catch(PDOException $e){
echo $e->errorInfo();
}

最初の
$con = new PDO($dsn, $user, $password);
の時点でDBのユーザー名・パスワードが違うなどでエラーが発生した場合は、
PDOExceptionがthrowされて $e->getMessage() でエラーメッセージが取得出来ます。

ですが、sqlの文法が違う、指定したテーブルがないなど、SQL発行時点でのエラーメッセージが取得できません。
例外をキャッチすることは出来るのですが、$e->errorInfo() は空の配列が帰ってきてしまいます。
MySQLなどのDBが発行したエラーはどうやったら取得できるのでしょうか?
0987nobodyさん2011/10/31(月) 01:13:35.16ID:4yF1+PIi
共有モジュールの互換性ってどのくらいまであるのでしょうか?
たとえばPHP5.2でコンパイルされたものを5.3で使うのはさすがにまずいと思いますが
PHP5.3.3用をPHP5.3.8に使うのは大丈夫でしょうか?
0988nobodyさん2011/10/31(月) 01:46:46.15ID:???
>>986
ttp://www.php.net/manual/ja/class.pdoexception.php
>PDO が発するエラーを表します。あなた自身が書いたコードから PDOException をスローしてはいけません。 PHP の例外についての詳細な情報は、 例外 を参照ください。

>MySQLなどのDBが発行したエラーはどうやったら取得できるのでしょうか?
PDOStatement->errorInfo
09899862011/10/31(月) 02:38:29.80ID:hS+EiQVL
>>988
自分で例外スローはダメなんですね・・・
とりあえず例外使わないように以下のコードで試してみました。

try{
$con = new PDO($dsn, $user, $password);
$con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e){
echo $e->getMessage();
}

$sql = "SELECT * FROM :table";
$stmt = $con->prepare($sql);
$stmt->bindValue(":table","testtable");

$stmt->execute();

$err = $stmt->errorInfo();
print_r($err);


が、これでもやはり空の配列が帰ってくるだけです。。。
$stmt->errorCode()も00000というコードが帰ってきて終わりでした。。。
0990nobodyさん2011/10/31(月) 04:59:28.79ID:RUtVjBFd
class Hoge {
 private $con;
 function __construct() {
  $this->con = new PDO(DSN);
 }
 function getTest() {
  $retval = array();
  foreach ($this->con->query("select test from t where 1") as $row) {
   $retval[] = $row["hoge"];
  }
  return $retval;
 }
}

これを

class Hoge {
 static function getTest() {
  $retval = array();
  foreach (MyDB::getResource()->query("select test from t where 1") as $row) {
   $retval[] = $row["hoge"];
  }
  return $retval;
 }
}

こんな感じに変えたいのですが、Hogeをインスタンス化して->でアクセスする既存のスクリプトに影響を与えず
インスタンス化しないでもアクセスできるように変えたいのですがどうすればよいでしょうか?
MyDB::getResource()はPDOインスタンスです。
可能であれば教えて下さい。
09919902011/10/31(月) 05:01:17.77ID:RUtVjBFd
他にも間違いあるかもしれませんが
>$retval[] = $row["hoge"];
ではなくて
$retval[] = $row["test"];
ですね。
すみません。

次スレ立ててきます
0992990 忍法帖【Lv=7,xxxP】 2011/10/31(月) 05:04:56.76ID:RUtVjBFd
すみませんなんか立てれませんでした。
他の方お願いします。
0993nobodyさん2011/10/31(月) 05:12:09.73ID:???
立てるわ
0994nobodyさん2011/10/31(月) 05:16:05.87ID:???
try{
$stmt->execute();
}catch (PDOException $e){
$err = $stmt->errorInfo();
print_r($err);
}
0995nobodyさん2011/10/31(月) 05:16:34.24ID:???
立てたわ

次スレ
http://hibari.2ch.net/test/read.cgi/php/1320005469/
0996nobodyさん2011/10/31(月) 05:17:35.68ID:???
>>994 -> >>989
0997nobodyさん2011/10/31(月) 06:22:01.79ID:???
>>990
MyDBはシングルトンにすることで異論はないかと。

getTestメソッドについては、staticメンバメソッドをインスタンスメソッドとして呼び出す
(static function getTestとした場合に、 $obj->getTest() )
ことが可能ではあるけれど、これが合法だったか法の抜け穴だったか覚えてないので、こうする。
class Hoge {
 static function foo() {
  $retval = array();
  foreach (MyDB::getResource()->query("select test from t where 1") as $row) {
   $retval[] = $row["hoge"];
  }
  return $retval;
 }
 function getTest() {
return self::Hoge();
}
}
09989862011/10/31(月) 10:15:55.08ID:hS+EiQVL
>>994,>>996
そのソースをそのまま実行してみましたが、ダメでした。。。
空の配列が返ってきます。。。。
php.iniの設定とかでこれが必要だった、みたいなものってあるのでしょうか?
0999nobodyさん2011/10/31(月) 11:13:32.58ID:???
>>998
・「正しい」sql文を発行した場合、予想通りの結果が返ってくるか?
・OS、PHPやDBのバージョンは?
・ちゃんと設定した?(オンラインマニュアルの「インストール手順」を参照 : ttp://php.net/manual/ja/book.pdo.php )
1000nobodyさん2011/10/31(月) 14:24:57.91ID:Z5/PdDI9
1000
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。