【PHP】下らねぇ質問はここに書き込みやがれ 22
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/06/08(木) 05:09:28ID:5gGJKVO4ここなら本スレで回答のないお前の下らない質問に回答があるかも知れません。
まず読め【PHP マニュアル】
http://www.php.net/manual/ja/
過去スレは>>2
0611nobodyさん
2006/06/19(月) 11:56:20ID:???データーのURLには特殊文字が含まれていていいもの?
それとも変換しておいたほうがいいの?
0612nobodyさん
2006/06/19(月) 11:56:59ID:???0とfalseとnullに違いを持たせるとき
C言語のほとんどの環境ではそれらはすべて0と同じ意味だけど
PHPなどはそれぞれ意味が違う
そのため
if (!$foo)
というコードを書いたときに $foo は0、false、null全てを許すのか
それとも
if ($foo === 0)
を簡略して書いたかを明確にしていないと、バグの原因になったりする
$foo = 0;
この初期化を通らないと
if ($foo === 0)
は警告が出る。これは、$foo にfalseやnullではなく数値の0が
入ってくることを期待する処理となる
0614nobodyさん
2006/06/19(月) 12:03:49ID:ywXHAQssすごく分かり易いです。ありがとうございます!
0615nobodyさん
2006/06/19(月) 12:10:27ID:???$name = ""; // 名前格納用
$age = 0; // 年齢格納用
とか宣言してから使うようにするといいってことだね><
0616608
2006/06/19(月) 12:56:16ID:ywXHAQss>4を読んで試したのですが、いまいちピンと来ないです。
extract($_GET)の場合だと、パラメータに付けた任意の値が代入されてしまいますが、extract($_POST)変数が上書きされることはないような気がします。
>4を読んで_GET[hoge]=fugefugaという値を送ってみたのですが、確かにextractによって$_GET[hoge]=fugafugaが成立(?)してしまいますが、例えばフォームに_POST[hoge]=fugafugaと入れてサブミットしても、extractで展開されて上書きという風にはならないです。
なんだか混乱していますが、extractが致命的な例を知りたいです。宜しくお願いします。
0617nobodyさん
2006/06/19(月) 12:57:29ID:ywXHAQss○ extract($_POST)の場合、変数が
0618nobodyさん
2006/06/19(月) 13:09:54ID:???0620nobodyさん
2006/06/19(月) 13:28:32ID:???試してないけど、こういうのってヤバくね?
つか、ヤバいですか?
<form action="http://>>616のサーバ/該当のスクリプト.php" method="post">
<input type="text" name="_SESSION[hoge]" value="fuga">
<input type="sumit" value="送信">
</form>
自分が知ってるのは「送信フォームが必ずサーバ上のHTMLから実行されるわけじゃないから気をつけろ」ということだけ。
個人のPC上にフォームをコピってきて、改変して実行される可能性もあるって教わったです。
つか、extractなんて初めて知った
0623nobodyさん
2006/06/19(月) 14:19:12ID:???PHPとPostgresqlでツールを作ろうと考えています。
たとえば住所録で都道府県をセレクトボックスで入力する際に
001 北海道
002 青森
・・・
といった選択肢を
1.テーブルを作っておくか、配列をファイルに書いておいてrequireするか
2.北海道なら"北海道"で持ってていいのか、001を持っておいて表示する際は$pref[ 001 ]みたいにするのか
ex.そもそもPostgres系のスレでするべき質問か
どうするのがベターなのでしょうか
0625nobodyさん
2006/06/19(月) 14:25:44ID:ywXHAQssレスありがとうございます。
確かにそれは見ただけでヤバそうですね。面倒だけど、
$hoge = $_POST['hoge'];
$fuga = $_POST['fuga'];
(以下項目数ぶん続く)
とやるのが一番安全確実なんですかね?
でもやっぱなりextractが御法度のがわからんですorz
registar_globals = OnはPOSTも変数上書きできたのでダメなのは分かったのですが...。
0627nobodyさん
2006/06/19(月) 14:50:56ID:???都道府県名が変更されることを考慮するか、
変更されたときに変更以前に選択された結果へ伝播するようにするか、
入力されたデータの使い道はなんなのか
など様々な条件によって異なってくるよ。
>ex.そもそもPostgres系のスレでするべき質問か
システム設計について基礎から学ぶのが正解
0628nobodyさん
2006/06/19(月) 15:16:41ID:???(1) 都道府県なんてほぼ変更ないだろうということで、別ファイルで配列作りインクルード
$pref[001] = '北海道';
$pref[002] = '青森県';
$pref[048] = '沖縄県';
(2) またはDBで別テーブルにしてJOIN
(1)は管理などが楽で直感的、PHP側が(2)と比べると冗長になる可能性はある。
DB側はPrimaryKeyで数値にして、SQL文も単純になりDB容量もすこーーし小さくなる。
ループ処理で "<td>$row[$i]</td>" とかしたいなら(2)かな
検索フォームも作りDBから抽出したりするなら(2)のほうが楽
0629nobodyさん
2006/06/19(月) 15:35:15ID:???"<td>".$pref[$row[$i]]."</td>"
(1)でもこうやればいいだけだから、これは(2)の利点として挙げるのは変だよ
0630nobodyさん
2006/06/19(月) 16:16:24ID:???0631nobodyさん
2006/06/19(月) 17:10:13ID:???>>4を読んでも分からんのならもう分からないままで良いんじゃない?
誰もextract()が絶対ダメとか言ってないわけでさ、
別に問題ないケースもあるわけだから。
多分君のスクリプトでは問題は起こらないんだよ。
0632nobodyさん
2006/06/19(月) 17:13:46ID:???そんなの作る人の趣味で決めて良いと思う。
俺なら$_POST['location'] = "北海道"で済ますなあ。
0634nobodyさん
2006/06/19(月) 17:24:22ID:???while ( $row = mysql_fetch_array($res) )
{
echo "<tr>";
foreach ($row as $cell) { echo "<td>$cell</td>"; }
echo "</tr>";
}
0635nobodyさん
2006/06/19(月) 18:42:40ID:???if ( hogehoge ) {
$file = "hoge.php";
}
if ($file) {
include($file);
}
こんな馬鹿なコードを書かないようにね!!
0636nobodyさん
2006/06/19(月) 21:41:13ID:???「オープンソース徹底活用
EclipseによるPHPスクリプト開発」
という本があって良さそうなのだけど、古い本のもよう。
今時の新しい良い書籍が在れば教えてください。
0637nobodyさん
2006/06/19(月) 21:50:00ID:???10件ごとにページ移動で表示させたいのですが、
全てのデータを10件ごとに表示はできるのですが、
検索結果を10件ごとに表示するやり方がうまく思いつきません。
どなたか教えてください。
0639nobodyさん
2006/06/19(月) 21:56:21ID:???状況が良くわからない
「全てのデータ」配列があって、そこから「検索結果」配列ができているんだろ
すでに10件ずつ表示できるのなら、そのまま表示できるだろう?
データベースを利用した場合は、PHPの問題じゃなくてSQLの問題だ
データベースによって仕様が違うのでなんともいえないが、
普通、limit やら、top やらを使って、10件ずつとか取得してくる
こいつらが使えない場合は、あきらめて全件取得してくるしかない
0640nobodyさん
2006/06/19(月) 21:57:38ID:???一度検索結果のみを配列に格納したほうがいいのかな?
0641nobodyさん
2006/06/19(月) 22:03:47ID:???全件文の行数が知りたいなら、1 count 2 必要分だけデータ取得 の2クエリ
0644nobodyさん
2006/06/19(月) 22:11:26ID:???$file = file($data);
$count = count($file);
for($i=0;$i<$count;$i++){
行[$i]を読み込む
if(検索で一致){
$search++;
}
if($search>=10){
break;
}
}
こうですかわかりません><;
0648nobodyさん
2006/06/19(月) 22:26:35ID:???( ゚д゚) …普通のxxxx.cgi?
(つд⊂)ゴシゴシ
(;゚д゚) ….cgi?
(つд⊂)ゴシゴシゴシ
_, ._
(;゚ Д゚) …!?
まあ>>639の上段が全てだと思う。
全てのデータを10件ずつ表示できるのなら
検索にヒットするデータをそれと差し替えれば良いだけのこと。
問題はこれがPHPの質問なのかどうかってことだ。
0649nobodyさん
2006/06/19(月) 22:29:40ID:???xxxx.datだったら直リンで中身見れるから・・・。
CSV??
つまり、検索にヒットしたデータを配列に格納すればよいのでしょうか?
0652nobodyさん
2006/06/19(月) 22:48:10ID:???ああ、そういうことか。おk、把握した。
仮に$linesという配列に全データを入れたとしよう。
で、その各要素から検索ワードにヒットしたものを$hittedという配列に入れるとしよう。
そしたら、全てのデータを表示する時は$linesを10件ずつ表示(1)して、
ヒットした物を表示したい時は
$lines = $hitted;
としてから$linesを10件ずつ表示(2)すればいいってわけだ。
お分かりかな?
0653nobodyさん
2006/06/19(月) 22:50:12ID:???表示する範囲だけforで回しておけばいいよ。
どうせたいした量でもないんだろ。
0654nobodyさん
2006/06/19(月) 22:50:16ID:???0655nobodyさん
2006/06/19(月) 22:51:21ID:???横からすまん。俺いつもそうやってるんですが、多い場合ってどうするのがいいんですか?
テキストファイルでやるとしたら・・。
0656nobodyさん
2006/06/19(月) 22:51:53ID:???0657nobodyさん
2006/06/19(月) 22:56:11ID:???多い場合はそもそもテキストファイルよりDB使うだろ。
どうしてもテキストファイルにしたいなら、何度も表示するようなものは
予めヒット数とかキャッシュしておいてfopen、fget()で最後のヒット行までしか読み込まないとか工夫すれば良いんじゃない?
条件がころころ変わるような検索は全件読み込まないと無理だけど、それでも一気にメモリを食うfile()は使わない方が良い。
0658nobodyさん
2006/06/19(月) 22:57:13ID:???テキストを読み込むバッファと、最終的に利用する配列を分ける
まずはバッファに読み込んで、必要なものだけ配列へコピーする
これを件数分たまるまで繰り返す
0659nobodyさん
2006/06/19(月) 22:58:31ID:???prev nextしかないなら、表示数+1読めば次のページがあるかないか分かる。
0660nobodyさん
2006/06/19(月) 22:59:43ID:???最後の+1分が最後の行だったら結局最後まで読む事になるか。
0661nobodyさん
2006/06/19(月) 23:04:26ID:???$page = 2; // 表示したいページ数 1-n
$disp_count = 10; // 表示したい行数
$start_pos = ($page - 1) * $disp_count;
$end_pos = $start_pos + $disp_count;
if ($end_pos > $count) $end_pos = $count; // 10件に満たないときはどうするとかいろいろは
// $start_pos,$end_posをどうにかする
$arr = array();
for($i=0;$i<$count;$i++){
行[$i]を読み込む
if(検索で一致){
$search++;
if ($end_pos < $i) break;
if ($start_pos >= $i) { // 条件に合致しているとき$arrに溜める
$arr[] = $file[$i];
}
}
}
// $arrに目的のレコードが入ってるはず
foreach ($arr as $rec) {
echo $rec["....."].なんちゃら表示;
}
// 違ってたらスマ、誰か直して下さい。
0662nobodyさん
2006/06/19(月) 23:07:49ID:???0663nobodyさん
2006/06/20(火) 00:59:53ID:???0664nobodyさん
2006/06/20(火) 02:51:40ID:???0665nobodyさん
2006/06/20(火) 03:03:08ID:???0666nobodyさん
2006/06/20(火) 03:45:35ID:???PHPを使った「パスワード共有システム」だそうだが、なんだか香ばしい気が・・・
↓
http://www.bf-web.net/~dmcsoftware/cgi-bin/dlmanager/index.php?mode=details&id=pawosys_server
0667nobodyさん
2006/06/20(火) 07:39:43ID:Js32egMIaaa,bbb,ccc,ddd
eee,fff,ggg,hhh
iii,jjj,kkk,lll
とある内の
fffを含むものを見つけて消すには
どうしたらいいですか?
0668nobodyさん
2006/06/20(火) 08:00:56ID:???<form method=post action=hoge.php>
<input type=text name=これこれ>
<input type=text name=あれあれ>
<input type=submit value=こっちのばやい>
<input type=submit value=あっちのばやい>
</form>
で、”これこれ”や”あれあれ”の中身を
こっちのばやいに送るときと
あっちのばやいに送りたいときが同じform上にあるときは
”input type=submit”や”form”にnameを付けたりして区別させるんですか
0669668
2006/06/20(火) 08:16:25ID:???0670nobodyさん
2006/06/20(火) 09:06:47ID:???アップされたファイル名をユニークにしたいと思っています。
たとえば、
アップ前ファイル名 中田.jpg
アップ後ファイル名 imge1DOf7.jpg
こんな風にリネームする関数ありましたでしょうか。
0672nobodyさん
2006/06/20(火) 10:17:51ID:???俺ならデータが同じであるかを考慮してデータからハッシュ取るよ。
そういうのが必要なければ>>671の時刻(ミリ秒)で良いんじゃないの。
あとuniqid()
0674nobodyさん
2006/06/20(火) 11:56:26ID:???行を消したいのかもね。
file()でデータ取得して
正規表現でfff探して
見つからなかった行をスタックして
最後にスタックした行があるのならファイルを書き直す
って感じか。
0675nobodyさん
2006/06/20(火) 13:31:10ID:???仕事でPHPやるときってPHP4と5どっちが多い?
0676nobodyさん
2006/06/20(火) 14:05:43ID:???<a href="http://yahoo.co.jp"><img src="logo.jpg" width="100" height="50"></a>
<strong>アクセスはこちらまで!!</strong>
このソースから画像表示(<img>タグ)だけを取り出してechoで表示させることは
出来ますでしょうか?
0679nobodyさん
2006/06/20(火) 14:13:01ID:???preg_grep と書いたが、ファイルから読み出して特定行を消して書き直すのであれば、
fopen( +r) からの処理で、
1行づつ読み出し、 strpos にて、fffがあるかをチェックして、
ないなら、書き出しようの配列に追加、
全行チェックの後,
ftruncate
fseek
fput
fclose
の手順が、ファイルロックの観点からいうと最適だとおもふ。
なお、fffのチェックにstrposを使うのは、正規表現を使うより動作が速いため、
特にパターンパッチを行う必要がない特定文字列ならば、これが推奨される。
0680nobodyさん
2006/06/20(火) 15:38:25ID:???これまで学んだ何冊かの本でもいつも華麗にスルーされていて
いまだにピンときません。。。
「.」で探しても文字列連結のときの.(dot)しか出てこないしで。
あほすぎな質問ですがお願いします
0681nobodyさん
2006/06/20(火) 16:18:41ID:???みたいなこと?
エラーなると思うが。
0682nobodyさん
2006/06/20(火) 16:19:07ID:???0685nobodyさん
2006/06/20(火) 16:46:01ID:???$n = 'bb';
$hoge = 'aa'.$n.'cc';
echo $hoge;
---> aabbcc
とかじゃなくて?
0686680
2006/06/20(火) 16:49:55ID:???↓は今手もとの書籍からの引用でそういう記述がある1行のみ部分です。
$strPathには取得したファイル名が入っています。その前後にdotが。
print("<li><a href='record.php?doc=".$strPath."'>".$strPath."</a></li>");
1行だけでわかりますでしょうか?
0687nobodyさん
2006/06/20(火) 16:50:55ID:???0688nobodyさん
2006/06/20(火) 16:54:13ID:???0689680
2006/06/20(火) 16:54:44ID:???やっぱアホ杉だです。すいませんm(_ _)m
0690nobodyさん
2006/06/20(火) 16:54:54ID:???>>685のとおり
間を開けると良く判る。
print( "<li><a href='record.php?doc=" . $strPath . "'>" . $strPath . "</a></li>" );
0691680
2006/06/20(火) 17:01:38ID:???>>865ですでに指摘されてたんですね。すみません。
ほんとうに・・・俺って奴は・・・orz
0693nobodyさん
2006/06/20(火) 17:17:50ID:e7ISWcMQhtmlspecialcharsはHTML出力時とDB格納時のどちらにかけるのが正しいのですか?両方すかね?
0694nobodyさん
2006/06/20(火) 17:21:19ID:84KpNS9w0696nobodyさん
2006/06/20(火) 17:51:10ID:???DB格納前。
なぜならヴぁ、HTML出力時であれば、HTML出力するたびに htmlspe〜を通さないとならない。
DB格納前に行えば、その一回だけですむ。
0697nobodyさん
2006/06/20(火) 17:53:26ID:???タグを含めた文字を検索とかするわけじゃなければ、DBに入れる前に変換してもいいんじゃない。
でも、公式かどっかにhtmlspecialcharsはHTML出力する直前にやるべきだ。みたいな事が書いてあった気がするけど。
出力前までhtmlspecialcharsしないのは、メール/HTML等に対応する為だとか。
まぁ、でも別にどっちでもいいと思うよ。
0698nobodyさん
2006/06/20(火) 17:59:39ID:e7ISWcMQトンクスっす。
やっぱみんな適当なんですかね。適当を卒業したいのですが...。
XSSとかの本を読んでると、なんかキリ無い気がして萎えます。
プロの現場というか、それで喰ってる人たちはどの程度対策してるんでしょうか?
>695
pg_convertは初めてみました。便利そうですね。
>696
へんなjavascriptが表示されて...とか言う具合にはならないですかね?
0699nobodyさん
2006/06/20(火) 18:04:18ID:???0700nobodyさん
2006/06/20(火) 18:24:23ID:???http://takagi-hiromitsu.jp/diary/20051227.html#p02
0701nobodyさん
2006/06/20(火) 18:25:48ID:e7ISWcMQおっしゃるとおりです。完全に独学してるので怪しいです。
色々本も買ったのですが、結構著者によってまちまちというか、
htmlspesialcharsさえやっときゃ殆ど大丈夫みたいな書き方されてたり...。
フォーム入力から→DB登録→一覧表示みたいな流れで最低限これだけはやっとけみたいのありますか?
0702nobodyさん
2006/06/20(火) 18:35:35ID:???html出力時にするのが一般的
DBに投入前に行うと、そのデータを編集するときにエスケープする前の状態に戻してから
編集して、再度htmlspecialchars()を使う必要があるから
そんなことをするくらいなら、出力する前にやるほうが楽
0703nobodyさん
2006/06/20(火) 19:00:00ID:mpIQquvJ私が考えたのは:
1. if (isset ($_POST['name'])) { ...処理... } // POST がTRUE なら処理
2. if ($_POST['name'] === '') { ...処理...} // POST の値が空なら処理
皆さんなら?
0705nobodyさん
2006/06/20(火) 19:03:58ID:???(strlen($_POST['name']) > 0) and (strlen($_POST['name']) <= $MaxNameLen)
0706nobodyさん
2006/06/20(火) 20:57:12ID:???if (!isset($_POST['name']) || $_POST['name'] == '') { ...処理... }
0707nobodyさん
2006/06/20(火) 20:59:43ID:???0708nobodyさん
2006/06/20(火) 21:09:57ID:e7ISWcMQ0709nobodyさん
2006/06/20(火) 21:32:39ID:mpIQquvJおまいらありがとう(・∀・)
参考にするよ♪
0711nobodyさん
2006/06/20(火) 22:22:23ID:???■ このスレッドは過去ログ倉庫に格納されています