トップページ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等)・フレームワークは各該当スレへ
0951nobodyさん2011/10/29(土) 12:47:12.97ID:???
一人で頑張るな
話をややこしくしてるだけなのに擁護する理由がわからない
質問者が何を求めてるのか理解できないなら回答すべきでない
0952nobodyさん2011/10/29(土) 13:35:53.55ID:???
くらすのべんきょうしなさいっていつもいわれてたでしょ!
0953nobodyさん2011/10/29(土) 13:44:28.49ID:???
>>878
パスの名前は2ちゃんの管理会社が使いそうではある。
どこの画面で?
0954nobodyさん2011/10/29(土) 14:16:19.35ID:???
beあたりじゃねーの?たしかあそこらへんがphpだったはずだけど
0955nobodyさん2011/10/29(土) 15:27:29.93ID:???
>>951は何と戦ってるんだろう
0956nobodyさん2011/10/29(土) 15:31:59.30ID:???
>>955は何と戦ってるんだろう
0957nobodyさん2011/10/29(土) 16:14:14.78ID:???
>>938
function & f() { return $_SESSION['hoge']; }
$hoge =& f();
0958nobodyさん2011/10/29(土) 18:42:22.61ID:hOXCKMki
>>944
@だけエンコードというのも駄目でした。アプリにわたす時点で@が%40になったままです
status=@john hello!というのはURLの最後につけてget方式でわたすわけですよね?
それもダメでした

curl_setopt($c, CURLOPT_POSTFIELDS, $params);
curlにパラメータをセットしてるので、これから先はPHPそのものをいじらなきゃいけなくなり
自分にはとても無理です
オプションの設定で解決できる、もしくは解決法がある問題なんでしょうか
curlのマニュアルを読んでると、コマンドラインから操作する場合はパラメータ1つ一つに
パラメータのテキスト;type=text/plain という形でデータ型を明示できるみたいですが
"@john hello!;type=text/plain"としたらくっつけたタイプ部分まで本文として送信してしまいました

何か良いアイディアないでしょうか…
0959nobodyさん2011/10/29(土) 18:55:50.54ID:???
>>957
session_start();
0960nobodyさん2011/10/29(土) 19:44:44.39ID:???
>>958
これで試してみ
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
0961nobodyさん2011/10/29(土) 20:07:18.84ID:hOXCKMki
>>960
ありがとうございます
これはGETで対象サーバに送信することになるんですよね?
エラーを起こしたので調べてみたら相手側がPOSTのデータしか受け付けない仕様になってるようで
無理っぽいです
しょうがないですね…
残念ですが諦めます。他の人たちもありがとうございました

0962nobodyさん2011/10/29(土) 20:26:10.60ID:TSLcC47t
書き方の相談で申し訳ないですが、上から下の書き方へ変えていきました。
1から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;
 共通処理
0963nobodyさん2011/10/29(土) 20:27:17.74ID:???
>>961
あきらめたら試合終了だよ
さぁfsockopenでゴリゴリ書こうか
0964nobodyさん2011/10/29(土) 20:42:56.15ID:???
>>961
こっちじゃ出来るけど CURLOPT_POST = true と併せて試したか?
そもそもCURLを諦めてストリームコンテキストを使う手もある
http://www.php.net/manual/ja/function.stream-context-create.php
0965nobodyさん2011/10/29(土) 20:57:25.75ID:???
>>962
お前コード動かしてないだろ
0966nobodyさん2011/10/29(土) 20:57:47.47ID:UZeloiLz
人様に使ってもらうアプリケーションを作っています
設計に無理があるといったらそうなのですが
あるフォームでsubmitボタンを複数配置して
押されたボタンのname値によって処理を分けています
ようするにvalueは飾りなのですが
こういう設計ってありですか?
あと普通はブラウザから1つのボタンを押してnameが1つ送られてくるわけですが
例えば上の人みたいにcurl使って複数のnameをPOSTしてきた場合困るのですが
想定外の普通のブラウザからの操作以外も考慮してコーディングすべきでしょうか?
09679622011/10/29(土) 21:02:16.86ID:???
普段こういう書き方はしないのでそのままでは動くかはわかりません。
確かこんな書き方があったなぁと・・・32行に収めるために無理して書きました。
意味はだいたい分かって頂けると思ったのですが、
コードの意味が分からなかったらすみません。
0968nobodyさん2011/10/29(土) 21:08:28.71ID:???
>>967
なるべくID出して
レスをたどりやすいから
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:???
button要素にしてvalueで振り分ければ
0971nobodyさん2011/10/29(土) 21:53:47.02ID:???
>>963,964
うう、ご親切にすみません
上で書いた箇所だけの問題だと思ったので書かなかったんですが
tmhOAuthを使ったOAuth認証とあわせてtmhOAuthの中で実行されるcURLの処理なんです
>>960さんのやり方だとパラメータの送信リクエスト自体はOKなようですが
oAuth認証が通らないといわれてしまい、大前提で失敗してました

しかし、PearのHTTP_request2とHTTP_OAuthを組み合わせたらいけるかも!
頑張ってみます
ありがとうございました
0972nobodyさん2011/10/29(土) 22:02:52.19ID:???
>>957
ええっ!!そうなの!?
そんな記法はじめて知ったよ。
ありがとう!
0973nobodyさん2011/10/30(日) 01:58:47.46ID:???
>>962
if (!!$hoge ^ !!$piyo) {
共通処理
if ($hoge) 処理
if ($piyo) 処理
共通処理
}
0974nobodyさん2011/10/30(日) 05:32:57.40ID:3CLjR3Ux
複数のエラーコードを返すような関数ってphp的にあまりよくないでしょうか?
0975nobodyさん2011/10/30(日) 12:29:42.57ID:???
用途によるので良くないも糞もないと思いますが
0976nobodyさん2011/10/30(日) 13:20:36.61ID:ASGcT8eG
MySQLに同梱のlibmysqlclient.so.18と
php-mysqlが必要としているlibmysqlclient.so.15のバージョンが違うのですが
libmysqlclient.so.15をどこかから探してきて
ライブラリのディレクトリに入れるだけでちゃんと動きますか?
0977nobodyさん2011/10/30(日) 13:26:05.39ID:M82Zs8HP
サーバのdateで返す時間とphpのdate()で返す時間が10分くらいズレてるんだけど
どうしたらいいですか?
php.iniで時間エリアの指定とかhttpd再起動とかはしたんですがなおりません
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を超えています。これ以上書き込みはできません。