【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等)・フレームワークは各該当スレへ
0951nobodyさん
2011/10/29(土) 12:47:12.97ID:???話をややこしくしてるだけなのに擁護する理由がわからない
質問者が何を求めてるのか理解できないなら回答すべきでない
0952nobodyさん
2011/10/29(土) 13:35:53.55ID:???0954nobodyさん
2011/10/29(土) 14:16:19.35ID:???0957nobodyさん
2011/10/29(土) 16:14:14.78ID:???function & f() { return $_SESSION['hoge']; }
$hoge =& f();
0958nobodyさん
2011/10/29(土) 18:42:22.61ID:hOXCKMki@だけエンコードというのも駄目でした。アプリにわたす時点で@が%40になったままです
status=@john hello!というのはURLの最後につけてget方式でわたすわけですよね?
それもダメでした
curl_setopt($c, CURLOPT_POSTFIELDS, $params);
curlにパラメータをセットしてるので、これから先はPHPそのものをいじらなきゃいけなくなり
自分にはとても無理です
オプションの設定で解決できる、もしくは解決法がある問題なんでしょうか
curlのマニュアルを読んでると、コマンドラインから操作する場合はパラメータ1つ一つに
パラメータのテキスト;type=text/plain という形でデータ型を明示できるみたいですが
"@john hello!;type=text/plain"としたらくっつけたタイプ部分まで本文として送信してしまいました
何か良いアイディアないでしょうか…
0960nobodyさん
2011/10/29(土) 19:44:44.39ID:???これで試してみ
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
0961nobodyさん
2011/10/29(土) 20:07:18.84ID:hOXCKMkiありがとうございます
これはGETで対象サーバに送信することになるんですよね?
エラーを起こしたので調べてみたら相手側がPOSTのデータしか受け付けない仕様になってるようで
無理っぽいです
しょうがないですね…
残念ですが諦めます。他の人たちもありがとうございました
0962nobodyさん
2011/10/29(土) 20:26:10.60ID:TSLcC47t1から2は共通処理の重複をなくして、
2から3はif文より早いとされるswitch文でかいてみました。
$hoge&&$piyoの状態では何もしません。
こんな感じでだんだんいい感じになってますでしょうか?
だめだしあればお願いします。
1.
if($hoge && !$piyo) 共通処理 処理 共通処理
elseif($piyo && !$hoge) 共通処理 処理 共通処理
2.
$a=0; $b=0;
if($hoge) $a=1;
if($piyo) $b=1;
if(($a+$b)==1)
共通処理
if ($a) 処理
if ($b) 処理
共通処理
3.
$todo=0; $count=0;
if($hoge) $todo=1; $count++;
if($piyo) $todo=2; $count++;
if($count==1)
共通処理
switch($todo)
case 1: 処理 break;
case 2: 処理 break;
共通処理
0964nobodyさん
2011/10/29(土) 20:42:56.15ID:???こっちじゃ出来るけど CURLOPT_POST = true と併せて試したか?
そもそもCURLを諦めてストリームコンテキストを使う手もある
http://www.php.net/manual/ja/function.stream-context-create.php
0966nobodyさん
2011/10/29(土) 20:57:47.47ID:UZeloiLz設計に無理があるといったらそうなのですが
あるフォームでsubmitボタンを複数配置して
押されたボタンのname値によって処理を分けています
ようするにvalueは飾りなのですが
こういう設計ってありですか?
あと普通はブラウザから1つのボタンを押してnameが1つ送られてくるわけですが
例えば上の人みたいにcurl使って複数のnameをPOSTしてきた場合困るのですが
想定外の普通のブラウザからの操作以外も考慮してコーディングすべきでしょうか?
0967962
2011/10/29(土) 21:02:16.86ID:???確かこんな書き方があったなぁと・・・32行に収めるために無理して書きました。
意味はだいたい分かって頂けると思ったのですが、
コードの意味が分からなかったらすみません。
0969nobodyさん
2011/10/29(土) 21:23:02.90ID:???操作対象1つにつき1ボタン
if ($_POST['post']) {
} else if ($_POST['edit']) {
} else if ($_POST['delete']) {
}
上から重症になりにくい順で実行してた
セレクトボックス+ラジオボックスにして
操作選んで操作対象選んで
if ($_POST['mode'] == 'post') {
} else if ($_POST['mode'] == 'edit') {
} else if ($_POST['mode'] == 'delete') {
}
にしたほうがよかったのはわかってても
ワンクリの魅力があるから難しいね
0970nobodyさん
2011/10/29(土) 21:44:33.98ID:???0971nobodyさん
2011/10/29(土) 21:53:47.02ID:???うう、ご親切にすみません
上で書いた箇所だけの問題だと思ったので書かなかったんですが
tmhOAuthを使ったOAuth認証とあわせてtmhOAuthの中で実行されるcURLの処理なんです
>>960さんのやり方だとパラメータの送信リクエスト自体はOKなようですが
oAuth認証が通らないといわれてしまい、大前提で失敗してました
しかし、PearのHTTP_request2とHTTP_OAuthを組み合わせたらいけるかも!
頑張ってみます
ありがとうございました
0973nobodyさん
2011/10/30(日) 01:58:47.46ID:???if (!!$hoge ^ !!$piyo) {
共通処理
if ($hoge) 処理
if ($piyo) 処理
共通処理
}
0974nobodyさん
2011/10/30(日) 05:32:57.40ID:3CLjR3Ux0975nobodyさん
2011/10/30(日) 12:29:42.57ID:???0976nobodyさん
2011/10/30(日) 13:20:36.61ID:ASGcT8eGphp-mysqlが必要としているlibmysqlclient.so.15のバージョンが違うのですが
libmysqlclient.so.15をどこかから探してきて
ライブラリのディレクトリに入れるだけでちゃんと動きますか?
0977nobodyさん
2011/10/30(日) 13:26:05.39ID:M82Zs8HPどうしたらいいですか?
php.iniで時間エリアの指定とかhttpd再起動とかはしたんですがなおりません
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を超えています。これ以上書き込みはできません。