![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_14.png?8acaa2e)
http://phpnet.blog91.fc2.com/blog-entry-6.html
こちらのページを参考しているのですが下記のコードが
エラーになってしまいます。
・エラー内容
extract() [function.extract]: First argument should be an array
・エラー箇所
extract($array);
function($array) {
hogehoge
}
のようにfunctionを実行しても定義していないから?とも
思ったのですが応用の方法がわかりません。
現在は以下のようなソースです。
if (!$_POST{"submit"}) {
foreach($_POST as $k => $v) {
if(get_magic_quotes_gpc()) {
$v=stripslashes($v);
}
$v=htmlspecialchars($v);
$array[$k]=$v;
}
extract($array);
~いろんな処理~
}
どのようにすればいいものでしょうか?
アドバイスなど頂けますと幸いです。宜しくお願い致します。
No.1ベストアンサー
- 回答日時:
POST で submit が送られてこなければ foreach で POST の値に処理を加えて
配列 $array に値を入れなおしているという処理だと思いますが、
POST がなければ $array の中身は NULL なので、extract に渡される値が NULL となり、
配列を渡してくださいね、って怒られています。
foreach の前に if( $_POST ) を入れるなり、$array = array(); で
$array を初期化するなりすればいいんじゃないでしょうか。
この回答への補足
お返事ありがとうございます。
エラーの意味すらわからなかったもので非常に助かりました。
var_dump($array);として試してみたところ正常に値を取得できました。
array(5) {
["name"]=>
string(6) "名前"
["email"]=>
string(7) "mail@ad"
["title"]=>
string(12) "タイトル"
["msg"]=>
string(15) "メッセージ"
["mode"]=>
string(7) "confirm"
}
メールフォームから送信するプログラムで流れとして
入力→確認→送信完了という形なので確認する箇所に記述しましたが
知識不足で自信がないものでおかしい箇所などがありましたら
教えて頂けますと幸いです。
---forms.php---
require_once "tpl.php";
// データ取得
$mode = $_POST["mode"];
switch ($mode) {
// メール送信
case "send":
send();
break;
// データ処理と確認
case "confirm":
if (!$_POST["submit"]) {
//POSTデータを全て受け取りエスケープして変数に入れる
foreach($_POST as $k => $v) {
if(get_magic_quotes_gpc()) {
$v=stripslashes($v);
}
$v=htmlspecialchars($v);
$array[$k]=$v;
}
extract($array);
}
confirm();
break;
// 入力フォーム表示
default:
input();
break;
}
---tpl.php---
// フォーム表示
function input() {
echo <<<EOM
<form method="post" action="forms.php">
<table border="1">
<tr>
<td>お名前</td>
<td><input type="text" name="name" size="20"></td>
</tr>
<tr>
<td>メールアドレス</td>
<td><input type="text" name="email" size="20"></td>
</tr>
<tr>
<td>タイトル</td>
<td><input type="text" name="title" size="20"></td>
</tr>
<tr>
<td>メッセージ</td>
<td><textarea name="msg" rows="5" cols="40"></textarea></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="内容を確認"></td>
</tr>
</table>
<input type="hidden" name="mode" id="mode" value="confirm" />
</form>
EOM;
exit();
}
// 確認画面表示
function confirm() {
$aa = nl2br($_POST['msg']);
echo <<<EOM
<p>{$_POST["name"]} 様</p>
下記の内容で送信致します。送信内容を確認後送信ボタンを押してください。
<form method="post" action="forms.php">
<table border="1">
<tr>
<td>お名前</td>
<td>{$_POST["name"]}</td>
</tr>
<tr>
<td>メールアドレス</td>
<td>{$_POST['email']}</td>
</tr>
<tr>
<td>タイトル</td>
<td>{$_POST['title']}</td>
</tr>
<tr>
<td>メッセージ</td>
<td>$aa</td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="送 信" /> <input type="button" value="戻 る" onclick="history.back()" /></td>
</tr>
</table>
<input type="hidden" name="mode" id="mode" value="send" />
</form>
EOM;
exit();
}
// 送信完了画面表示
function send() {
echo <<<EOM
<p>{$_POST["name"]} 様</p>
<p>お問い合わせありがとうございました。</p>
EOM;
exit();
}
勉強中の段階ですのでまだまだ完成品には程遠く入力チェックなどの
エラー処理など課題は山積みです・・・^^;
No.4
- 回答日時:
処理の流れはそんな感じで良いんじゃないでしょうか。
エラーの意味に関しては、プログラムをやるならエラーはご自分で
理解できるようになっておいた方が良いと思います。
エラーメッセージには行番号が出ますし、英語もそれほど難しくはありませんので。
行番号がおかしなところを指していれば、括弧が合っていないことが多いです。
もしエラーメッセージの意味がわからなかったら翻訳サイトで日本語に翻訳するか、
検索エンジンにそのまま放り込めば大抵は答えが見つかります。
お返事ありがとうございます!
本やサイトを見て勉強しているのですが十人十色という言葉通り
構成もそれぞれでどの方法が効率がいいものかというところからで
困惑しておりました。
今回質問させて頂きました件は、おかげ様でなんとか解決できましたので
引き続き頑張ってみたいと思います。
またつまずいた際にお世話になることがあるかと思いますがその際は
またアドバイスなど頂けますと幸いです。
本当にありがとうございました。
No.3
- 回答日時:
No.2の方の回答への補足ですが、
PHP の配列は $_POST["submit"] のように [] で括るのが普通ですが、
{}で括っても良いようです。
(私も知りませんでしたが書いてみると動いてびっくりしました。。)
PHP のマニュアルを見てもこのような書き方は見つからなかったのですが…。
いずれにせよ、配列は [] で括った方が良いかと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- PHP PHPのエラーの解消法について教えて下さい。 1 2023/02/06 10:48
- WordPress(ワードプレス) wordpressでphpを読み込みたい 1 2022/10/30 23:40
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- PHP php ログイン 1 2022/11/01 00:24
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) 型が一致しませんとエラー 6 2023/07/06 20:14
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- JavaScript 2段階プルダウンで1段階目の選択を終えた後に選択ボックスを見えなくしたい 2 2022/07/05 21:58
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語の配列をPush(追加)する...
-
CArrayのソート
-
特定の文からメールアドレスの...
-
STLのvectorで作った配列をメン...
-
読み(あ行~わ行)ごとに分け...
-
Texでの数式
-
CArrayの要素としてCStringArra...
-
順位のところを画像にする方法
-
多次元配列の重複削除
-
Tableの背景色を交互に変えたい
-
PHPは何故値渡しより参照渡しの...
-
PHPのセレクトボックスの初期値...
-
array_search-配列関数の使い方
-
C言語 最大値と最小値を求めて...
-
これって何ソート?
-
mb_encode_numericentityでタグ...
-
$_SESSIONに二次元配列を使える...
-
複数行のデータのPOST処理に関して
-
自動で番号を振りたい
-
CSVデータの行数カウントをした...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラミングのPythonのnoteb...
-
C言語の配列をPush(追加)する...
-
php で1から100までの素数の表...
-
STLのvectorで作った配列をメン...
-
スカラーのベクトル微分
-
行列
-
Perlで重複行を削除したい
-
配列の要素(value)に、変数を...
-
特定の文からメールアドレスの...
-
forとかで連番の変数を一気に格...
-
C言語 最大値と最小値を求めて...
-
PHPでユニークIDを作る
-
CArrayの要素としてCStringArra...
-
fgetc関数について
-
読み(あ行~わ行)ごとに分け...
-
verilogで、配列の一部をタスク...
-
Pager::factory()の使い方がわ...
-
mallocで char *型の配列を確...
-
c言語 単位行列
-
多次元配列の重複削除
おすすめ情報