電子書籍の厳選無料作品が豊富!

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);
~いろんな処理~
}

どのようにすればいいものでしょうか?
アドバイスなど頂けますと幸いです。宜しくお願い致します。

A 回答 (4件)

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();
}

勉強中の段階ですのでまだまだ完成品には程遠く入力チェックなどの
エラー処理など課題は山積みです・・・^^;

補足日時:2008/06/15 19:17
    • good
    • 0

処理の流れはそんな感じで良いんじゃないでしょうか。



エラーの意味に関しては、プログラムをやるならエラーはご自分で
理解できるようになっておいた方が良いと思います。
エラーメッセージには行番号が出ますし、英語もそれほど難しくはありませんので。
行番号がおかしなところを指していれば、括弧が合っていないことが多いです。

もしエラーメッセージの意味がわからなかったら翻訳サイトで日本語に翻訳するか、
検索エンジンにそのまま放り込めば大抵は答えが見つかります。
    • good
    • 0
この回答へのお礼

お返事ありがとうございます!
本やサイトを見て勉強しているのですが十人十色という言葉通り
構成もそれぞれでどの方法が効率がいいものかというところからで
困惑しておりました。
今回質問させて頂きました件は、おかげ様でなんとか解決できましたので
引き続き頑張ってみたいと思います。

またつまずいた際にお世話になることがあるかと思いますがその際は
またアドバイスなど頂けますと幸いです。
本当にありがとうございました。

お礼日時:2008/06/15 23:24

No.2の方の回答への補足ですが、


PHP の配列は $_POST["submit"] のように [] で括るのが普通ですが、
{}で括っても良いようです。
(私も知りませんでしたが書いてみると動いてびっくりしました。。)
PHP のマニュアルを見てもこのような書き方は見つからなかったのですが…。

いずれにせよ、配列は [] で括った方が良いかと思います。
    • good
    • 0

$_POST{"submit"}


――が悪さしているのでは。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!