【PHP】質問スレッドpart31【php】
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2005/11/27(日) 00:07:12ID:eBvjdczp【基本ルール】
・新規質問の方は上げてください。age進行でお願いします。
・質問者は2回目以降、最初のレス番号を名前欄に入れてください。
・回答者は質問者に対して>>(アンカー)をつけてください。
・煽り・荒らしは放置。荒らしに反応した香具師も荒(ry
・解決しなくてもこたえてもらったら礼を。
【質問テンプレ】
・マニュアルを調べたか、google検索したか(調べたキーワード)
・タイトル(禁:教えてください!etc) 例:requireとinclude
・内容 例:requireとincludeはどう違うのですか?
・質問する際には環境も明記。
【その他諸注意】
・正規表現・PEAR・テンプレート(Smarty等)・フレームワークはそれぞれの該当スレへ
・SQLについての質問はデータベース板(PCカテゴリ)の各スレで
・オブジェクト指向については良スレがないから本を買え
・速さについては自分でベンチをとってここに書け(違う環境の人も調べてくれるかも)
【PHP マニュアル】
http://www.php.net/manual/ja/
※マニュアル上部の「search for」から検索を活用すべし(便利)。
過去スレ、関連リンク、FAQ等>>2-10辺り
0628147
2005/12/21(水) 13:56:56ID:N7x21G0Gphpの配列について質問があります。
前のページで
<input type="hidden" name="20051218133001" value="1">
のhtmlタグのフォーム(POST)で飛ばし、下の記述で表示させようとしましたがエラーが出てしまいます。
if($_POST['20051218133001']){
print<<<EOM
<table>
<tr>
<td valign="top">$_POST['20051218133001']<td>
</tr>
</table>
EOM;
}
エラーは
Parse error: parse error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in /home/***/***/***.php on line 5
と出ます。
ifの後の$_POST['20051218133001']は普通に処理しているのですが、
print<<<EOMの中の$_POST['20051218133001']が引っかかっているみたいです。
試しに後者を$_POST[20051218133001]と書くと普通にエラー無く表示されます。
次に前者も$_POST[20051218133001]とするとエラーは出ないのですが
ifの条件分岐に入ってくれません。
どなたかご指導よろしくお願いします。
0629147
2005/12/21(水) 13:57:27ID:N7x21G0GサーバOSはUNIX系OSのFreeBSDを使用しているそうです。
PHP のバージョンは 4.3.10 です。
よろしくお願いします。
0630614
2005/12/21(水) 13:57:38ID:???それどころか、
session
Session Support => enabled
Registered save handlers => files user eaccelerator
Directive => Local Value => Master Value
session.auto_start => Off => Off
session.bug_compat_42 => Off => Off
session.bug_compat_warn => On => On...
mysql
MySQL Support => enabled
Active Persistent Links => 0
Active Links => 0
Client API version => 4.0.26
MYSQL_MODULE_TYPE => external
MYSQL_SOCKET => /tmp/mysql.sock...
ときちんと動作もしています
0631nobodyさん
2005/12/21(水) 14:03:21ID:???なんかどっかで見かけたような。。
原因はヒアドキュメントの中でどこからどこまでが変数なのかが
PHPの中の人が判断できなくなっている、つーことだから、
{ } を使って明確にしてあげればよい。
{$_POST['20051218133001']}
0632619
2005/12/21(水) 14:38:45ID:???お手上げです。
eAcceleratorの読み込みをやめて Warning が出てこなくなるなら eAcceleratorの
せいだろうし、そうじゃないなら session.so と mysql.so に問題があるんじゃないかと。
後は error_reporting = E_ALL にしたらもっと詳しいメッセージが出てこないかな?
0633nobodyさん
2005/12/21(水) 14:40:00ID:ybikX0hyphpのUTF-8を指定するには、どうすればいいですか?
htmlの場合は、
.htaccessに
AddType "text/html; charset=UTF-8" html
ですが、
phpの場合は、
AddType "text/html; charset=UTF-8" php
とするだけで良いのでしょうか?
サーバは、xreaです。
よろしくお願いします。
0634nobodyさん
2005/12/21(水) 15:27:38ID:???文字列(ヒアドキュメントを含む)の中で配列変数を書くときは
{$変数名['キー']} と書かなきゃいけないことは
マニュアルに明記されてる。
II言語リファレンス 6章「型」 参照のこと。
0635nobodyさん
2005/12/21(水) 15:29:50ID:???<?php
header("Content-type: text/html; charset=utf-8");
echo "Hello world";
?>
0636nobodyさん
2005/12/21(水) 15:31:31ID:???それは違うんでねーの。
>>633
とにかくここ嫁。
http://jp2.php.net/manual/ja/ref.mbstring.php
0637nobodyさん
2005/12/21(水) 15:35:07ID:???タイトルに404などの文字が含まれているとかで判定するなんてことはないですよね。
0638nobodyさん
2005/12/21(水) 15:35:47ID:???iniのdefault_charsetがクリアされてなきゃデフォで送信されるけど
0642nobodyさん
2005/12/21(水) 15:55:24ID:???php5なら
get_headers
0644nobodyさん
2005/12/21(水) 18:44:32ID:???0645nobodyさん
2005/12/21(水) 19:22:32ID:???どのような正規表現を書けばよいですか?
index.html
top.htm
frame.htm
top.jpeg
icon.gif
1.css
2.css
例えば↑のファイルがある場合、
↓の結果を返すようにしたいのです。
.html
.htm
.jpeg
.css
0646nobodyさん
2005/12/21(水) 19:24:57ID:???0647nobodyさん
2005/12/21(水) 19:59:31ID:???0648614
2005/12/21(水) 21:34:35ID:???eAccerelator0.9.4-rc1 -> 0.9.3
にしたら正常通り動きました。
いろいろありがとうございました。
0650nobodyさん
2005/12/22(木) 01:56:27ID:???while($file = readdir($dp)) {
if(preg_match('/(\.[^.]+)$/', $file, $match)) $list[$match[1]] = '';
}
$extlist = array_keys($list);
0651nobodyさん
2005/12/22(木) 08:20:36ID:???正規表現使わなくても
$parts = pathinfo($file);
$ext = ".".$parts['extension'];
$pos = strrpos($file, ".");
$ext = ".".substr($file, -$pos);
0653nobodyさん
2005/12/22(木) 10:01:11ID:???「.」とか「..」とかのディレクトリ名を除外した方がいいかも。
あと、Windowsユーザには馴染みがないかもしれないが、
「.htaccess」みたいにファイル名が「.」から始まる場合は
普通はこれは拡張子とは言わない。
頭1文字目が「.」なファイル名を最初に除外しとくと
この辺が一発で解決するな。
0655nobodyさん
2005/12/22(木) 12:23:30ID:???0656nobodyさん
2005/12/22(木) 14:05:22ID:lB13zr56おまえらならどれくらい時間必要?
0658nobodyさん
2005/12/22(木) 14:23:55ID:???面白いけど、これはデザインの問題か
0659nobodyさん
2005/12/22(木) 14:33:57ID:???0660nobodyさん
2005/12/22(木) 14:57:25ID:???データマイニングとかやろうとしたら恐ろしい時間が。
>>658
萌え系って機能的には他のより劣ってるよな。
>>659
でじこは萌えない。
0662nobodyさん
2005/12/22(木) 15:30:25ID:???世界的に需要はあるだろうな。
ただゲームと同じで、日本では萌え=漫画、エロからはみ出せないから、
韓国人が先にやりそう
0663nobodyさん
2005/12/22(木) 15:59:47ID:???0664nobodyさん
2005/12/22(木) 18:53:21ID:8W5z4hv+ignore_user_abort(0) で終了されたときに、実行したい処理があるんです。
0665nobodyさん
2005/12/22(木) 19:00:27ID:???C言語に詳しくないのだけど、デストラクタのこと?
つ ttp://www.php.net/manual/ja/language.oop5.decon.php
0666nobodyさん
2005/12/22(木) 19:01:34ID:???0667nobodyさん
2005/12/22(木) 19:04:59ID:???面白そうな関数だな。
0668664
2005/12/22(木) 19:16:33ID:???解決しそうです。
0669nobodyさん
2005/12/22(木) 19:34:14ID:???<html>
<?php
if ( ) {
echo "テスト1<br>";
} else {
echo "テスト2<br>";
exit;
}
echo "テスト3<br>";
?>
</html>
上記のような場合 if が真のときは期待通りの出力をしてくれるのですが、
偽のときは exit; 以降が出力されません。(当たり前だと思いますが)
<?php ?> から抜け出し、</html>まで出力させるにはどうすれば良いでしょうか?
Googleなどで検索しまくったけど分かりませんでした。お願いします。
0670nobodyさん
2005/12/22(木) 19:37:10ID:???0671669
2005/12/22(木) 19:49:24ID:fg4VrG6aexit; なくしたらテスト3も出力されますよね?
関数のように return; でも駄目だろうし(元々用途が違うと思うけど)
真の時
<html>
テスト1<br>テスト3<br>
</html>
偽の時
<html>
テスト2<br>
これを</html>(正確には ?> 以降)まで出力させるにはどうすれば。
0672nobodyさん
2005/12/22(木) 19:57:44ID:???テスト3が if()条件に左右されるものなら、
テスト1と同じ if() { } の中に含めるか、
テスト3の部分で 再度if() すればいいのでは?
0673nobodyさん
2005/12/22(木) 19:59:08ID:???<html>
<?php
if ( ) {
echo "テスト1<br>";
echo "テスト3<br>";
} else {
echo "テスト2<br>";
exit;
}
?>
</html>
0674nobodyさん
2005/12/22(木) 19:59:17ID:wNhRz1jC0675nobodyさん
2005/12/22(木) 19:59:31ID:lB13zr56ここから山田と太郎や
山田と次郎を抜き取って変数に入れるグッドなアイデア(または関数)を
教えてください。
0678nobodyさん
2005/12/22(木) 20:13:39ID:???0679nobodyさん
2005/12/22(木) 20:18:13ID:01Hk6ZHq0680669
2005/12/22(木) 20:21:23ID:fg4VrG6a実際には条件式が多数にあり、その中のいろんな場所でexit;を使用しています。
主にエラーの時にエラー文を出力して exit; させていまして
フォームに入力されたデータが全て正しいとき(テスト3の場所に該当する)
MySQL接続して処理などをしています。
エラー文を function error() {} 等でまとめて処理する方法も考えましたが
error処理の最後で exit; させると結局同じだし・・・
0681nobodyさん
2005/12/22(木) 21:04:46ID:???出力させないだけで、処理自体は走って良いのなら。
<html>
<?php
if ( ) {
echo "テスト1<br>";
} else {
echo "テスト2<br>";
$ob = ob_start();
}
echo "テスト3<br>";
if($ob) ob_end_clean()
?>
</html>
0682nobodyさん
2005/12/22(木) 21:06:21ID:???で、処理そのものが走っちゃダメなら。
<html>
<?php
if ( ) {
echo "テスト1<br>";
} else {
echo "テスト2<br>";
$err = 1;
}
if(! $err) {
echo "テスト3<br>";
}
?>
</html>
0683nobodyさん
2005/12/23(金) 11:19:05ID:???処理部分丸ごと関数にしてreturn;でいいんじゃないか?
<?php
hoge();
function hoge() {
if($error) {
return;
} else {
echo "fubafuba";
}
}
?>
</html>
0684nobodyさん
2005/12/23(金) 11:29:20ID:???PHP5だと 例外をthrowするのがおしゃれらしいけど。
0685nobodyさん
2005/12/23(金) 11:45:06ID:???0686nobodyさん
2005/12/23(金) 14:40:52ID:???主コードとデザインは分けろ。
デザインの中に入れていいロジックはデザイン切り替えのための判定だけだ。
0687nobodyさん
2005/12/23(金) 14:45:09ID:???入力処理1
入力処理2
入力処理3
入力処理4
全ての入力処理がTRUEで実行する処理
入力処理の結果に関わらず実行する処理
という構成をシンプルに書く方法の模索だと思うけどね。
それを下手にHTMLやechoで例を書いたから叩かれる。
0688nobodyさん
2005/12/23(金) 16:01:50ID:???$varから「ab.数字」という文字列を取ってくるにはどうすればいいでしょうか?
(この場合、ab.0です)
正規表現で preg_grep("ab.[0-9]", $var);
としたいところですが、.が正規表現として認識されてしまい、
abc0まで取得してしまいますよね?
正規表現にもエスケープとかあるのでしょうか?
0689nobodyさん
2005/12/23(金) 16:06:51ID:???0690nobodyさん
2005/12/23(金) 16:09:31ID:???正規表現なのは"/ab[0-9]/"側であって、$var側は関係ない。
正規表現のエスケープ方法もあるが、この質問はそれ以前に理解が足りてない。
0691690
2005/12/23(金) 16:12:23ID:???あと「ab.」の部分が可変で何が入ってくるか分からない、みたいな場合は、
preg_match("/".preg_quote($str)."[0-9]/", $var)
とすることで自動エスケープさせられる。
0693nobodyさん
2005/12/23(金) 17:56:59ID:???PHPの話じゃないし。
0694nobodyさん
2005/12/23(金) 18:02:44ID:???{if $var}○{else}×{/if}
とかやる場合は、どうするの?
設定ファイルに
v1 = '○'
v2 = '×'
とかやっておいて、PHP側で代入しておけばいいの?
ループ処理はどうするの?
パーツごとにテンプレートを分離して処理するの?
分岐とループはHTMLテンプレートには入っても仕方ないと思うけどねえ。演算なんかは予め処理しておくべきだろうけど。
0695nobodyさん
2005/12/23(金) 18:22:25ID:???> {if $var}○{else}×{/if}
> とかやる場合は、どうするの?
それが表示の切り替えに必要ならあっていいし、逆に表示のためのロジックが
主プログラム側に入り込んでるのも間違ってると思うな。
当然、表示のためのifやループはデザイン側に入ってて然るべきかと。
「表示」と「処理」の役割分担が分かってればレイヤー分けに迷わないんじゃ?
>>680はHTML表示の途中でDB接続の有無を切り替えてたりするのがおかしい。
0696nobodyさん
2005/12/24(土) 15:28:41ID:???私は、環境構築サイドの人間なのですが、
セキュリティ担当の部署から環境をなるべく
変更をされるのを好ましく思われないので
大きな脆弱性がでない限り環境を変更しない(UPDATEをしない)
環境が必要となっております。
PHP4とPHP5とPEARの導入等も考慮した場合
WebProgの方々から見た場合Verはいくつが妥当でしょか?
0697nobodyさん
2005/12/24(土) 15:47:08ID:???それはバージョンとは関係ないような...
セキュリティ担当が言うのはちまちましたセキュリティパッチなんて
当てたくねーよってこと? それとも、バージョンのメジャー番号が
変わるようなアップデートは運用ポリシー上望ましくないってこと?
前者ならそんな会社ヤヴァイし、後者ならセキュリティパッチを
ちゃんと後方互換性とか考えて作るベンダを選ぶ方が大事なのでは。
0699nobodyさん
2005/12/24(土) 16:45:45ID:???好ましく思わないのが開発担当ならまだ分かるがセキュリティ担当?
だったらPHPの脆弱性なんてマイナーバージョンが3つも上がれば山ほど出てくるから、
ほとんど毎回アップデートしないと意味ないと思うが。
PHPを大雑把にアップデートしないってのは、WindowsUpdateをこまめにかけずに
SPが出てくるまで待ってるのに等しい。
ユーザ側ならともかくセキュリティ担当がそれじゃダメだろ。
0700nobodyさん
2005/12/24(土) 20:21:14ID:???アパッチのバージョンアップどころの騒ぎじゃない。
0701nobodyさん
2005/12/24(土) 20:26:04ID:???PHPはまだ枯れていないから、心配ならperlとかにするしか無いな
0702nobodyさん
2005/12/24(土) 20:39:48ID:???そーそー。だから、普通はセキュリティ担当はアップデートしたがり、
開発担当は待ってくれと止める、というパターンになるんだよね。
セキュリティ担当もアップデートするつもりがないなら
いっそ4.3.4くらいのバージョンでも全然問題ないのでは。
現行の4.4.1とか、mb_send_mail()にバグあるしさー
0703nobodyさん
2005/12/24(土) 20:43:17ID:???4も5もそれぞれ最新版1個しかないんだから、選択の余地は無いよね。
>>696って、今のセキュリティ状態を確認した上でこの質問してんのかね?
0705nobodyさん
2005/12/24(土) 21:03:59ID:???0706nobodyさん
2005/12/24(土) 21:04:56ID:???0707nobodyさん
2005/12/24(土) 21:05:22ID:???以前実際に起こってちょっと参った…
0708nobodyさん
2005/12/24(土) 21:05:56ID:???0710nobodyさん
2005/12/25(日) 00:31:00ID:???0711nobodyさん
2005/12/25(日) 14:45:31ID:Tho8NAOlログイン時に、データベースのテーブルに登録済みのIDとPWにマッチすれば認証OKで
その後、自分のスケジュールやプロフィール変更が可能という感じに作りました。
ここで問題点だと思うことを見つけたのですが、
ローカルテストのみだったので、全てのMySQL接続に root@localhost を使用していました。
前までは Perl でテキストにIDとPW保存とかしてたレベルなので気付かなかったのですが、
MySQL接続自体に各個人のID・PWを使用して管理するほうが良いのでしょうか?
0712nobodyさん
2005/12/25(日) 15:00:55ID:???デフォルト管理ユーザのrootを普通に使ってちゃまずいだろ。
(権限変えてるなら別だが)
PHPアプリからの接続用に適当な権限を設定した
専用ユーザ作って、それ使え。
0714711
2005/12/25(日) 15:13:50ID:???$login_id = $HTTP_POST_VARS["login_id"];
$login_pass = $HTTP_POST_VARS["login_pass"];
$db_connect = mysql_connect("localhost", $login_id, $login_pass);
if ($db_connect == False) {
print ("認証失敗");
exit;
}
認証後の処理
こんな感じだと思いますが、
結局各個人のスケジュールやプロフィール編集などする場合、
その該当レコードを検索する必要があって、そこにはIDとかが必要だろうし…
ユーザごとにテーブル作成するのはありえないだろうし、
って書いてたら>>712さんキター
分かりました。予め通常のデータ操作のみ可能なユーザを作成し
ログインした人全員が、そのMySQLユーザで接続して書き込みすればいいのですか
ありがとうございました。
0715nobodyさん
2005/12/25(日) 16:41:24ID:???勿論アプリケーシンにもユーザという概念があるのだから
アプリケーションの部分でユーザアカウント処理と
その為にデータベース(ファイルでも良いけど)に
アカウント管理用のテーブルを設けるのだけどね。
0716nobodyさん
2005/12/25(日) 20:13:40ID:WvivzG1Iみたいなんだけど、何で?
PEARのXML_RSSオブジェクト->parseがダメなみたいっす。
ブラウザからスクリプトにアクセスすればちゃんと動くのに。
0717nobodyさん
2005/12/25(日) 20:49:11ID:???実行時のカレントディレクトリが違うんで相対パスがこけてるとか。
0718nobodyさん
2005/12/25(日) 21:41:54ID:hD4Vkj0e自分は現在
<?php echo "
〜〜〜
"; ?>
で、phpでホームページを作っているのですが、そのホームページの中に
ttp://php.s3.to/simple/#short
ここの「−ショートメッセージ−」という物を取り込みたいのですが、どうすればよいのでしょうか。
普通に取り込んでも
Parse error: parse error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING
とエラーが出てしまい、取り込めません。
0720nobodyさん
2005/12/25(日) 21:55:47ID:hD4Vkj0eとりあえず「"; ?>」から下に、そのHPにかいてる
「<?
$lines = file($logfile);//ファイルを配列に読み込む
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
echo $lines[$i];
?>」
をかいて、メッセージボードを設置したい場所に
<td>
<form method=\"post\" action=\"<? echo $_SERVER['PHP_SELF']; ?>\">
<font face="Arial"><b>-ShortMessage- 自由に書き込んで下さい</b> <small>b,i,s,uタグ可</small></font><br>
<b>N:</b><input name=\"name\" type=\"text\" size=\"10\"
maxlength=\"10\" value=\"<? echo $_POST['name']; ?>\">
<b> : </b><input name=\"message\" type=\"text\" size=\"40\" maxlength=\"60\">
<input name=\"submit\" type=\"submit\" value=\" Send \"><br>
</form>
</td>
としてみたところ、エラーがでました。
0721nobodyさん
2005/12/25(日) 22:03:35ID:???全然普通じゃないじゃん。
> <form method=\"post\" action=\"
この辺のエスケープから察するに、フォームのHTMLをprintか何かで出力してるのか?
だったら
> <? echo $_SERVER['PHP_SELF']; ?>
これをそのまま書いてたらダメだろ。
0722nobodyさん
2005/12/25(日) 22:19:28ID:hD4Vkj0eすみません、ttp://php.s3.to/simple/#shortにはそう書いてありましたのでそうしてしまいました。
たしかに<? echo $_SERVER['PHP_SELF']; ?> の行でエラーがでます。
どのようにすれば改善できるのでしょうか。
0723nobodyさん
2005/12/25(日) 22:25:03ID:???0724nobodyさん
2005/12/25(日) 22:36:53ID:hD4Vkj0eなるほど、ありがとうございます。
じゃあttp://php.s3.to/simple/#shortに書いてある方法と同じですね。
そのページにかいてある方法では、
使用するページの拡張子を.phpにして、<?include("short.php");?>を挿入します。
と書いてありますが、 「<?php echo "」内に「<?include("short.php");?>」を書くとエラーが起きてしまいますが、
0726nobodyさん
2005/12/25(日) 22:49:49ID:hD4Vkj0ehttp://php.s3.to/tt/tt2.php
このページの真ん中にかいてある、
「<?php echo "<html><body text=\"#ffffee\" vlink=\"#ddaa55\">"; ?>」〜〜〜
を参考にしました。「<?php echo」内にHTMLを書いています。
それで、ttp://php.s3.to/simple/#shortには、「<?include("short.php");?>を挿入します。 」
と書いていたからです。
0727nobodyさん
2005/12/25(日) 22:56:42ID:???(<?php 〜 ?>外の)HTML内にある<?php 〜 ?>では意味が違う。
この辺の基本的な事を理解していないから変な事を書いているのでは?
そもそも元のページは<?php echo"〜"; ?>しか無いのか?
それで何でわざわざPHPで実行する?
0728nobodyさん
2005/12/25(日) 23:06:53ID:WvivzG1Iあ、cronに限らず、telnetでコマンドラインから実行してもダメでした。
$xmlrss->parse();とするとxml_rss objectが生成されている(print_rで確認)ので、
PEARのRSS.phpは読み込めてると思うんですが。。ただ、
[_error_class] => XML_Parser_Error
という値が入ってるのを発見。しかもRSSファイルに入ってる
データは全く取得できてないし。なんじゃこら。
コマンドラインから実行すると、外部サーバーのファイルに
アクセスできないとか?
■ このスレッドは過去ログ倉庫に格納されています