- 締切済み
function()を初めて使いました。エラー。
かなり初歩的な質問をさせていただきます。 初めてfunction関数を使ったのですが、下記のようなエラーが出ました。 Warning: array_reverse() [function.array-reverse]: The argument should be an array in E:\Web\Chat2\chat\logpage.php on line 99 Warning: array_reverse() [function.array-reverse]: The argument should be an array in E:\Web\Chat2\chat\logpage.php on line 100 Warning: array_reverse() [function.array-reverse]: The argument should be an array in E:\Web\Chat2\chat\function.php on line 38 Warning: flock() expects parameter 1 to be resource, boolean given in E:\Web\Chat2\chat\function.php on line 41 Warning: fputs(): supplied argument is not a valid stream resource in E:\Web\Chat2\chat\function.php on line 48 Warning: flock() expects parameter 1 to be resource, boolean given in E:\Web\Chat2\chat\function.php on line 49 Warning: fclose(): supplied argument is not a valid stream resource in E:\Web\Chat2\chat\function.php on line 50 チャットを作っていて、何度も使う文をfunctionでまとめて、別ファイルに保存し、 requireで呼び出して、str();で使うとこうなりました。 function load(){ $log_data = "./data/log".$_GET['id'].".cgi"; $log_file = file($log_data); $member_data = "./data/member".$_GET['id'].".cgi"; $member_file = file($member_data); } このような形で使っているのですが、何かfunctionを使うにあたって注意などがあれば教えていただけませんか?
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- izayoimizuki
- ベストアンサー率41% (84/202)
少しほかの方とは違う切り口でアドバイスします。 $_GET等外部からの入力を何もエスケープ処理をせずにシステムにアクセスする関数に通すのはあまり良くないです。 安全ではないです。 パイプ(|)によって複数のファイルにアクセスできるので無関係なファイルの中身を書き換えられる可能性があります。
- aqucent
- ベストアンサー率39% (78/200)
#1です。 見当違いのアドバイスだったようです。 #1 のアドバイスは忘れてください。 失礼しました。
- php504
- ベストアンサー率42% (926/2160)
追加ですが$_GETのような$_で始まる定義済みの変数は元からスーパーグローバルなので関数内でもそのまま使えます。 http://www.php.net/manual/ja/language.variables.predefined.php 変数のスコープについては http://www.php.net/manual/ja/language.variables.scope.php を参考にしてください
- php504
- ベストアンサー率42% (926/2160)
関数を使うときには変数の有効範囲(変数のスコープといったりします)に注意しましょう。 関数の中の変数と関数の外の変数は名前が同じでも違う変数になります。 function load(){ $log_data = "./data/log".$_GET['id'].".cgi"; $log_file = file($log_data); $member_data = "./data/member".$_GET['id'].".cgi"; $member_file = file($member_data); } の$log_file、$member_fileはそのままでは使えません 関数の外でarray_reverse($member_file)としても$member_fileは空ですのでご質問のエラーになります。 解決方法ですが変数をグローバル変数(関数の中と外両方で使える変数)にするのと関数の戻り値として変数を渡す方法があります。 グローバル変数にするには function load(){ global $log_file, $member_file; $log_data = "./data/log".$_GET['id'].".cgi"; $log_file = file($log_data); $member_data = "./data/member".$_GET['id'].".cgi"; $member_file = file($member_data); } 又は function load(){ $log_data = "./data/log".$_GET['id'].".cgi"; $GLOBALS['log_file'] = file($log_data); $member_data = "./data/member".$_GET['id'].".cgi"; $GLOBALS['member_file'] = file($member_data); } のようにします。 戻り値で受け取るには function load(){ $log_data = "./data/log".$_GET['id'].".cgi"; $log_file = file($log_data); $member_data = "./data/member".$_GET['id'].".cgi"; $member_file = file($member_data); return array($log_file, $member_file); } として関数を呼ぶときに list($log_file, $member_file)=load(); として受け取ります(配列でreturnしたのでlistで受け取っています)。
- aqucent
- ベストアンサー率39% (78/200)
とりあえず、1つ和訳してみます。 > Warning: array_reverse() ... expects parameter 1 to be resource, boolean given in ... on line 38 logpage.phpの38行目にあるarray_reverse関数は配列を引数に取るべきです。 load関数というより、array_reverse関数を呼び出している部分に問題があるようです。 array_reverse('hogehoge'); のようにして、配列を渡すべきところを別の型を渡している、という事かと思います。 後半部分は良く解りませんが、型の扱いを間違っている、という事かなあ? 恐らく、fopenで返すファイルポインタの使い方を誤っているのではないでしょうか。 array_reverse関数と同じように、警告が示している行番号周辺をチェックしてみて下さい。 以下は、簡単なファイル書き込みの例です。 $path = 'log.txt'; // 書き込み先のファイルパスを初期化 $dat = 'hogehoge'; // 書き込みデータを初期化 if($fp = fopen($path, 'w')){ // オープン if(flock($fp, LOCK_EX)){ // 排他的ロックを行う fwrite($fp, $dat); // 書き込み flock($fp, LOCK_UN); // ロックを解放 } fclose ($fp); // クローズ }