【PHP】初心者コーナー 3 Released【スローモード】
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
03/06/11 06:24ID:???ファイル MySQL PostgreSQL 正規表現でも なんでもいってみ
でもな、アホな質問であっても詳しく質問しろよ。 ネタはおもしろく書けよ。
前スレ http://pc2.2ch.net/test/read.cgi/php/1048442813/l50
■PHPの普通の質問はあっちな、【PHP】質問スレッド Part8
http://pc2.2ch.net/test/read.cgi/php/1050249148/l50
■PHPへ移行したいPerl信者はあっちな、【待望】PerlユーザのためのPHP入門
http://pc2.2ch.net/test/read.cgi/php/1046326634/l50
■マニュアル嫁ってうるさいのがいるからちょっとは嫁な、
http://www.php.net/manual/ja/
■おまえ初心者なら入門本くらいかっとけな、PHP関連の書籍(但しPHP出版系お断り)
http://pc2.2ch.net/test/read.cgi/php/985315574/l50
■これはなズープスと読むらしいがあっちな、XOOPS
http://pc2.2ch.net/test/read.cgi/php/1031736248/l50
でもな、ここで書きたかったらここで書き。 あとは関連な、>>2
0175nobodyさん
03/06/22 16:23ID:???172じゃなくて 173だった。
0177影
03/06/22 21:01ID:???サンクスコ
<table border=1>
<td>ほげ1
</td>
</tr>
<tr>
<td>ほげ2
</td>
<td>ほげ3
</td>
<td>ほげ4
</td>
<td>ほげ5
</td>
<td>ほげ6
</td>
</tr>
<tr>
<td>ほげ7
</td>
<td>ほげ8
</td>
<td> </td>
<td> </td>
<td> </td>
</tr>
</table>
てな具合に、最初の行が上手く動作してくれないんだけど、原因が見当つかない
0178PHPDQN
03/06/22 22:40ID:???×if ($key % (NUMCOLS - 1) == 0) {
○if ($key % NUMCOLS - 1 == 0) {
◎if ($key % NUMCOLS == 1) {
$key == 0 の時にもTRUEになるためには一番上が必要でした
0179影
03/06/23 04:05ID:???foreach ($hoge as $key=>$val) {
if ($key == 0) {
echo "<tr>"."\n";
}elseif ($key % NUMCOLS == 1) {
echo "<tr>"."\n";
}
とか、やってもダメですた・・・(ウトゥ
<table border=1>
<tr>
<td>ほげ1
</td>
</tr>
<tr>
<td>ほげ2〜
最初の<tr>が出現したのみ。
1行目だけなんで・・・(つД`)
0180
03/06/23 04:06ID:vjy3Tk6shttp://strangeworld-honten.com/cgi-bin/bbs.cgi
0181nobodyさん
03/06/23 04:12ID:???0182あぼーん
NGNG0183PHPDQN
03/06/23 04:23ID:???foreach ($hoge as $key=>$val) {
if ($key % (NUMCOLS - 1) == 0) {
echo "<tr>"."\n";
} elseif ($key % NUMCOLS == 1) {
echo "<tr>"."\n";
}
0184あぼーん
NGNG0185影
03/06/23 08:30ID:???背中に手が届きそうで届かない!
漏れにプログラムは向いてないんか!?
>>183
それだと、$key が 8 になった時も
if ($key % (NUMCOLS - 1) == 0) にマッチして<tr>が出てくるべさ。
するとテーブルが崩れてしまうべさ。
昨日>>168見た時は、サパーリだったけど、今は何をどうしたらいいかが
解ってきたような気がする・・・
後は、何とか自力で・・・出来たらいいなぁ〜(´¬`)
ところで、今回は定数に5を代入してるけど、これ変数じゃだめぽ?
あっ、NUMCOLS-1 とかしてるから変数じゃマズイか・・・
yata-でけた〜!!!!!!
0186影
03/06/23 08:32ID:???reset($hoge);
echo "<table border=1>"."\n";
foreach ($hoge as $key=>$val) {
if ($key == 0) {
echo "<tr>"."\n";
} elseif ($key % NUMCOLS == 0) {
echo "<tr>"."\n";
}
echo "<td>".$val."</td>"."\n";
if ($key % NUMCOLS == 4) {
echo "</tr>"."\n";
}
}
$n = count($hoge) % NUMCOLS;
if ($n > 0) {
for ($i = 0; $i < NUMCOLS-$n; $i++) {
echo "<td> </td>"."\n";
}
echo "</tr>"."\n";
}
echo "</table>"."\n";
0188影
03/06/23 12:41ID:???$key % NUMCOLS == 1
だと、$key が、1,6,11・・・の時にマッチしてしまい、出したい所に<tr>が出ない。
なのでやっぱりここは
$key % NUMCOLS == 0
if ($key % NUMCOLS == 4)
の部分は、5列って事しか考えていなかった為、ちょい修正して
if ($key % NUMCOLS == NUMCOLS-1)
>>169が書いてくれた空セル追加は
for ($i = 0; $i < $n; $i++)
だと、例えば余剰が4の時は、4つ空セルを作ってしまう。
空セルは列の数から余剰を引いた分だけ欲しいので、
for ($i = 0; $i < NUMCOLS-$n; $i++)
こんな厨な漏れに付き合って下さった PHPDQN 様、ありがとうございました!
0189影
03/06/23 12:43ID:???$filename = "test.log";
$hoge = file ($filename);
define("NUMCOLS",5); // 列の数
reset($hoge);
echo "<table border=1>"."\n";
foreach ($hoge as $key=>$val) {
if ($key == 0 || $key % NUMCOLS == 0) {
echo "<tr>"."\n";
}
echo "<td>".$val."</td>"."\n";
if ($key % NUMCOLS == (NUMCOLS-1)) {
echo "</tr>"."\n";
}
}
$n = count($hoge) % NUMCOLS;
if ($n > 0) {
for ($i = 0; $i < NUMCOLS-$n; $i++) {
echo "<td> </td>"."\n";
}
echo "</tr>"."\n";
}
echo "</table>"."\n";
0190nobodyさん
03/06/23 16:28ID:???$c += $c % 5
for ($i = 0, $j = 0, $td = '', $tr = ''; $i < $c; $i++, $j++) {
$v = isset($hoge[$i]) ? $hoge[$i] : " ";
$td .= sprintf("<td>%s</td>", $v);
if ($j == 4) {
$tr .= sprintf("<tr>%s</tr>", $td);
$j = -1;$td = '';
}
}
printf("<table>$s</table>", $tr);
0191nobodyさん
03/06/23 17:00ID:ghLrcRD3ヒアドキュメントに関して教えて欲しいのですが、
ヒアドキュメント内に、式、というか関数を書き、その結果を
使いたいのですが、うまくいきません。
$buf = <<<EOD;
a = {$db->query($_POST['a'])},
b = ### 以下同じように...
EOD;
のような感じに書き、print $buf; で
a = 値, b = 値 となるようにしたいのですが、
Parse error: parse error, expecting `'}'' in ...
となってしまいます。ヒアドキュメントではなくて、
$buf .= "a = ".$db_con->quote($_POST['a']).",";
と続けていくしかないでしょうか?
0192影
03/06/23 19:16ID:???↑この行ってセミコロンいるんですか?
0193191
03/06/23 19:22ID:ghLrcRD3すみません。手コピーした時にミスりました。
セミコロンいらないです。
書き写しをミスっただけなので、セミコロンは本質的な
問題じゃありません。すみませんです。
0194影
03/06/23 19:33ID:???a → $a
, → ;
今の漏れにはこれくらいしかミスがハケーンできず。
あとは、偉い人よろ。
0195nobodyさん
03/06/23 20:41ID:???$buf = <<<EOD
EOD;
~ このセミコロンはだめだと思うが?
EOD
;
こうだろ。
$buf = <<<EOD;
EOD
でも良いとおもうが
0196nobodyさん
03/06/23 20:49ID:???つーかそれ以前にヒアドキュメント内には関数を書けんわけだが。
「以下同じように」なことをしたいんならwhile、for、foreachのどれかでしょ。
0198191
03/06/23 21:05ID:???ども。書けない事がわかったのでヒアドキュメントを使うのを
やめられます(^^;
>>194, 197
いえいえ。アクションを起してもらえた事がうれしいので、
感謝しています。ありがとう。
0200nobodyさん
03/06/24 00:57ID:???0201nobodyさん
03/06/24 03:00ID:/ljDW6SS返信機能も付けたい・・・↓
ttp://blue.ribbon.to/~goonet/pppbbs.php
どうしたらいいですか?
0202nobodyさん
03/06/24 03:21ID:???アホな質問であっても詳しく質問しろよ。 ネタはおもしろく書けよ。
0203nobodyさん
03/06/24 12:56ID:bE/a8saZ$after = array('aaa'=>'AAA','bbb'=>'BBB');
上の配列を下配列に変換するにはどうしたら良いでしょうか。
クラスの中でコールバックする時にクラス内の関数を指定するには
どうしたらよいですか?
class::function,$this->functionともにダメでした。
0204PHPDQN
03/06/24 19:27ID:???> $before = array('aaa','AAA','bbb','BBB');
> $after = array('aaa'=>'AAA','bbb'=>'BBB');
> 上の配列を下配列に変換するにはどうしたら良いでしょうか。
$i = 1;
foreach ($before as $key=>$val) {
if ($i % 2 == 1) {
$hoge = $val;
} else {
$after[$hoge] = $val;
}
$i ++;
}
> クラスの中でコールバックする時にクラス内の関数を指定するには
> どうしたらよいですか?
> class::function,$this->functionともにダメでした。
class::function()
$this->function()
0205nobodyさん
03/06/25 11:50ID:???function arrayToHash ($array) {
if (!is_array($array)) return false;
$hash = array();
$m = count($array);
for ($n=0;$n<$m;$n++) {
if ($n % 2) {
$hash[$array[($n-1)]] = $array[$n];
} else {
$hash[$array[$n]] = "";
}
}
return $hash;
}
こんなかんじかな?なんとなくだけどもっと良い方法が在るかも
クラス内でのコールバック関数を使うんだったら、create_function()を使うか
array($this,'method_name')でソメッドを指定してやること
ttp://jp.php.net/manual/ja/function.preg-replace-callback.php
を見れば参考になるよ(Notesのところもね)
0206nobodyさん
03/06/25 12:13ID:TNz4QTlp$a=array(1,2,3);
$b;
hoge();
piyo();
function hoge(){
global $a,$b;
$b = &$a;
var_dump($b);
}
function piyo(){
global $a,$b;
var_dump($b);
}
でpiyoのdumpがNULLなのはなぜですか?
0207nobodyさん
03/06/25 15:15ID:RiMKFAt2サンプルソースより、多々のサイトを閲覧し意味を求めているのですが、
解釈があっているかどうか・・・
session_name('2ch_session');
セッション名ですよね?
session_cache_limiter('nocache');
ページをキャッシュをさせるかどうかの意味だと思うのですが、
public、nocache、privateの違いがいまいちわかりません。
session_cache_expire(30);
limiterでキャッシュする場合、30分とかという
時間の長さですよね
session_start();
ここからセッションが始まる
何冊か本を購入したのですが、sessionのやり方は書いてあっても、
サンプルスクリプトなどにsession_cache_limiter();
などど唐突に書いてあり、意味の解説がなされてありませんので、
自分ながらに解釈してみました。どこが間違っているでしょうか?
0208nobodyさん
03/06/25 16:10ID:???実はマニュアルは存在しない、私の想像の産物に過ぎないのであろうか・・・
この理不尽な質問にもそう考えるとすべての辻褄が合う。
0209nobodyさん
03/06/25 16:36ID:???そんな事、たらたら書くんだったら教えてあげ。
http://jp.php.net/manual/ja/ref.session.php
おい、207これでわかるか?分かんなかったらまた質問し。
0210nobodyさん
03/06/25 16:39ID:+bFcwMX4マニュアルのまんまの参考書って多いよね。
マニュアルのほうが分かりやすいし、最新、タダなのにねぇ。感謝>doc.group
>なんでマニュアル読もうとしないのだろうか?
考えられる理由は、マニュアルのトップページ見ても
1) XCIIIセッション処理関数(session)
に辿り着く前に面倒になる
2) search for [ ] in the [function list]
の英語が分からない
3) 2)の submit ボタン が 分かりづらい
4) manual の 存在に気づいてない
& このスレの最初すら読んでない
& 基礎からやるのはダルイ
ぐらいかな。
0211ereg質問者
03/06/25 17:12ID:???本を見ただけではわからないので質問させて下さい。
現在あるソースを見ながら何をしているのかを調べているのですが、
eregを使っている部分で分からなくなってしまうので
解説してもらえないでしょうか?
具体的には以下のようなコードが書かれています。
------------------------------------------------
ereg( "([0-9]{1,2}) (.+)", $ini_file, $regs ) )
ereg( "\*", $regs[2])
ereg_replace( "\*", "", $regs[2] )
ereg_replace( "\*", "(.*)", $regs[2] )
ereg("\"[EGOPS]{2,3}T ".$ini[$ii][1]."(.*) HTTP", $file, $regs)
ereg( $param[$ss], $log_url )
eregの部分だけなので繋がりがなく分かりずらいと思いますが
よろしくお願いします。
0212nobodyさん
03/06/25 17:20ID:???3行目で $b に値が設定されていないから。アホか。
しかしスコープ間でリファレンスを受け渡しする際の挙動制御は確かにややこしいと思う。
http://www.php.net/manual/ja/language.variables.scope.php
http://www.php.net/manual/ja/language.references.spot.php#references.global
と、01-Aug-2001 05:07 の補足。
( http://www.php.net/manual/ja/migration4.variables.php )
( http://www.php.net/manual/ja/language.references.unset.php )
>208
ある程度phpに習熟しているのにマニュアルを読まない者が何割か残り続けるところからすると、
マニュアルを読むのにはいくつか「慣れ」が必要なポイントがあると思う。
慣れれば利用は易いが、慣れることができなかった場合はその先もずっと読まない。
マニュアルはphpに残った最後の敷居か。
0213あぼーん
NGNG0214nobodyさん
03/06/25 17:37ID:???0215nobodyさん
03/06/25 17:39ID:+bFcwMX4ふいてしまったじゃないか!
0216212
03/06/25 18:04ID:???ユーザ定義関数の内から直接グローバルスコープの変数にはアクセスできないが、
global宣言をしていれば、グローバルスコープでも変更が反映される。
global宣言は分かると思うけど、関数内(ローカルスコープ)の変数に
グローバルスコープの変数へのリファレンスを渡すもの。
( マニュアルいわく、global $a; は $a =& $GLOBALS['a']; と同義 )
同じように、ローカルスコープで作られた変数はグローバルスコープからは変更できない。
この場合はstatic宣言をすると、グローバルスコープへ関数内の変数を持ち出すことが出来る。
ただ、>206の人がはまってるように、ローカルスコープ(関数内)で作られたリファレンスは
static宣言してもグローバルスコープへは持ち出せない。関数処理が終われば消滅。
そのような感じ。
0217nobodyさん
03/06/25 18:26ID:???まあ間々あることか、、
0218あぼーん
NGNG0219あぼーん
NGNG0220nobodyさん
03/06/25 19:40ID:???教えて頂けませんか?
0222nobodyさん
03/06/26 02:14ID:ZsWdiO4a0225207
03/06/27 02:26ID:GX1Z4ukeマニュアルを熟知しました。
その上で質問です。
セッション変数にデータを追加する際、
session_start();
session_register("user_id");
$user_id = "giko";
をヘッダに使用すると、別のページでも、user_idに格納された
データを使うことができますが、
本に書いてあったのは、
session_start();
$user_id = "giko";
$_SESSION["user_id"] = "user_id";
とあり、
$_SESSIONは4.1.0から追加された配列です。とあります。
~~~~~
$_SESSIONで、PHPマニュアルで探したのですが、ちょっと見つけることができませんでした。
ということは、少量の変数を用いる際は、上の例で、
配列を使いたいときは、下の例でいいということなんでしょうね・・・
なんか、まだ自信がないのですが、
推奨とかありますか?
0226とも
03/06/27 02:34ID:8zlvqcC5http://www1.free-city.net/home/s-rf9/page005.html
0227nobodyさん
03/06/27 02:49ID:???0228207
03/06/27 02:58ID:???自己レスです。
http://jp.php.net/manual/ja/ref.session.php
に普通に乗っていました。
グローバル変数として扱えるのですね。
検索の仕方が悪かったようで。
すいませんでした。
0229nobodyさん
03/06/27 05:44ID:???0230あぼーん
NGNG0231あぼーん
NGNG0232あぼーん
NGNG0233nobodyさん
03/06/27 11:18ID:oE4Jdn/I単純に、ファイル名(日付になっています)に並べたいです。
以下の方法で一覧を表示したときに何順にならんでいるのでしょうか。
当方の確認した環境では、全く順不同でした…
while ( $filename = ReadDir( $handlerDir ) ) {
if ( $filename != '.' && $filename != '..' ) {
print $filename;
}
}
よろしくです。
0234あぼーん
NGNG0235nobodyさん
03/06/27 11:48ID:9q2Y1uRy#いったん配列に入れて
if ( $filename != '.' && $filename != '..' ) {
$files[] = $filename;
}
#ソートする
sort($files);
#ポインタを先頭に
reset($sort);
#表示
foreach($files as $filename) {
print $filename."<br>\n";
}
0236nobodyさん
03/06/27 13:37ID:oE4Jdn/Iありがとうございます。
大変参考になりました。
0237あぼーん
NGNG0238あぼーん
NGNG0239あぼーん
NGNG0240nobodyさん
03/06/27 23:59ID:???0241nobodyさん
03/06/28 08:30ID:WrETl/geWarning: SAFE MODE Restriction in effect. The script whose uid is 〜
というエラーが出てしまいます。
FTPで最初からフォルダを作っておくとちゃんと出来ます。
どうすればよいんでしょうか。
0243nobodyさん
03/06/28 10:05ID:???0244nobodyさん
03/06/28 10:58ID:???まずはやってみれ。もちろんローカルで。
0245nobodyさん
03/06/28 12:09ID:???知ったか君はは試したこともなくてどうなるか自分も解らないのに「試してみろ」って言ってくる。
お前もまずはやってみれ。後学のために。もちろんローカルで。
0246!244
03/06/28 12:56ID:???訊くって言う発想がよくワカランなぁ。
余計にマンドクサくね?
>>245
>自分も解らないのに
ってのは分かんないじゃん
>>243が何にも試してないんだろうなって臭いはプンプンするが。
そもそもマヌアルにはdefine()の使いどころの注意書きは見当たらないけど、
心配しだす動機は何なんだろ
テスト環境用意してないのかな?
いちいちマヌアルに書いてない事まで心配しだしたらコーディング進まねーYO!
俺は安全な環境で誤動作上等って感じでコード書きまくってからテストしてる。
やっちゃダメな事はローカルで実体験しまくった方が身によく付くYO
#まだPHP弄りだしたばかりで、PHPで定数使ったことねぇんだけど
#適当なソースにdefine()とその定数をechoする行追加してみたけど
#何の問題もなさそうだたーよ
0248246
03/06/28 13:06ID:???何か無粋なやっちゃな
釣りとか釣られたとかくだらねー
0250221
03/06/28 16:28ID:???いやー>>220が頓珍漢な事を言ってるから
こちらも頓珍漢な答えで茶化したわけだが
何故無理してまでヒアドキュメント使おうとするのかわからん
まぁたしかにタチ悪かったねスマン
0252246
03/06/28 17:47ID:???>>250と結びつける意味がワカラン
ますますくだらねー
ただでさえジメジメしてうっとおしい時期なんだからさ
そういうジメジメしたカキコはやめようや
>>249
定数とかは分かりやすい場所に書いたほうが良いよ
ファイルの前の方とか、定数だけ書いたファイルをインクルードするとか
散在してると後で見つけにくくなるから
後、繰り返しになるけど、コードの落とし穴とかは(テスト環境で)実体験しといた方が楽だよ
ちょっとした疑問程度なら自ら動かしてみてくらはい
見聞きしただけでバグ無しコード書けるくらいに頭の回転がはやい人なら別だろうけど
0254nobodyさん
03/06/29 01:35ID:???列挙型とか。
0255nobodyさん
03/06/29 14:32ID:rZczdmH2フォームから入力したテキストに[\](バックスラッシュ)が
入ってしまうんです.
調べて[magic_quotes_gpc]の値を[ini_set]でOFFにすればいいと
いうのがわかったのですがこれでも回避されませんでした.
しかたなしに[stripslashes]で回避しているのですが
もっと根本的に直せないでしょうか?
ちなみに[magic_quotes_runtime][magic_quotes_sybase]の
値も全てOFFです.
0257255
03/06/29 15:52ID:rZczdmH2ini_set('mbstring.http_output', "EUC-JP");
を実行して[EUC-JP]に変換しています.
この辺が怪しいですか?
0260255
03/06/29 17:21ID:rZczdmH2[stripslashes]で回避はできますができれば根本から
直したいです.
0261nobodyさん
03/06/29 17:49ID:???ini_setでmagic_quote_gpcは設定できないように書いてあるようにみえる。
0262nobodyさん
03/06/29 20:30ID:???合ってるよ(一応PHP4.3.2のソースでも確認)
http://jp.php.net/manual/ja/ref.info.php#ini.magic-quotes-gpc
で、PHP_INI_PERDIRとPHP_INI_SYSTEMなので
http://jp.php.net/manual/ja/function.ini-set.php
の説明どおり、スクリプトの中のini_set()では変更できない。
0263nobodyさん
03/06/29 22:53ID:???261あってるね。
0264255
03/06/30 00:28ID:8Khs5mrJ書き忘れてましたがPHP4.1.2です.
再起動しないとだめなんですね…
でも
ini_set('magic_quotes_gpc', 0);
phpinfo();
をやるとちぇんとLocal ValueではOFFに
なってるんですがこれはあくまで設定値ということなんですね…
ありがとうございました.
0265255
03/06/30 00:32ID:8Khs5mrJレンタルサーバの場合などみなさん
どうしているんでしょうか?
いちいち[stripslashes]の処理をさせてるんでしょうか?
0266nobodyさん
03/06/30 00:48ID:???俺はこんな感じのことをしてます。
---------
if (get_magic_quotes_gpc() == 1) {
switch ($_SERVER["REQUEST_METHOD"]) {
case "POST":
while (list($key, $val) = each($_POST)) {
if (! is_array($val)) {
$_POST[$key] = stripslashes($val);
}
}
break;
case "GET":
while (list($key, $val) = each($_GET)) {
if (! is_array($val)) {
$_GET[$key] = stripslashes($val);
}
}
break;
}
}
0267nobodyさん
03/06/30 01:50ID:???$_POST = array_map('stripslashes', $_POST);
$_COOKIE = array_map('stripslashes', $_COOKIE);
これ最強。
0268nobodyさん
03/06/30 01:56ID:???$_GET = array_map('r_stripslashes', $_GET);
function r_stripslashes($value) {
if (is_string($value)) {
$value = stripslashes($value);
} elseif (is_array($value)) {
$value = array_map('r_stripslashes', $value);
}
return $value;
}
0269266
03/06/30 02:48ID:???0270nobodyさん
03/06/30 04:09ID:8KMUcild0271あぼーん
NGNG0273nobodyさん
03/06/30 05:11ID:OSudLwdSアカウント名に、半角英数小文字のみ
abcdefghijklmnopqrstuvwxyz0123456789_-
だけにしたいのです。
フォームから上記以外の文字を入力された場合、
駄目!って言いたいんだけど、
正規表現は難しそうなので、
if ( mb_convert_kana($account,"akh") != $account ) { echo "駄目!!"; }
で行こうと思ったんだけど、
全角の漢字とか、スペースを入力されてしまいそう・・・
記号もたくさん入力されそう・・・
なんかいい方法ありますか?
0274nobodyさん
03/06/30 06:52ID:???ちょっと分からなくても正規表現やっておくといいと思うよ。
$a がフォームから受け取った文字
ereg("^[a-z0-9_-]+$", $a)
これで期待通りの結果が得られると思うけど、意味は自分で調べるとよろし。
それよりお前ら、PHP5.0.0 Beta1なんてのが表舞台に出てきましたよ。
0275nobodyさん
03/06/30 10:12ID:aQ17FmN/EUCで書かれたファイルで作成するので
$line = mb_convert_encoding($line,"ISO-2022-JP","EUC-JP");
$subject = mb_convert_encoding($subject,"ISO-2022-JP","EUC-JP");
mail($mail,$subject,$line,"From: [email protected]\r\nReply-To: [email protected]");
としています。
送られてきたメールを見るとタイトルは文字化けしているのですが、
メッセージの方は問題無く表示されています。
なにが問題なのでしょう。
■ このスレッドは過去ログ倉庫に格納されています