【PHP】下らねぇ質問はここに書き込みやがれ 49
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2007/06/26(火) 03:03:40ID:ox2uyHLdPHPで最良の教本はこの公式マニュアル。市販の書籍は嘘が多いので鵜呑みにしない。
過去スレ、関連スレ、FAQなどは>>2-10辺り
◆前スレ
【PHP】下らねぇ質問はここに書き込みやがれ 45 (※実質48)
http://pc11.2ch.net/test/read.cgi/php/1180181033/
◆質問する時の注意
・ 自分のIDを表示させること。(メール欄に何も記述しないこと。空白も入力しちゃダメ)
・ サーバーのOS(Linux、Windows他)、WebサーバーとPHPの種類やバージョン等を明記すること。
・ 己の行った操作、変更などを詳しく明記すること。
・ エラーメッセージはそのまま表記すること。「エラーが出ます」だけでは回答不可。
・ 質問者として、態度をわきまえること。
・ 事前に公式マニュアル、リファレンス本くらいはちゃんと目を通しておくこと。
◆質問後の注意
・偽者防止に必ずIDを表示させること。(メール欄に何も記述しない)
・2回目以降は最初に質問した際のレス番号を名前欄に入れること。
・解決しなくても回答をもらった場合はお礼を言うこと。
(荒らし、煽りは除く。煽られたときも、無闇に反論せずスルーすること。)
◆回答者への注意
・誰にレスしているのか分からないと困るので、>>(アンカー)をつけて回答すること。
【その他諸注意】
・正規表現・PEAR・テンプレート(Smarty等)・フレームワークは各該当スレへ
・SQLについての質問はデータベース板(PCカテゴリ)の各スレで
0049nobodyさん
2007/06/26(火) 18:44:42ID:???0051nobodyさん
2007/06/26(火) 18:59:59ID:KrNYGdyB二つのデータファイルを照合して
合致したものだけを抽出させたいんじゃないかな?
005351
2007/06/26(火) 19:05:09ID:KrNYGdyB0055nobodyさん
2007/06/26(火) 19:16:54ID:???0057nobodyさん
2007/06/26(火) 19:33:38ID:JgraNuKYどうもうまくいきません。
PHP2日目の初心者ですので、むちゃくちゃかもしれませんが、ご指導ください。
$file1 = file("../data/or_data.dat");
$file2 = file("../data.csv");
$line=explode(",",$file2[$i]);
if($file1[0] == $line[1]){
echo "$line[30]";
0058nobodyさん
2007/06/26(火) 19:54:53ID:???foreach($file as $v){
$line = explode(",",$v);
if($file1["0"] == $line["1"]){
echo $line["30"];
break;
}
}
0059nobodyさん
2007/06/26(火) 19:57:44ID:iUlJJkmfPHP5をメインでやっていくほうがいいですか?
0061nobodyさん
2007/06/26(火) 20:14:25ID:r5oReIjo君は電車で横に席座られるのが怖くてずっと立ってしまうタイプだな
0062nobodyさん
2007/06/26(火) 20:42:57ID:JgraNuKYありがとうございます。
いろいろとやってみましたが、やはりうまくデータecho $line["30"];を吐き出しません。
なんともなさけないです・・・
006451
2007/06/26(火) 20:50:43ID:KrNYGdyB$file2 = file("../data.csv");
$str = array_intersect($file1,$file2);
foreach($str as $value){
echo $value;
}
0065nobodyさん
2007/06/26(火) 21:18:59ID:JgraNuKY51さん、ありがとうございます。
インターセクトでなにも吐き出さないのをみると、もっと根本的なとこで間違ってるんでしょうね。
顔洗って出直します^^;
0066nobodyさん
2007/06/26(火) 21:19:46ID:???0067nobodyさん
2007/06/26(火) 21:23:44ID:JgraNuKYデータ上2つのファイルでは同じデータがあるのに
ひっかからないという意味です。
0068nobodyさん
2007/06/26(火) 21:24:06ID:???0072nobodyさん
2007/06/26(火) 21:41:27ID:JgraNuKY最終的になにがしたいかといいますと、
商品詳細のページに商品レビューを載せたいのです。
$file1 = file("../data/商品レビューのデータベース.dat");
$file2 = file("../商品詳細のデータベース.csv");
$line=explode(",",$file2[$i]);
if($file1[0] == $line[1]){ //file1の商品レビューのデータIDとfile2の商品詳細のIDが合致した時
echo "商品詳細のページにレビューが表示される";
今はレビューと商品詳細ページが別々になっているので、一緒に表示されるように
がんばっているところです^^
0073nobodyさん
2007/06/26(火) 21:48:57ID:???だからレス数だけが増えてなんの益にもならない
0074nobodyさん
2007/06/26(火) 21:50:27ID:???0075nobodyさん
2007/06/26(火) 21:55:46ID:???すみません
商品名称<>ID<>URL<>レビュー内容<>レビュー内容2<>レート<>2007/06/26 13:50<>1
こんな感じです。
0076nobodyさん
2007/06/26(火) 21:56:42ID:???0078nobodyさん
2007/06/26(火) 22:03:27ID:???>>75
配列とforeachの使い方覚えればいいことあるよきっと
0079↑
2007/06/26(火) 22:06:25ID:JgraNuKY商品詳細のURLが http://www.xxx.com/shohin/[ID].htm
となりますので、
このファイル2のIDとレビューデータベース(file1)のIDが一致 (==)
したときに、商品詳細ページに該当IDのレビューが表示されるようにしたいんです。
0081nobodyさん
2007/06/26(火) 22:22:07ID:???$line=explode(",",$file2[$i]);
if($file1[0] == $line[1])
これの $line[1]のつもりです。※正確には$line[0]
0082nobodyさん
2007/06/26(火) 22:24:30ID:???file1,file2を関係付ける意味がわからんけど、まあそういうところを聞きなおすとよけいに
混乱するだろうからおいとけば、file1の行もexplodeしなきゃだめなのだよ。
/*********************************************/
$file1 = file("../data/商品レビューのデータベース.dat");
$file2 = file("../商品詳細のデータベース.csv");
$line=explode(",",$file2[$i]);//$iがすでに特定できるとして、
/************ここまでが>>72のまま**************/
$ID_file2 = $line[0];//file2のIDを判りやすいように書き直して
foreach($file1 as $key=>$val) {
$rtn = explode('<>',$val);
$ID_file1 = $rtn[1] ;//ID確保
if($ID_file1 == $ID_file2) {
echo 'SUCCESS';
}
}
まずこんだけやってごらんよ。
008451
2007/06/26(火) 22:28:26ID:KrNYGdyBちょっと待て、
ページにIDが入ってるぞ
0086nobodyさん
2007/06/26(火) 22:36:31ID:???>ファイル2は普通のCSVで
>商品名称,価格,詳細1,詳細2,・・・・・ と続いていきます。
>$line=explode(",",$file2[$i]);
>if($file1[0] == $line[1])
>これの $line[1]のつもりです。※正確には$line[0]
$line[1]には価格が入るんじゃないのか?
あと
・正確には$line[0]の意味が分からん。最初から正確な話をしてくれ。
・$iがどこから来たかすらそもそも分からん。
0088nobodyさん
2007/06/26(火) 22:45:57ID:JgraNuKYありがとうございます。
「$iがすでに特定できるとして、」
$iが特定できてませんでした・・・
商品詳細のページでは
$Data=file('../商品詳細.csv');
for($i=0;$i<sizeof($Data);$i++){
$line=explode(",",$Data[$i]);
こんなかんじで$iを特定できてましたが、今回は・・・
この$iはCSVの列の指定に関係あるとぼんやり分かるのですが。・・・
今回適当に、めちゃくちゃ!? $i=0と指定したら
SUCCESSと表示されました!
しかし、レビューのない全てのページに表示されたので、$iを正確に指定しれば
できそうですが・・
0089nobodyさん
2007/06/26(火) 22:47:51ID:JgraNuKYすいません、書き間違いです
正確には 商品ID,商品名称,価格,詳細1,詳細2,・・・・・
となりますので、IDは$line[0]になります。
0090nobodyさん
2007/06/26(火) 23:16:09ID:KjJKv0cFPHP.iniとか
どうでしょう?
0092nobodyさん
2007/06/26(火) 23:24:24ID:KjJKv0cF簡単なことでよいので教えていただければ嬉しいです。
0095nobodyさん
2007/06/27(水) 01:09:15ID:???ini_set('display_errors','1');
0096nobodyさん
2007/06/27(水) 02:33:24ID:???var_dump($hoge);
print_r($hoge);
var_export($hoge);
$a = print_r($hoge,1);
echo $a;
$b= var_export($hoge,1);
echo $b;
とか駆使してとにかく $hoge の構造がどうなっているのか
逐一デバッグ汁。まずそこからだ。
0097nobodyさん
2007/06/27(水) 06:25:54ID:FJbbPuHDif文とforeach文を使って、正解か不正解を判断させるようにしたいのですが、
以下の文で利用者が正解か正解ではないかをif文、または他の方法で判断するにはどうすれば良いのでしょうか?
文はこんな感じです。
$kaitouget = array(@$_GET["mondai1"],@$_GET["mondai2"],@$_GET["mondai3"],@$_GET["mondai4"],@$_GET["mondai5"]);
$seikai = array("a","c","b","a","d");
foreach ($kotae as $seikai){
...
と続けさせて、最後に送信ボタンを押したら、あなたは5問中x問正解です、と表示させたいです。
またラジオボタンを押してない箇所があった場合は、もう一度入力してください、と注意を促せるようにしたいです。
009897
2007/06/27(水) 06:30:29ID:FJbbPuHDforeach ($kaitouget as $seikai){
でした。
0099nobodyさん
2007/06/27(水) 06:52:59ID:???$count = 0;
foreach ($kaitouget as $key=>$val){
if ($seikai[$key] == $val) { $count++; }
}
010088
2007/06/27(水) 07:46:45ID:???また格闘してみます。
010197
2007/06/27(水) 08:29:42ID:FJbbPuHDありがとうございます。追加してみたら出来ました。
この状態から、ラジオボタンを押してない箇所があった場合は、もう一度入力してください、
と注意を促すにはどうすればいいのでしょうか?
0102nobodyさん
2007/06/27(水) 08:32:38ID:???javascriptでやるか、if(!isset($_GET["mondai1"])) とかで値判定するか
0103nobodyさん
2007/06/27(水) 08:36:29ID:???そもそも、こういう場合は親ループは$seikai側でまわす。
$kaitouget 配列で@などの処理もしないですむ。
/*************/
$mondaiNum = 1;
$seikai = 0;
$input = true;
foreach($seikai as $k=>$v) {
$key = 'mondai'.$mondaiNum;
if(!isset($_GET[$key]) { $input = false; break;}
if($v == $_GET[$key]) {
$seikai++;
}
$mondaiNum++;
}
if($input==false) {
echo '入力するよろし';
} else {
echo '正解は'.$seikai.'個数';
}
010482
2007/06/27(水) 09:06:41ID:???それは$iを特定できてるんじゃなくて、詳細.csvの行の配列添え字(行番)だっていうだけ。
で、そのループの$lineの中に$ID_file2の子ループが入るってことになる。
for($i=0;$i<sizeof($Data);$i++){ //親
$line = ...;
$ID_file2 = $line[0];//>>82のループ
foreach($file1 as..){ 子
....
}
}
しかしこれをやれたから、なにかよかったかというと、全然意味無いのはわかりますよね?
袋小路に入ってるよ。ポイントはfile1のID、file2のIDが一致してるかどうかではなくて、
IDがfile1,file2にそれぞれあるかどうかなんだから。
>>79でwww.xxx.com/shonin/[ID].html
とIDがそこで現れてるんだから、>>93の人が聞いてるように、このIDがどこからやってくるの
かをまず探索、理解すべき。
そのID(の変数)で、ID == file1 ID、ID==file2 IDと別々に判定すれば終わり。
0106nobodyさん
2007/06/27(水) 11:11:50ID:???とてもしたい。
誰か書いてくりー
0107nobodyさん
2007/06/27(水) 11:27:33ID:???--html--
<form action="test.php" method="POST">
〜中略
<input type="submit" value="送信">
</form>
--test1.php--
<?php
print $name; //フォームのname
print $addres;
print $tel;
?>
このような形で試したんですが、何も表示されません。
どういったことが考えられるでしょうか?
0109nobodyさん
2007/06/27(水) 11:41:37ID:???$bar = 多重連想。
function foo($bar) {
/*loop*/
while とかforeachとか
{
/*処理*/
その時点で配列が終わるものを$someとして取得
if(さらに子配列$anyがあるなら) {
$rtn= array_merge(foo($any),$some);
}
}
return $rtn;
}
の考え方でやれ。
更に、array_mergeとかarray_merge_recursiveじゃたらなきゃ(同一キーを書き換えると困る場合)、
多重に書き換え出来るarray_merge_recursive_overrideとかいう自前関数、
$rnn = array_merge_recursive_override(...);
などとする
自前っていってもニーズがあるからネットに転がってるが(xml、yaml,json系の配列操作スクリプト)。
なお中を表示したいなら上の関数でecho してもいいけど、
汎用に上の関数を作っておいて表示用のものをその関数結果を使ってやるのが普通。
どうせ、多重連想配列を <ul><li>で表示したいとか,xmlのツリーに書き変えたいとかのニーズだろうから。
0110nobodyさん
2007/06/27(水) 12:00:16ID:???function string_r($array){
$tabsize = " ";
$arg = func_get_args();
$indent = $arg["1"];
if (func_num_args() == 1):
$indent = $tabsize;
endif;
foreach ($array as $name => $value){
if (is_array($value)):
$contentString .= $indent.'['.$name.'] => Array' . "\n".$indent.$tabsize."(\n";
$contentString .= string_r($value, $indent. $tabsize.$tabsize);
$contentString .= $indent .$tabsize. ")\n\n";
else:
$contentString .= $indent . '['.$name.']' . ' => ' . $value . "\n";
endif;
}
if (func_num_args() == 1):
$contentString = "Array\n(\n" . $contentString . ")\n";
endif;
return $contentString;
}
0112nobodyさん
2007/06/27(水) 12:03:33ID:???できました^^ありがとうございます。
ただ、プルダウン(select)の値も同様に記述したらエラーになってしまいました。
同じ記述じゃ駄目なんでしょうか?
0113nobodyさん
2007/06/27(水) 12:22:06ID:n4m0L2rR$stringsはhtmlspecialcharsをかますべきでしょうか?
それとも画面に表示されないので必要ないですかね?
echo "<input type=\"text\" name=\"$strings\">";
0114nobodyさん
2007/06/27(水) 12:24:08ID:5PCg8aId次の画面に遷移させた後、書き直しかなんかでブラウザの戻るボタン前の画面に戻ると、
期限切れの表示がされてしまいます。
ブラウザの設定のせいかとずっと思っていたのですが、
他の通販サイトで買い物をしていたところ、戻るボタンで戻っても
きちんと表示されていたので、私のPGのせいだと思うのですが、
どの辺の処理を修正すれば宜しいでしょうか?
宜しくお願いします。
ちなみに、header関数で出力している箇所は全て消してやってみたのですが駄目でした。
0115nobodyさん
2007/06/27(水) 12:25:24ID:???print_r($_POST);
を取得側のPHPに書き込んで出力されたものに
selectフォームの名前があるか確認し、ない場合は
POSTができていないと判断しPOST側を直せ
名前がある場合は受け取り側のポスト部分をチェック
$_POST["ここの部分がまちがっている"]
0119nobodyさん
2007/06/27(水) 12:52:39ID:???postとセッションでできるの?
postしたあとにリダイレクトして実現してるのかと思ったけど
もっといい方法があったら教えて
0120nobodyさん
2007/06/27(水) 12:56:46ID:n4m0L2rRセキュリティは関係ないということでしょうか?
0122nobodyさん
2007/06/27(水) 13:08:35ID:???意図しない動作をさせられても問題ないなら
echo "<input type=\"text\" name=\"$strings\">";
なり好きなようにすればいい
htmlspecialcharsするとかしないとかはその後の段階の話
0123nobodyさん
2007/06/27(水) 13:23:12ID:n4m0L2rRすいませんはやり>とか<とか入力されることも考慮してサニタイズはかけるべきですね。
ありがとうございました。
0124nobodyさん
2007/06/27(水) 13:27:02ID:???URL忘れたが。
http://www.asahi-net.or.jp/~wv7y-kmr/memo/php_security.html
ここもいいんだけど、他に確かフレーム使ってXSSやSQLインジェクションについて
解説してくれてるところがあったような・・・
0125nobodyさん
2007/06/27(水) 14:53:48ID:???0126nobodyさん
2007/06/27(水) 15:10:00ID:???0127nobodyさん
2007/06/27(水) 15:24:29ID:v0keEA/hしかし、フォームの部分にダブルクォーテーションやカンマを入力されると
どうしてもCSVがおかしな書式になってしまいます。
「"」と「,」があれば全角に置き換えや削除等の対応策は思いついたのですが、
できる限り入力したデータと同じ情報をCSVで見れるようにしたいのです。
ダブルクォートやカンマがあっても正常にそのままCSVで出力できる方法というのはありますでしょうか?
これらの文字が含まれた場合、さらに両端をダブルクォートで囲うという方法も考えたのですが
先頭に入れられているとどうしようもないというか。。
0128nobodyさん
2007/06/27(水) 15:33:45ID:/C2YK7wD亀レス申し訳ございませんでした。
error_reporting(E_ALL|E_NOTICE);
で表示されるようになりました。ただ、local valueは変わったのですが
これだとファイル?かフォルダ?ごとにしかエラーを表示してくれません。
Master Valueを変更するにはどうしたらいいのでしょうか?
ヒントでもいいのでお願いします。
0129nobodyさん
2007/06/27(水) 15:50:11ID:???カンマなんか関係ない。
マニュアルで、magi_quote や get_magic_quote_gpcをみよ。
それを知った上で、どう処理するかは個人の考え。
0130nobodyさん
2007/06/27(水) 15:53:39ID:???"1","0","<table width=""290"" border=""1"">(以降省略)","ほげ","123,456,789","fuga"
みたいにすればよろし、途中改行も可。
0131nobodyさん
2007/06/27(水) 16:09:00ID:???CSVにはちゃんと規定があるんだからそれに従って処理しろよ
" , 改行を含むフィールドは " "で囲む
"は2個並べる
ただし日本語を使う場合はSJISはやめておけ
0133nobodyさん
2007/06/27(水) 16:23:50ID:???0134127
2007/06/27(水) 16:32:20ID:v0keEA/hPHP5以下の環境でも使えるようにしたいのでとりあえずは手動でやってみます。
ちなみに人のサーバなのでphp.iniは弄れないんですよね。
0135nobodyさん
2007/06/27(水) 16:34:56ID:???POSTで受け取った直後に書き換えればいいやん。
0137nobodyさん
2007/06/27(水) 17:12:16ID:+cE0Hx/y五十音順にするにはどうすれば良いでしょうか?
投稿処理の時に簡単に並び替える事ができるものがあると良いのですけど。
0138nobodyさん
2007/06/27(水) 17:21:48ID:???上のように$varに外部から任意の値を許可する場合、
この文字はエスケープしとけ、みたいな注意はあるでしょうか?
urlencodeかければモウマンタイでしょうか?
0141nobodyさん
2007/06/27(水) 17:42:13ID:+cE0Hx/yありがとうございます。漢字をかなにするプログラムなんですね。
確かに使えそうです。
ですが、ひらがなを普通に五十音順に並び替えるやり方がわからないのです。
0142nobodyさん
2007/06/27(水) 17:57:51ID:???$kana = array('あれれ','ああん','あああ','あれは');
sort($kana);
var_dump($kana);
0143nobodyさん
2007/06/27(水) 18:25:17ID:kYRJVXfn$logdir = dirname(__FILE__);
$logfile = $logdir."/search.log";
//親ディレクトリのパーミッション変更
if( substr(sprintf('%o', fileperms( $logdir ) ), -4) != "0777"){
chmod($logdir,0777);
}
if(!is_file($logfile)) {
touch($logfile);
chmod($logfile,0777);
}
FTPソフトを使わず自己判断でパーミッションを変えようとしたのですが
Operation not permitted となってしまいます。
何か気づかないことがあるのでしょうか…
0144142
2007/06/27(水) 18:38:12ID:kYRJVXfn後から設置したphpから変更しようとしても
apacheからになるので権限がない…ということですか?
0145nobodyさん
2007/06/27(水) 18:44:17ID:???$logdir = dirname(__FILE__);
って書いてるんだから、自分のwebroot以下にあるディレクトリにスクリプトうごかしてるんだろ?
echo sprintf('%o', fileperms( $logdir );
が吐く文字列を書かないと。
0146nobodyさん
2007/06/27(水) 18:57:08ID:q3ZXE7ZQxmlの要素名に@が含まれていたらどうやってアクセスするの?
$obj->@element
みたいなとき
@でエラーがでるよね
ダブルクォートは使えないみたいだし
■ このスレッドは過去ログ倉庫に格納されています