ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

ホーム > コミュニティ > PC、インターネット > Let's PHP > トピック一覧 > [初心者] 質問-広場 その6

Let's PHPコミュの[初心者] 質問-広場 その6

  • mixiチェック
  • このエントリーをはてなブックマークに追加

コミュ内全体

初心者のみなさんにはわからないことがたくさんあると思います。
そんな初心者を暖かくサポートするトピックです。

------------------------------------------------------------------

■質問時の注意

1.質問する際にはどのバージョンのPHPを使っているか、
  またOSやWEBサーバーの種類などを明記してください。

例)
  PHP:5.0.1
  OS:Windows XP
  Webサーバ:Apache

2.行った操作や望む結果などを詳しく明記してください。

例)
  fopenで別サイトのファイルを読み込む処理を組んでいるのですが、
  /// コード
  $handle = fopen('http://hoge/hoge.html', 'r');

3.エラーメッセージはそのまま表記してください。
  「エラーが出ます」だけではどのようなエラーか判りません。

○良い例)
  Warning: fopen(): URL file-access is disabled in the server configuration in test.php on line 2
  上記のエラーが発生して読み込めません。

×悪い例)
  エラーが出て読み込めません><

4.教えていただいたらきちんとお礼をいいましょう。

------------------------------------------------------------------

■参考リンク

○PHPマニュアル(※まずはココ)
http://www.php.net/manual/ja/
○日本PHPユーザ会
http://www.php.gr.jp/
○PEARマニュアル
http://pear.php.net/manual/ja/
○メーリングリスト
http://ns1.php.gr.jp/mailman/listinfo/

------------------------------------------------------------------

■過去のトピック

[初心者] 質問-広場 その5
http://mixi.jp/view_bbs.pl?id=50404091
[初心者] 質問-広場 その4
http://mixi.jp/view_bbs.pl?id=36240600
[初心者] 質問-広場 その3
http://mixi.jp/view_bbs.pl?id=22096538
[初心者] 質問-広場 その2
http://mixi.jp/view_bbs.pl?id=12807932
[初心者] 質問-広場(その1)
http://mixi.jp/view_bbs.pl?id=870219

コメント(666)

一応MySqlで一覧表を作り対応しました。

CREATE TABLE workarea ( 日付 DATE, 課目 VARCHAR(40), 補助課目 VARCHAR(40), 適用 VARCHAR(40), 金額 INT, num INT );
INSERT INTO workarea(日付, 課目, 補助課目, 適用, 金額, num ) VALUES( '2014-02-15', '交通費', 'タクシー代', '交際費 タクシー代', 3000, 1 );

としてmain_menuの選択肢から新規TABLE workareaを作るようにやって見ました。

>[626]のバグをごまかしました。
親ウインドウは3秒ごとに更新するので、
もしボタンが押されworkareaの課目が変更されたら、
workareaのテーブルを毎回読んで親ウィンドウは表示するという事で

最大3秒間更新されても表は更新されません。
>>[628]

親画面を3秒にごとに更新というのはなぜですか?
求めている仕様と異なるかもしれませんが
自動リロードをやめて
DBはロックし、
親画面が遷移したら、子は消える
(親がonunloadのとき、子がclose)
にすれば、サーバ負荷もないかと思います。

毎回PHPからそれた話になってしまい、申し訳ありません。
>>[629]
>親画面が遷移したら、子は消える
>(親がonunloadのとき、子がclose)
>にすれば、サーバ負荷もないかと思います。

ありがとうございます!バグはそれで解消できます!!!

ただ親の方のページで一覧表を表示してる。そこの一覧表で変更したい項目がクリックされて、
子ウィンドウが表示します。その子ウィンドウの中のボタン群のうちの変更したいボタンを押したら、
親ウィンドウの一覧表に反映されるようにしたいんです。

毎回自動リロードしているんですが、この子ウィンドウでボタンが選択された時点で子ウィンドウはクローズし
どうやったら親ウィンドウにどうそれを反映した更新ができるか?それが知りたいです。

DBはロックしと言うのはDBをクローズするでやって見たいと思います。

PHPとそれた話でもプログラミングとしては大切な事に思います。

技術ありがとうございます!!!
>>[630]
JavaScriptでブラウザ上のHTMLを書き換えられます。
window.openerの要素に対して値をセットした後で自画面をcloseするという関数を作っておき、ボタンのsubmitではなくonclickでこの関数を呼べばよいです。(子画面から親画面に値をセット、とかDOM、で検索すればソース例色々あります)
データの編集作業をJavaScriptでローカルマシンで行い、編集が終わった時点でPHPを使ってDBに登録すれば良いのではないかと思います。

親画面上のデータですが、セッション変数に格納しては?と思います。
なぜリロードしているのか、なぜ毎回DB読むのかわからないので、それではダメなのかもしれませんが、
PHPはサーバ上で動作し、その結果が自分のブラウザにかえって来ます。通信が発生するので、通常のソフトウエアで画面表示を秒単位で更新するのとは意味が異なります。
>>[631]
ありがとうございます。

新しく聞く単語を聞くと、なかなか前に進めずくすぶってます。でも一応検索とかで調べて理解しようと思います。まだソースもいじろうとしてない状態だし、だからと言って新しく覚える技術に対しての実験もしてません。

また今まで作り中のソースをいじり始めたら、とりとめのない、ぐちゃぐちゃなソースになりそうだから、いまちょっと時間を置いてます。

かっこわるいですが、時間をください。

これで行けると思ったらコーディング再開します!!!本当面倒を見てくれてありがとうございます!
>>[632]
単にPHPのコーティングの練習というよりは、やりたい事があるようなので、
時間をとって勉強して、設計から考えるのは大事なことだと思います。
色々覚えたり考える事が多いので大変かと思いますが、頑張って下さい。
PHP5技術者認定試験[上級]の勉強を始めたのですが、最初の方からつまづいています。
どなたかご教授いただけないでしょうか。

問:次のコードが「512346789」という文字を出力するように、空欄 銑に入る記述を選びなさい。
function func($x,$y){
if( ){
return -1;
}else if($y == 5){
[ ];
}else{
return $x-$y;
}
}
$a = array(8,2,3,6,7,9,1,5,4);
[ ];

答えは
$x==5
return 1
usort($a,'func')

なのですが、
$x==5の時にreturn -1、$y==5の時にreturn 1、その他の時は$x-$yをしてなぜ「512346789」の順になるのか、
デバックもしてみたのですがなかなか理解できずにいます。

よろしくお願いします。
>>[634]
http://manual.xwd.jp/function.usort.html
>比較関数は、最初の引数が 2 番目の引数より小さいか、等しいか、大きい場合に、 それぞれゼロ未満、ゼロに等しい、ゼロより大きい整数を返す 必要があります。
$x==5の時は常に-1を返し、$y==5の時は常に1を返すので5がどの数字よりも小さい物と見なされます。
5以外の時は$x-$yで$xが小さければマイナスを$yが小さければプラスを返すので昇順にソートされます。
>>[638]
レンタルサーバー側にアクセス記録が残るかはレンタルサーバーによりますよ。
普通はスパム温床とかにならないよう、各ユーザーがどんな相手にアクセスしたか程度は一定期間記録してると思いますね。
>>[635]
お答えいただきありがとうございます!!

簡単そうなのに頭の中がごちゃごちゃしそうですw
わかりやすく書いていただき助かりました。
>>[641]
デバッガで追いかけてもなぜこれでソートできるのかはわかりにくいと思います。

function func($x,$y){
return $x-$y;
}
にしてみて普通にソートできることを確認して、その後5だけ前に出すにはどうすればいいかを考えてみれば。
はじめまして
質問させていただきます

PHP5.3.4&FIREFOXを使用しているのですが

・メールを大量に送信したい
・ボタンがクリックされたらめーるをfor文で送信
・メールを送信している最中に「送信中です画面」にリダイレクトしたい
・リダイレクト後もメールを送信している

上記のようにしたいのですが、うまく行きません
http://xoops.hypweb.net/modules/UsersWiki/person/nao-pon/blog/2006-11-17
を参考にして

-------------------------------------------------------------------
// ブラウザとのコネクションが切れても実行し続ける
ignore_user_abort(TRUE);

// ブラウザにはリダイレクトを通知
$location_url = sprintf("http://yahoo.co.jp");
while($i=ob_get_level()){
ob_end_clean();
}
$out = "\r\n";
header("Content-Length: ".strlen($out));
header("Connection: close");
header("Location: " . $location_url);
echo $out;
ob_flush();
ob_end_flush();
flush();

//メール送信
$Mail->send();
-------------------------------------------------------------------


と組んだのですが、メール送信が終わるまでリダイレクトされません
どこを変更すればよいかアドバイスある方いらっしゃいましたらお願いします
>>[643]
メール送信処理だけを別のファイルに用意し、PHPのexec , passthru などの関数を使い外部プログラム(PHPコマンド、セルスクリプトなど)からメール送信する処理を書いているファイルを実行させるマンドを叩いたらいかがでしょうか。試してはないですが、何かできるような気がします。

コマンドからPHPスクリプト実行できる場合、
$location_url = sprintf("http://yahoo.co.jp");
if(exec("php -f mail.php")){
header('location:'.$location);
}


mail.php
<?php
$mail->send();
?>
どんなプログラムをかかれていますかかわかりませんが、どうしてもできない場合、先に$locationに飛ばして、そこからメール送信を処理する方法もありだと思います。
共有ネットワークで大量メール送信とか、帯域潰してプロバイダーに回線止められるんじゃね

下手したら訴えられかねないね。。
>>[644]
windowsサーバー,LINUXサーバー両方で使いたいので出来ればexec等は使用したくないんですよ
なので、PHPの非同期通信&リダイレクトで対応したいのですが

また、専用サーバーなので帯域問題は大丈夫です・・
いや、専用サーバーだからネットワーク帯域は大丈夫ってことは無いかと。。
専用サーバーだからサーバー負荷はいくらかけても良いかもしれないけど、ネットワーク負荷をかけて良いことにはならないよ。
>>[643]

それはPHPのようなサーバーサイドではなく、
Ajax等のクライアントサイドで対応すべき処理です。
>>[643]

がると申します。
他の方も書かれておりますが、基本的に
>>
・メールを大量に送信したい
・ボタンがクリックされたらめーるをfor文で送信
・メールを送信している最中に「送信中です画面」にリダイレクトしたい
・リダイレクト後もメールを送信している
<<
を「全部満たす」のは、若干、技術的その他いくつかの理由から、無理があります。

優先順位を付けて「どの項目が最優先なのか」「なぜそれをしたいのか? それが必要なのか?」を明確にすると、もう少し有効な回答が返ってくるかと思いますが如何でしょうか?

「きっと出来るはずだ! やりたいんだ!」の思いばかりが強すぎると、適切なアドバイスをしてくれる人が離れて行ってしまう化膿性、を、示唆しつつ危惧しております。

ちなみに…拝見していると多分「大量にメールを送りたい」が根っこにあると思うのですが。
そもそも「辞めた方が良い」ってのが初手にあるのですが(その辺は、比較的長い、spam関連の歴史の結果というものがあります)、やりたい場合は、相応のコストを支払った上で「大量メール送信サービスを利用する」ないし「自力で、"大量メール送信サービス"と等価なものを作り上げる」といったあたりが最も妥当かと思います。

言い方を変えると。
「大量メール送信」は、それ自体が「ビジネスとして成り立つ」ような難易度の要求なので。
そんなにお手軽にお安くできるもの、ではない事を知ると、状況が少し見えるのではないかと思います。

以上、何かの参考にでもなれば幸いです。
>>[649]

アドバイス有難うございます。

[大量メール配信について]
こちらは某大手クラウドサービスのシステムを利用し、for文,foreach文で与えられた関数を使用して送信いたします。カスタマーサービスなどで確認をとってあるので、問題ありません。

[優先順位]
1.メールを送信すること
2.再更新やブラウザバックでプログラムが何度も走ってメール送信がされないこと
3.メール配信中(数分〜数十分)に画面がストップしないこと

※2,3対策のために、メール送信が始まったら(あるいは始まる前に)非同期リダイレクトをかけて静的ページを表示させたいと考えています。

PHPのみで行うのが難しい場合、Ajaxで行ったほうが確実でしょうか?
>>[650]

がるです。
> カスタマーサービスなどで確認をとってあるので、問題ありません。
との事ですが、mailの送信、特にそれが「大量」になると。
はっきり申し上げますが「カスタマーサービスでは分からないまたは関わらない」問題ごとが沢山ありますので、「カスタマーセンターでOKって言われた」程度の状況ですと、まだまだ問題が山積しているのではなかろうか? と予想をいたします。
その辺りを「踏まえた上で」であればよろしいのですが、その辺りを踏まえずにやると、割と手痛い火傷をするかと思いますので、お気を付け下さいませ。

まぁ、一端「その辺りは問題が無い」との事なので、ではそれを前提に話を進めますが。

> 1.メールを送信すること
であれば、別にブラウザを使わずに、サーバ側でスクリプト書いて動かして送信すればいいと思うのですが。
「何が何でもブラウザ経由にする必要がある」理由は、なにかありますでしょうか?
特段の理由が無ければ、ブラウザ経由に「しない」方法が一番早いと思われます。


> PHPのみで行うのが難しい場合、Ajaxで行ったほうが確実でしょうか?
mail送信でAjaxは…いくつかやり方の想像も予想もつきますが、基本的には「いずれにしても止めた方が良い」可能性が高いので、あんまりお勧めはいたしません。

以上、簡単にですが。
cakePHPのフォーラム(日本語)
http://cakephp.jp/modules/newbb/

にユーザ登録(サインアップ)しようとしたら、手動認証のようで、
で、フォームに入力してから45時間程度たっているのにまだなにも返事がメールできません。

ふつうどのくらいで認証がおりるかおわかりのかたいらっしゃいますか?
あるいはそうじゃなきゃ、メアドをうちまちがえたか?と危惧してまして。

どうぞよろしくお願いいたします
質問「print文内でif文」

例えばラジオボタンでif文を使ったらこうなりました。

<INPUT type="radio" name="csv[1]" value="1" <?php if ($gender == 1){echo "checked";}?>>男性

これを

<?php
print('<INPUT type="radio" name="csv[1]" value="1" if ($gender == 1){echo "checked";}>男性');
?>

のようにprint文の中でif文を書くにはどうすればいいでしょうか?
>>[653]
<?php
print('<INPUT type="radio" name="csv[1]" value="1"'.$gendet ==1? ' checked' : "".'>男性');
?>
>>[654]、[655] 篤坂さん、ありがとうございます。

三項演算子でできました。
質問「パーミッションを402に?」

FTPクライアントでcsvファイルのパーミッションを「402」にしました。
以前まで「602」ならphpからcsvファイルに書き込みできていましたが、「402」だと拒否されてしまいます。

やりたいことは、ブラウザからcsvファイルを開けないようにします。それから、FTPクライアントで間違ってサーバ上のcsvファイルを上書きしないようにしたいです。

どうやればうまくパーミッションが設定できるでしょうか?
年単位でこのスレッドの更新がない!!(笑)

cliモードでの挙動で質問があります。$_POSTにSTDINからの入力を渡す方法はあるのでしょうか? centos6のphp5.3系が基本ですけど、debian8でphp 5.6も平行して使っています。現在は、

if(php_sapi_name() == 'cli'){
$src = $this->getPostFromStdin();
}else{
$src = &$_POST;
}

で希望の動作はしているのですが。(苦笑) POSTしたときの挙動をデバッグしたいと思ったときにCGIモードでも$_POSTに入ってくるのだから、CLIモードでも同じだろうと思ってやってみたらそうはならなくてアレ?っと思った次第。

PHP5.4以降なら、php.iniのenable_post_data_reading = Onでいいんですかね?

>>[658]

CGIでPOSTされる時はパラメータ(値)は変数名と結びついて渡されるから、$_POSTは常に連想配列になるけど、CLIでは変数名という概念がなく、パラメータの位置でその意味を解釈することになる。

getPostFromStdin()という関数はPHP標準の関数ではなく、特定のフレームワークに標準装備されているものか、自前で作成した関数だろうから、その挙動について知りたければその関数の定義(ソースコード)を読めば良い。

enable_post_data_readingは、CGIでPOSTされてきても$_POSTや$_FILESといったスーパーグローバル変数が作られない方が好ましい場合にOffにするもので、CLIの際の挙動には影響しないはず。enable_post_data_readingをOffにしておくとCGIでPOSTされた際も標準入力ストリームからパラメータを読み取ることになるので、CGIでもCLIと同じようなフローで設計できるように見えるかも知れないが、変数名=値という関係性はCLIには存在しないので、同じコードでは動かないはず。
>>[659]

private function getPostFromStdin()
{
$result = array();
$buf='';
while($work=fread(STDIN,8192)){
$buf.=$work;
}
$buf=substr($buf,0,strlen($buf) - 1 );
$work=explode('&',$buf);
foreach($work as $k => $v){
$a = explode('=',$v);
$result[$a[0]] = urldecode($a[1]);
}
return $result;
}
こんな感じでCLIモードの時はSTDINからの入力を切り出して連想配列にしまう処理を入れています。

enable_post_data_reading解説、ありがとうございます。
やはり、そんな単純な話ではないのですね(^^;;
>>[660]

一瞥して、そのコードには少なくとも2つの脆弱性があることが分かる。
>>[661]

確かに、このまま使うのはアレですが。(苦笑)

実用で使うには、STDINの入力にリミットつけることと入力されたデータのフォーマットの確認は必要ですね。
1年以上止まってる様ですが、誰か見ていることを期待して質問します。
日本語ファイル名の文字コード(ファイルの中身ではなくファイル名そのものです)に関しての質問です。レンタルサーバーの場合、同じサイトでも契約した時期によって違うことも有るらしく、スクリプト内で判定して場合分け処理する様にしたいと思っています。
具体的にはurlencodeを使って、画像へのリンクを<a href="%xx%xx%xx%xx.jpg">みたいにしたいのですが、その時ファイル名をどのコードに変換してからencodeすればよいか、ということです。

UNIX系のレンタルサーバーではeuc-jpかutf-8が多いと思いますが、phpスクリプト内で自分自身のいるサーバーがどのコードを採用しているか知る方法は有るのでしょうか?
実際に日本語の名前のファイルを置いて、readdir()などでそれを調べる、というのは考えられますが、下手すると消せないファイルが出来るので出来れば避けたいと思っています。
>>[664]

自分自身で探求したわけではないので伝聞形になりますが、Linuxのファイルシステムにはファイルシステム固有の文字エンコーディングという概念はなく、ファイル名は単なるバイトシーケンスで、ユーザのロケールの影響を受けるようです。
実際、phpでは同一ファイルシステム上で、UTF-8でもShiftJISでもファイルを保存できアクセスもできます。
ただ、文字エンコーディングが混在しているとreaddir()などで文字化けが起きるでしょうが、それは読み取った方が特定の文字エンコーディングを前提としているからでしょう。
もし、統一された文字エンコーディングでマルチバイト文字がファイル名に使われているのであれば、ディレクトリ内のファイル名をサンプリングしてmb_detect_encodingで調べられるでしょう。ただし、サンプリングした文字列によっては判定を誤ります。

>>[665]
ご丁寧な回答ありがとうございました。
頂いた情報を参考にいろいろ試してみます。
借りているサーバーのうち一社だけはsshが使えることが判明したので、文字コードを変えてシェルでどう表示されるか確認してみます。
別の方から「(禁則文字などが入って)消せないファイル」はファイルマネージャーなどが使える所ではそちらで消せる、というアドバイスも頂きました。

ログインすると、残り632件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

Let's PHP 更新情報

Let's PHPのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング

mixiチケット決済