【PHP】下らねぇ質問はID出して書き込みやがれ 111
レス数が1000を超えています。これ以上書き込みはできません。
過去スレ、関連スレ、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:???0980nobodyさん
2011/10/30(日) 15:43:34.27ID:???$array = $array.font(X=X[1] == "hit");
とかないんだっけ?
0981nobodyさん
2011/10/30(日) 15:45:39.71ID:???$array = $array.find(X=X[1] == "hit");
0982nobodyさん
2011/10/30(日) 15:46:39.62ID:???わすれてくれ
=>
0983nobodyさん
2011/10/30(日) 17:51:51.12ID:???フォーム以外からのPOST対策ってのはさすがに無理があると思う。
例えばDBの内容をアップデートするときとか、
値の型ぐらいは検査するにしても、アップデート対象の主キーが存在するかまで、
サブクエリでいちいちアップデート前検索とかやってられん。
かといってエラー起きるとログがたまるのも困るし難しいところ。
あらゆるケースを想定したプログラムも妥協点が必要だな。
0986nobodyさん
2011/10/31(月) 00:59:24.06ID:hS+EiQVLtry{
$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:???ttp://www.php.net/manual/ja/class.pdoexception.php
>PDO が発するエラーを表します。あなた自身が書いたコードから PDOException をスローしてはいけません。 PHP の例外についての詳細な情報は、 例外 を参照ください。
>MySQLなどのDBが発行したエラーはどうやったら取得できるのでしょうか?
PDOStatement->errorInfo
0989986
2011/10/31(月) 02:38:29.80ID:hS+EiQVL自分で例外スローはダメなんですね・・・
とりあえず例外使わないように以下のコードで試してみました。
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:RUtVjBFdprivate $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インスタンスです。
可能であれば教えて下さい。
0991990
2011/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:???$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/
0997nobodyさん
2011/10/31(月) 06:22:01.79ID:???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();
}
}
0998986
2011/10/31(月) 10:15:55.08ID:hS+EiQVLそのソースをそのまま実行してみましたが、ダメでした。。。
空の配列が返ってきます。。。。
php.iniの設定とかでこれが必要だった、みたいなものってあるのでしょうか?
0999nobodyさん
2011/10/31(月) 11:13:32.58ID:???・「正しい」sql文を発行した場合、予想通りの結果が返ってくるか?
・OS、PHPやDBのバージョンは?
・ちゃんと設定した?(オンラインマニュアルの「インストール手順」を参照 : ttp://php.net/manual/ja/book.pdo.php )
1000nobodyさん
2011/10/31(月) 14:24:57.91ID:Z5/PdDI910011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。