【PHP】下らねぇ質問はここに書き込みやがれ 24
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/07/07(金) 14:54:53ID:KnVubDvEここならお前の下らない質問に回答があるかも知れません。
まず読め【PHP マニュアル】
http://www.php.net/manual/ja/
過去スレは>>2
0540nobodyさん
2006/07/17(月) 10:02:03ID:???echoだと値が帰ってくるんだですが、
return $matches[0][0];
returnだと値が帰ってきません。
retuneは配列の値を表示することができないんでしょうか?
0541nobodyさん
2006/07/17(月) 10:30:25ID:???function hoge(){
// $matches配列の生成
return $matches[0][0]; // 値を返す
}
echo hoge(); // 値を表示する
なら表示されるはずだが。
0542nobodyさん
2006/07/17(月) 10:36:03ID:???ちょっと意味不明かと思いますが、
具体的には以下のIFでループが発生しました。
(ただ、再現性が著しく低いです。というか再現できなかったと思います)
$temp = explode( "/" , $_SERVER['SCRIPT_NAME'] );
$start = count( $array ); // $arrayは配列です。
for( $i=$start; $i < (count($temp) -1); $i++ ) {
// 変数 $i にアクセスしない処理
}
なんかやらかしてるでしょうか?
それともやっぱり環境なのかな?
0543nobodyさん
2006/07/17(月) 10:45:33ID:???0544nobodyさん
2006/07/17(月) 10:45:40ID:???0546nobodyさん
2006/07/17(月) 10:50:28ID:???0547nobodyさん
2006/07/17(月) 10:57:33ID:???で、できました
0548nobodyさん
2006/07/17(月) 10:58:04ID:???意味がわからないって事かな?ごめん 2ch語?よくしらないので
>>542の IF の記述法に問題があるのか。という点と、
例えば $array 等に NULL や文字列、オブジェクトなどの予想外の要素を
代入した場合に素直に動くのか、それとも予想もできない動作をするのか
等の情報が知りたかったと言うことです。
何かのネタだったらごめん。
ちょっと解説してくれると助かる。よかったらだけど…
0549nobodyさん
2006/07/17(月) 11:09:25ID:???ウルトラマンが悩みを聞いてあげるスレッド
1 名前:('A`) 2005/05/20(金) 21:05:58
/ || :ヽ
┌|(⌒ヽ :|| ..:⌒: |┐ / ̄ ̄ ̄ ̄ ̄ ̄ ̄
|::|::ヽ.__:):||(___ノ ::|::| │
|:|: .. :|| .. |:| │
:|: .. || ..|| < ジュワ!
:\ [_ ̄] /::| │
:: |\|_|_|_|_/:::| \________
2 名前:('A`) 2005/05/20(金) 21:06:49
ジュワワワジュワワ、
ジュワジュワジュジュワワワワワ?
3 名前:('A`) 2005/05/20(金) 21:07:27
/ || :ヽ
┌|(⌒ヽ :|| ..:⌒: |┐ / ̄ ̄ ̄ ̄ ̄ ̄ ̄
|::|::ヽ.__:):||(___ノ ::|::| │
|:|: .. :|| .. |:| │
:|: .. || ..|| < >>2日本語でおk
:\ [_ ̄] /::| │
:: |\|_|_|_|_/:::| \_______
0550542
2006/07/17(月) 11:11:26ID:???通常は素直に動く事は解っています。NULLを0と等価とみなし、
オブジェクトではフィールド数を返すなど。
ただ、たまーに変になる可能性がちょっとでもあるのかな?
と言うことが知りたかったというか、ごめんよ日本語下手で。
まずは日本語を勉強しろって事だな。正直スマンカッタ
0552nobodyさん
2006/07/17(月) 11:14:12ID:???0553nobodyさん
2006/07/17(月) 11:31:29ID:???>>542の場合、$startに数字じゃなく文字が入ったりすると永久ループする可能性があるけどね。
これが本当に$startはcount()の結果以外は入らないようになってるのならちょっと分からんけど。
他にあるとしたらループの中で$tempを破壊してしまうケースくらいか。
ま、ifは変な挙動をしたりしない。
しかしPHPの変数が様々な型を自動変換するのをプログラマが忘れてることは多い。
変な挙動に見えても大抵はそれは「仕様」だ。
0554nobodyさん
2006/07/17(月) 11:34:11ID:???>>542では、終了の値が有限であり、(ファイル名がもの凄い長いとかじゃないです)
かつ、開始の値に関数 count() を利用する為、負の値は通常取らないはず。
この条件でどうして無限ループが発生したのかが疑問なんです。
Nullチェックなりなんなりしろってことは、count() は極稀に負の値を
返したりする事がある。って事かな?
その場合、IFの開始、終了値の制限範囲を予め定めるってチェックを
する必要があるけど、それって普通しないですよね?
ただの事故か、それとも潜在的に無限ループの可能性があるのかが知りたかっただけなんです。
0556nobodyさん
2006/07/17(月) 11:40:14ID:???0557nobodyさん
2006/07/17(月) 11:50:47ID:???あ、そうか。ありがとうございます。かなり参考になりました。
変数の型には留意しているつもりなんですが、やっぱり見えないところで
いろいろ変換されているかもしれません。
>>556
ループ処理はこれだけだったんです。
変数代入は IFの直前で他の値が入る隙はなかったんです。
一番可能性が高いのは、処理中に $temp に何かいれた。かな?
(無論、そんな事はしていないつもりですが)
再現性が殆ど皆無である為、ただの事故だったかも知れませんが
変数の型に常に留意しなければならないなど、いろいろ参考になりました。
ありがとうございました。
0558nobodyさん
2006/07/17(月) 11:52:27ID:???0559nobodyさん
2006/07/17(月) 12:07:52ID:???スクリプトって寛大に受け入れてとりあえず動いてくれるけど、
それが難しく感じる事の方が個人的には多い。
現実的で有効な対処法は、ソースを第三者にみて評価してもらうかな。
愚問に付き合ってくれて、みなさんありがとうございました。
0560nobodyさん
2006/07/17(月) 12:47:23ID:???<form method = "POST" action = "test.php">
<input type = "checkbox" name = "type" value = "a=4,b=7" checked>良かった<br>
<input type = "checkbox" name = "type" value = "b=2,c=3" >悪かった<br>
<input type = "checkbox" name = "type" value = "c=3" >その他
<input type ="submit" value="投稿する"><br>
</form>
フォームを作っているのですが
一つのチェックボックスに複数の数値を持たせたいのですが
どのようにしてPHPは処理すればいいでしょうか?
0561nobodyさん
2006/07/17(月) 13:11:17ID:???0562nobodyさん
2006/07/17(月) 13:18:46ID:???$type = array();
foreach(explode(",", $_POST['type']) as $t) {
list($k, $v) = explode("=", $t);
$type[$k] = $v;
}
これでa=4,b=7を選択すると
$type['a'] = 4
$type['b'] = 7
の状態になると思う。
>>561
このくらいふつーだろ。
0564nobodyさん
2006/07/17(月) 15:33:09ID:???仮に処理できるとしても、そんなクソな設計は止めたほうがいい。
複数の値を持たせなきゃならん必要性があるのか?
0565560
2006/07/17(月) 16:19:00ID:ab1cz1rX例えば良かったと悪かったが選択されていたら
a=4,b=9,c=3となるようにしたいです。
そして、それぞれのa,b,cの値によって次の処理をしたいのですが
考え方が間違っているのでしょうか?
0566560
2006/07/17(月) 16:24:35ID:ab1cz1rXこれらは例ですので気にしないでください。
混乱させてしまったらごめんなさい。
0567nobodyさん
2006/07/17(月) 16:25:43ID:???<input type = "checkbox" name = "type" value = "1" checked>良かった<br>
<input type = "checkbox" name = "type" value = "2" >悪かった<br>
<input type = "checkbox" name = "type" value = "3" >その他
リンク先のページで、
if( $_POST['type']==1){
$a=4;
$b=9;
$c=3;
}elseif(なんたら)
ってかんじがいいと
0568nobodyさん
2006/07/17(月) 16:30:20ID:???<input type = "checkbox" name = "type" value = "a=4,b=3,c=5" checked>良かった<br>
$tmp = explode( ',', $_POST['type']);
foreach( $tmp as $val){
$aaaa = explode( '=', $val);
print_r( $aaaa);
}
0569nobodyさん
2006/07/17(月) 16:31:47ID:???$tmp を無意識に「ドル、ティムポ」って読んじゃうのもれだけ?
0570560
2006/07/17(月) 16:33:53ID:ab1cz1rX速レスありがとうございます。
PHP初心者で、>>567が自分の作ろうとしているものに適しているのかどうか
よくわからないので、localhostで試してからまた来ます。
0571nobodyさん
2006/07/17(月) 16:34:15ID:???再構成できるんだから>>560みたいなやり方も一概に悪いとは言えないと思う。
たとえばaとかbとかのキー自体がiniファイルで外部設定できるような仕組みになってれば、
いちいちプログラムを変えなくても様々なニーズに容易に対応できるようになるだろ?
0573nobodyさん
2006/07/17(月) 16:47:57ID:???name = "type[]"
にして複数のチェックボックスを配列にするといいかも。
0574560
2006/07/17(月) 16:59:52ID:ab1cz1rXすいません。勉強不足で何のことやらさっぱりです。
>>573
>なんとか診断みたいなやつかな? 設問がたくさんあるタイプのやつ。
ズバリそれです。
>name = "type[]"
>にして複数のチェックボックスを配列にするといいかも。
これもよくわかりません。
0575nobodyさん
2006/07/17(月) 17:02:26ID:???0576nobodyさん
2006/07/17(月) 17:03:28ID:???…なんできみわ"a=4,b=7"みたいな変なパラメータを指定できるようにしたいなんて思ったのかね
チェックボックスで複数指定できるようにするならname="type[]"としとかないと
複数のパラメータを受け取れないぞ。最後の1個で上書きされてしまう。
name="type"にして選択できるのはどれか1つ、ってするならtype="radio"だろ。
0577560
2006/07/17(月) 17:05:47ID:ab1cz1rX<?php
if( $_POST['type'] == 1 ){
$a=4;
$b=9;
$c=3;
}elseif( $_POST['type'] == 2 ){
$a=1;
$b=2;
$c=3;
}
echo "$a"
?>
これだと、$aはelseifの値をとってしまいます。
二つの数値を足したいのですが、どうすればいいでしょうか?
0579nobodyさん
2006/07/17(月) 17:13:11ID:???まず複数指定できるようにするなら
<input type = "checkbox" name = "type[]" value = "a=4,b=7" checked>良かった<br>
<input type = "checkbox" name = "type[]" value = "b=2,c=3" >悪かった<br>
<input type = "checkbox" name = "type[]" value = "c=3" >その他
とnameのとこに[]をつけてパラメータを配列で受け取れるようにせんと。
すると複数にチェックした場合
$_POST['type'][0] = "a=4,b=7"
$_POST['type'][1] = "b=2,c=3"
のようにセットされるようになる。
name="type"にしちゃうと2つ選択しても
$_POST['type'] = "a=4,b=7"
という値が、後ろに続いた
$_POST['type'] = "b=2,c=3"
で上書きされてしまって、結果として
$_POST['type'] = "b=2,c=3"
しかデータ自体が残らないんだから、プログラム上で足そうと思っても足しようがない。
あとは配列を順番に処理するだけだから、ちょっと考えてみれ。
0580nobodyさん
2006/07/17(月) 17:13:35ID:???たとえばhtmlのフォームのところで
<input type="checkbox" name="type[]" value="1">回答1<br>
<input type="checkbox" name="type[]" value="2">回答2<br>
<input type="checkbox" name="type[]" value="4">回答3<br>
<input type="checkbox" name="type[]" value="8">回答4<br>
ってやっておくと、submitで飛んだ先のphpで
foreach($_POST['type'] as $cb){
echo "$cb<br>" ;
}
とか出来るので便利。
あとは>>562と組み合わせるといいよ。
0582560
2006/07/17(月) 17:21:58ID:ab1cz1rXありがとうございます。
読んだだけでは、なかなか理解できなかったので
じっくり考えて見ます。
>>581
すいません。
どうやって説明すればいいのかわからなくて。
0583nobodyさん
2006/07/17(月) 17:28:32ID:???phpでrequireするのと変わらない場合もあるけどな。
htmlだけを直す、っていう方がいい場合もある。
もちろん、そうじゃない場合もある。
0584nobodyさん
2006/07/17(月) 17:50:56ID:???0586nobodyさん
2006/07/17(月) 18:27:47ID:???とりあえず複数の値をフォームで持たせるというやり方は
「間違っている」と言わざるを得ない。あるいは「良いやり方ではない」。
それでも出来るかもしれないけど、もっとシンプルでスマートで
応用の利くやり方は他にいくつかある。
「それを教えてよ」というのは無しだ。それを考えるのがプログラミングだ。
0587560
2006/07/17(月) 19:54:17ID:ab1cz1rXなかなかうまくいきません。
まだ少しプログラムを組むのは早かったかもしれません。
>>596
聞こうと思ったら先に釘を刺されてしまいましたか。
でも頑張ってみます。
0588nobodyさん
2006/07/17(月) 19:58:36ID:???0591nobodyさん
2006/07/17(月) 22:00:01ID:???フォームからは1個の値を渡す。
それをphp側で複数に切り替える。
if(answer=='1'){a=4;B=7;}
elseif(answer=='2'){b=2;c=3;}・・・
という感じで。
一般化すると。
「本当にそこで処理しなければいけないかを考えろ。」
0592nobodyさん
2006/07/17(月) 22:44:25ID:Vse0CV740593nobodyさん
2006/07/17(月) 22:46:02ID:???0594nobodyさん
2006/07/17(月) 22:53:34ID:Vse0CV74恐縮ですが、削除というのはどうすれば出来るのですか?
$_POST['msg'] = preg_replace ('^$', '', $_POST['msg']);
これじゃダメですよねぇ?
0595nobodyさん
2006/07/17(月) 23:08:01ID:???連続した改行を1つの改行に置き換えれば空行=削除に値するんじゃない?
0596nobodyさん
2006/07/17(月) 23:27:12ID:???「2個の改行」ではなく「2個以上連続した改行」な。
「空白+改行」を空行と扱うかを考える必要があるけどね。
0598nobodyさん
2006/07/18(火) 02:57:48ID:???左のバーや上部を表示させるにはどのようにすればいいのでしょうか?
0601nobodyさん
2006/07/18(火) 03:35:07ID:RAKThs0C$ENV{'HTTP_COOKIE'}で何も取得できません!
作成直後ではなくて、ブラウザでリクエストを再送しても取得できません。
どんな原因が考えられましょうか!
0602nobodyさん
2006/07/18(火) 03:47:13ID:???HTMLをテンプレとして別ファイルにしてinclude。
別ファイルにする際、左のバーだの上部だの、いつも同じ部分を
別個にすればよい。
ちなみにテンプレと言っても、いわゆる「テンプレート・エンジン」なんて使わなくても
自作テンプレで十分。
0603nobodyさん
2006/07/18(火) 03:47:50ID:???0604nobodyさん
2006/07/18(火) 04:02:26ID:???ありがとうございます。
それだと、同レベルのディレクトリ以外は難しくないですかね?
./../等として読みに行くとすると、ディレクトリ配置を変更するとなると
全てのファイルを書き直さなければいけなくなると思います。
また、include元のHTMLが<img src="./hoge.jpg">等とやっていた場合は
違うレベルのディレクトリのファイルから呼び出されたりすると
そのイメージのリンクは違うファイルを対象としてしまうと思うんですけど。
結構大きなサイトになると、同レベルのディレクトリに全て置くっていうのは
現実的じゃない気がするんですけど、そういうものなんですかね?
0607nobodyさん
2006/07/18(火) 09:02:10ID:???0608nobodyさん
2006/07/18(火) 09:28:49ID:???この程度の日本語が通じないヤツは、ほんとにどうでもいい
0609nobodyさん
2006/07/18(火) 09:29:55ID:WFdfnqCG>>453です。
本日、文字化けが起きたマシンを調べてみた結果、php.iniは
;mbstring.language = Japanese
となっており、mbstring.language はコメントアウト(neutralでUTF-8?)
されていました。
ただ、文字化けが起きなかった他のPCも、mbstring.language はコメント
アウトされており、mbstring.language が文字化けの原因ではないような
気がします。
どなたか、この文字化けの原因はお分かりでしょうか?教えて頂ければ、
幸いです。
0610nobodyさん
2006/07/18(火) 09:48:56ID:???とりあえず、それがコメントアウトされてたら文字化けしない方がおかしいので直せ。
そこは通常、Japaneseで設定されてないといけない。
ただ、ここがJapaneseじゃなくてもdetect_orderに特定の文字コードが設定されてれば
文字化けは回避できるかもしれない。
通常、これはautoに設定されてて、autoはlanguageの設定に合わせて自動設定されるので。
0612nobodyさん
2006/07/18(火) 11:33:37ID:WFdfnqCG>>610様。
先程、コメントを外し、mbstring.language = Japanese
にしてApacheを再起動しました。
>>611様。
アップロードされたファイル自体を目視確認しました。アップロード
されたファイル自体は、確かに文字化けしていないことを、目で確認
しました。
けれども、文字化け(最初の文字だけが「??」になってしまう)は
変わりません。アップロードされたファイルを「system(nkf -w 〜);」
とやってもやらなくても、同じ文字化けが起きてしまいます。
if ($_FILES['csvfile']['name'] != "") {
$tempfile = $_FILES['csvfile']['tmp_name'];
$tempfile_utf = $_FILES['csvfile']['tmp_name']."utf";
system("nkf -w ".$tempfile." > ".$tempfile_utf); // これをやらなくても文字化けする。
$file = fopen($tempfile_utf, 'r');
list($field1,$field2,$field3)=fgetcsv($file,20000);
print("1番目".$field1."2番目".$field2."3番目".$field3);
}
なのですが、何が原因かお分かりでしょうか?
0614nobodyさん
2006/07/18(火) 11:55:52ID:???実際にphpinfo();を表示させているサイトがありました。
サーバの環境から、Win鯖なのでユーザー名まで全て晒しています。
phpinfo();が表示する情報程度のものは
別に誰に見られても困るほどの事は無いのでしょうか?
0617nobodyさん
2006/07/18(火) 12:40:04ID:???> けれども、文字化け(最初の文字だけが「??」になってしまう)は
その最初の文字って何て文字さ。
> list($field1,$field2,$field3)=fgetcsv($file,20000);
> print("1番目".$field1."2番目".$field2."3番目".$field3);
化ける内容ってこの出力なのか?
fgetcsvは日本語を含むCSVデータでは使えないぞ?
0619nobodyさん
2006/07/18(火) 12:42:36ID:???0620560
2006/07/18(火) 13:13:09ID:n2ZEUTcJname="type[]" value="1"のようにしたほうが良いと言うことまでは
わかりましたが、どうやって複数の数値を持たせるのかがわかりません。
なんどもすいませんが、よろしくお願いします。
0622nobodyさん
2006/07/18(火) 13:16:46ID:???safemode の on/off が見えていたら困る場合、
on/off が見えなくても、
on か off のどちらかなのだから、safemodeが見えなくても、1/2で困ることになる。
0623nobodyさん
2006/07/18(火) 13:20:08ID:???onを予想して困る要因を作成し、1/2にハズレてだめだったとしても、
次にoffの場合の困る要因を作ればいいのだから、
どのみち困らせることができることになる。
0624nobodyさん
2006/07/18(火) 13:21:27ID:???safemodeがばれて困るような場合では、
safemodeが見えていようが見えていまいが、困るということだ。
0626nobodyさん
2006/07/18(火) 13:32:24ID:???value="a=1,b=2,c=3"
にする場合に必要なパーツはほぼ出揃ってるんだから、そっちでやっていいんじゃねーの?
(複数の値ってより、"a=1,b=2,c=3"っていう1つの文字列だな)
0628614
2006/07/18(火) 13:34:05ID:???やっぱドラゴンボールに例えるとわかりやすいな
0630nobodyさん
2006/07/18(火) 13:40:06ID:???仙豆が無い事がわかって困るなら、仙豆なんて物が初めから無くても困る
ってことだ
0632nobodyさん
2006/07/18(火) 14:22:42ID:???0633nobodyさん
2006/07/18(火) 15:28:52ID:WFdfnqCG> list($field1,$field2,$field3)=fgetcsv($file,20000);
> print("1番目".$field1."2番目".$field2."3番目".$field3);
> 化ける内容ってこの出力なのか?
> fgetcsvは日本語を含むCSVデータでは使えないぞ?
>>612 です。ありがとうございます。>>617様のアドバイスを元に、
「fgetcsv 日本語」で調べてみました。PHP5でfgetcsvを使った場合、
日本語が不安定のようです。ただ、CSVファイルの中身を全てダブル
クォーテーションで囲んで試したところ、文字化けしないで済みま
した。
どうも、ありがとうございました。
0634nobodyさん
2006/07/18(火) 15:35:22ID:qPB2Cam5で、メールを送信しようとしたのですが、エラーが返ってきます。
[mail function]
; For Win32 only.
SMTP = localhost
smtp_port = 25
; For Win32 only.
;sendmail_from = me@example.com
; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
;sendmail_path =
; Force the addition of the specified parameters to be passed as extra parameters
; to the sendmail binary. These parameters will always replace the value of
; the 5th parameter to mail(), even in safe mode.
;mail.force_extra_parameters =
なんですけど、どう設定すれば良いのでしょうか?
WindowsXP、Apache2.0.58、PHP5です。
本当にくだらない質問ですが、お願いします。
0636nobodyさん
2006/07/18(火) 15:43:28ID:???UTF-8でマルチバイト文字列の長さを、日本語=2、英数字=1として
カウントしたいのですが、strlenはひらがな、カタカナ、漢字を
全て3バイトとカウントすると仮定しても大丈夫でしょうか?
<?php
$str = "日本1234語";
$n = mb_strlen($str);
$m = strlen($str);
for ($i = 0; $i <= $n; $i++) {
$t = $i * 3 + $n - $i;
if ($t == $m) {
echo $i * 2 + ($n - $i);
break;
}
}
?>
0637634
2006/07/18(火) 15:53:15ID:qPB2Cam5シングルクォートにしてみましたが、変わりないです。
■ このスレッドは過去ログ倉庫に格納されています