• 締切済み

extract($_POST)

PHP&MySQLの初心者です。 レンタルサーバーでPHP&MySQLを利用したいと思い、入門本を読みながらやっておりますが、PHPからMySQLのデータベースへ 入力しようとすると、 Warning: extract() expects first argument to be an array in /home/.sites/62/site118/web/ken4.php on line 12 のエラーがでます。 色々調べて行くとどうも「extract($_POST)」がPHPのバージョンによって使えないとの事までは解ったのですが、これを回避する方法がわかりません。 レンタルサーバーはPHP4(4.0.6)とMySQL(3.23)です。 是非ともご回答をお待ちしています。 ちなみに入門本のスクリプトは以下のものです。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang="ja"> <head> <title>県データ登録</title> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> </head> <body> <?php extract($_POST); if($ken<>''){ mysql_connect('××××','×××','××××'); mysql_select_db('×××'); $sql = "insert into todofuken values('$ken', '$kec', $jin, $men,)"; mysql_query($sql); $ken = ''; echo "データを登録しました<br />"; echo "登録を続けますか <a href=\"ken4.php\">続行</a>"; exit; } ?> <p>データを入力してください</p> <form action="ken4.php" method="post" > <p>県   名:<input type="text" name="ken" size="40"></p> <p>県庁所在地:<input type="text" name="kec" size="40"></p> <p>人   口:<input type="text" name="jin" size="40"></p> <p>面   積:<input type="text" name="men" size="40"></p> <input type="submit" value="登録"> <input type="reset" value="リセット"> </form> </body> </html>

  • PHP
  • 回答数3
  • ありがとう数3

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

シフトJISだとインジェクション対策がかなりいろいろ引っかかりそうですが たとえばmysql_escape_stringをつかってこんな感じにします。 今回の場合ですと外部からうけとる変数を'ken','kec','jin','men'に しぼっています。そうしないと、ユーザーが任意で設定した変数を 勝手におくられてきた場合、想定外の挙動をとる可能性があります。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang="ja"> <head> <title>県データ登録</title> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> </head> <body> <?PHP foreach(Array('ken','kec','jin','men') as $val){ if($_POST["{$val}"]!="") $$val=mysql_escape_string($_POST["{$val}"]); } if(isset($ken)){ $link=mysql_connect('××××','×××','××××'); mysql_select_db('×××',$link); $sql = "insert into todofuken values('{$ken}','{$kec}', '{$jin}', '{$men}')"; mysql_query($sql,$link); //print $sql; unset($ken); echo <<<eof データを登録しました<br /> 登録を続けますか <a href="{$_SERVER['PHP_SELF']}">続行</a> eof; }else{ echo <<<eof <p>データを入力してください</p> <form action="{$_SERVER['PHP_SELF']}" method="post" > <p>県   名:<input type="text" name="ken" size="40"></p> <p>県庁所在地:<input type="text" name="kec" size="40"></p> <p>人   口:<input type="text" name="jin" size="40"></p> <p>面   積:<input type="text" name="men" size="40"></p> <input type="submit" value="登録"> <input type="reset" value="リセット"> </form> eof; } ?> </body> </html>

celsior-c
質問者

お礼

ありがとうございます。教えて頂いた方法でうまく行きました。 今までVBAでの経験はかなりあったので、PHP&MySQLもと思ってやり始めましたが、入り口で躓き気持ちが萎えかけていましたが、 一つステップがUP出来たので、また頑張れそうです。 本当に有り難う御座いました。

  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.2

>>(実際には$valになんらかの処理をいれて危険要素を排除してください) >の意味がイマイチ分かりません。 mysql_real_escape_string()や、文字コード問題やSQLインジェクションやクロスサイトスクリプティングについてしっかり調べましょう。 しっかり知識を得た上で対策をとらないと、公開サーバーにアップしたとたんに攻撃を受けてしまいます。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

extract()自体が危険性を含む関数のため$_POSTなど 外からデータを持ちこむ際のご利用にはオススメできません。 ただ、どうしてもそれが必要で、なんらかの理由でうまく動かないので あれば同様の処理は以下のようにしてみてはいかがでしょうか? (実際には$valになんらかの処理をいれて危険要素を排除してください) if(is_array($_POST)) foreach($_POST as $key=>$val){ $$key=$val; }

celsior-c
質問者

お礼

早速のご意見有り難うございます。 Warning: extract() expects first argument to be an array in /home/.sites/62/site118/web/ken4.php on line 12 のエラーは回避出来ましたが、データベースに入力は出来ませんでした。 全くの初心者で申し訳ないのですが、 >(実際には$valになんらかの処理をいれて危険要素を排除してください) の意味がイマイチ分かりません。

関連するQ&A

  • フォーム情報をDBに追加できない

    はじめまして。 初心者で現在参考書を使ってMYSQL、PHP、HTMLを学習してるんですが フォームの情報をデータベースに格納できません。 (ken1.php) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang="ja"> <head> <title>県別人口面積その1</title> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> </head> <body> <?php mysql_connect('localhost','root','freedom'); mysql_select_db('lesson'); $sql= "select * from todofuken"; $result = mysql_query($sql); $rows = mysql_num_rows($result); if($rows == 0){ echo "<p>該当データがありません。</p>"; } else { while($row = mysql_fetch_array($result)){ echo "<p>"; echo $row["kenmei"]; echo " "; echo $row["kencho"]; echo " "; echo $row["jinko"]; echo " "; echo $row["menseki"]; echo "</p>"; } } ?> </body> </html> (ken2.html) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang="ja"> <head> <title>フォーム文</title> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> </head> <body> <p>データを入力してください</p> <form action="ken3.php" method="post" > <p>県   名<input type="text" name="ken" size="40"></p> <p>県庁所在地<input type="text" name="kec" size="40"></p> <p>人   口<input type="text" name="jin" size="40"></p> <p>面   積<input type="text" name="men" size="40"></p> <input type="submit" value="登録"> <input type="reset" value="リセット"> </form> </body> </html> (ken3.php) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang="ja"> <head> <title>ここにページのタイトルが入る</title> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> </head> <body> <?php error_reporting(E_ALL & ~E_NOTICE); extract($_POST); mysql_connect('localhost','root','freedom'); mysql_select_db('lesson'); $sql = "insert into todofuken values('$ken', '$kec', $jin, $men, 0)"; mysql_query($sql); ?> </body> </html> ブラウザでken2.htmlのフォームにデータを埋め込み、そのデータを DBに追加したいんです。 問題はken2.htmlの登録ボタンを押してken3.php に移動するまでは良いんですが DBにデータが追加されません。 構文は参考書どうりにやっているので間違いないと思うのですが 原因がわかる方どうぞよろしくお願いします。

    • 締切済み
    • PHP
  • フォームデータをデータベースに追加したい

    はじめまして。 初心者で参考書を使ってPHP、MYSQLを学習してるんですが フォームに入力したデータをデータベースに追加するとこが 参考書どうりにやってるんですができません。 どうかお力を貸してください。 (ken1.php) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang="ja"> <head> <title>県別人口面積その1</title> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> </head> <body> <?php mysql_connect('localhost','root','freedom'); mysql_select_db('lesson'); $sql= "select * from todofuken"; $result = mysql_query($sql); $rows = mysql_num_rows($result); if($rows == 0){ echo "<p>該当データがありません。</p>"; } else { while($row = mysql_fetch_array($result)){ echo "<p>"; echo $row["kenmei"]; echo " "; echo $row["kencho"]; echo " "; echo $row["jinko"]; echo " "; echo $row["menseki"]; echo "</p>"; } } ?> </body> </html> (ken2.html) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang="ja"> <head> <title>フォーム文</title> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> </head> <body> <p>データを入力してください</p> <form action="ken3.php" method="post" > <p>県   名<input type="text" name="ken" size="40"></p> <p>県庁所在地<input type="text" name="kec" size="40"></p> <p>人   口<input type="text" name="jin" size="40"></p> <p>面   積<input type="text" name="men" size="40"></p> <input type="submit" value="登録"> <input type="reset" value="リセット"> </form> </body> </html> (ken3.php) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang="ja"> <head> <title>ここにページのタイトルが入る</title> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> </head> <body> <?php extract($_POST); mysql_connect('localhost','root','freedom'); mysql_select_db('lesson'); $sql = "insert into todofuken values('$ken', '$kec', $jin, $men, 0)"; mysql_query($sql); ?> </body> </html> ken2.htmlで入力したデータをデータベースに追加したいのですが ブラウザ上で登録ボタンを押してken3.phpに移動するまでうまくいっています。 参考書ではこの操作で入力したデータがデータベースに追加されると書いているのですが データベースを見ても追加されていません。 原因をいろいろ調べたのですが不明なのでお力添えお願いします。

    • 締切済み
    • PHP
  • 記述の仕方

    <?php For ($p=1; $p<=5; $p=1++){ $wr = "<input type="text" name="ken[p]" value="<?php echo $ken[$p] ;?>"> $wr = $wr . "<input type="text" name="ken[p]" value="<?php echo $shouhin_name[$p] ;?>>" }    echo $wr ?> この記述ではエラーになりますどうしてですか?

    • ベストアンサー
    • PHP
  • フォームからmySQL-DBにデータ登録したいです。

    FedoraCore6 + Apache2.2.4 + MySQL5.0.41 + PHP4.4.7 で学習しています。 TABLE aaa( id MEDIUMINT NOT NULL AUTO_INCREMENT, hiduke DATE, xyz INT, comment VARCHAR(30), PRIMARY KEY (id) );  という表を作り、 入力フォーム [TEST.html] <html><head><meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"></head> <body><p>データ入力</p> <form action="datatest.php" method="POST"> <p>日付<input type="text" name="hiduke" size="12"></p> <p>データ<input type="text" name="xyz" size="6"></p> <p>コメント<input type="text" name="comment" size="40"></p> <input type="submit" value="登録"> <input type="reset" value="リセット"> </form></body></html> ------------------ 書込スクリプト [datatest.php] <html><body> <php extract($_POST); mysql_connect(localhost,bbbbbb,******); mysql_select_db(cccccc); $sql = "insert into aaa values(0 '$hiduke','$xyz','$comment')"; mysql_query($sql); ?> 下記の内容で登録しました<p> 日付:<? echo $hiduke; ?> <br> データ:<? echo $xyz; ?> <br> コメント:<? echo $comment; ?> <br> <p></body></html> でデータを登録しようとしましたが書き込みができません。何が悪いのでしょうか? 基本的なところが間違っていると思い、いろいろ調べましたが、私の現在の力では原因を見つけることができないでいまず。よろしくご指導下さい。 なお、コマンドラインから、insert into aaa values(0, 20071008,3840,'qqqqq'); なら書込みできます。

    • ベストアンサー
    • MySQL
  • 質問です!

    下記のように記述しました。 $jusyo_ken_meiをarray構文にしたのですが、沖縄しか出ません。 2345も出せるようにしたいのですがどうしたらいいですか? <body> <form method="POST" action="text.php"> <p><input type="text" name="T1" size="20" value="<?php echo $T1 ; ?>"></p> <p><select size="1" name="$jusyo_ken"> <?php $jusyo_ken_mei = array (1 =>"沖縄県" , 2 =>"北海道", 3 =>"東京", 4 =>"大阪", 5 =>"鹿児島"); if ($jusyo_ken == ""){ echo "<option value=\"\" selected>---</optin>"; }else{ echo "<option value=\"\">--- </optin>"; } if ($jusyo_ken == "$jusyo_ken_mei[1]"){ echo "<option selected>$jusyo_ken_mei[1]</option>"; }else{ echo "<option>$jusyo_ken_mei[1]</option>"; } ?> </select></p> <p> </p> <p> </p> <p> </p> <p><input type="submit" value="送信" name="B1"><input type="reset" value="リセット" name="B2"></p> </form> </body>

    • ベストアンサー
    • PHP
  • 住所録を作りたい

    『MySQL入門以前』という本をみながら住所録をつくっています。 1、htmlファイル データ登録画面用 ↓ 2、phpファイル データをMySQLデータベースに書き込み ↓ 3、phpファイル MySQLのテーブルから全体を読み出し の3つのファイルから構成しています。 データ登録画面で、全角文字『愛知県』をいれると データベースに新しいデータが追加されません。 半角英数字abcや123なら、新しいデータが追加されます。 どうしたら全角文字も対応させられるのでしょうか。 ファイルの一部 <form action="touroku.php" method="post"> <p>氏名:<input type="text" name="simei" size="40"></p> <p>郵便番号:<input type="text" name="yubin1" size="5">-<input type="text" name="yubin2" size="8"></p> <p>住所1:<input type="text" name="jusho1" size="50"></p> <p><input type="submit" value="登録"> <input type="reset" value="リセット"></p> </form> MySQL 5.0 PHP 5.2.5.5 apache 2.0.59 Windowes XP

    • 締切済み
    • PHP
  • postのタイムラグ

    以下のソースでPOSTの値が取れないときがあるので困っています。 具体的にはページを表示してから30秒程度待ってからの クリックじゃないとPOSTの値が取れません。 GETの場合はページ表示後すぐにボタンをクリックしても大丈夫でした。 原因が分からず途方に暮れています。 お知恵をお貸しください。 PHP Version 5.2.3 <?php $P_data = $_POST["pg"]; print("POST=>".$P_data."<BR>"); $G_data = $_GET["pg"]; print("GET=>".$G_data."<BR>"); print <<< DOC_END <html> <head> </head> <body> DOC_END; echo"<form action=test.php method=post>"; echo"<input type=hidden name=pg value=1>"; echo"<input type=submit value=あ>"; echo"</form>"; echo"<form action=test.php method=post>"; echo"<input type=hidden name=pg value=2>"; echo"<input type=submit value=い>"; echo"</form>"; echo"<form action=test.php>"; echo"<input type=hidden name=pg value=3>"; echo"<input type=submit value=う>"; echo"</form>"; echo"<form action=test.php>"; echo"<input type=hidden name=pg value=4>"; echo"<input type=submit value=え>"; echo"</form>"; print <<< END </body> </html> END; ?>

    • 締切済み
    • PHP
  • POSTされない

    xamppにてローカル環境でやっているのですがなぜか type="file"だけPOSTされません。 ie6とfairefox3で試しましたが取得できませんでした。 調べてみたのですが同様の事例が見つからずわからかったのですが これは何が原因なのでしょうか? ---html--- <form action="index.php" method="post" enctype="multipart/form-data"> <input type="text" name="name" /> <input type="file" name="img" /> <input type="submit" name="send" value="送信する" /> </form> ---php--- if (isset($_POST['send'])) { echo '<pre>'; print_r($_POST); echo '</pre>'; } print_r($_FILES);を試すと正常に値が表示されます。全く意味不明 なのですが何かセキュリティ上の問題などが原因なのでしょうか?

    • 締切済み
    • PHP
  • PHPでのCookie

    PHPでクッキーを使い、下記のような入力フォームを作りました。 form.phpで入力→form2.phpで正常出力出来るのですが、 form2.phpで一度更新しないと、結果が画面に表示されません。 これをform2.phpを開いた時点で表示されるようにするには、どのように書けばいいのでしょう。 後1つあります。form.phpで 「テスト&1」と書くと「テスト」としか表示されなく、&とそれ以降が記憶されません。 これはなぜでしょうか? お願いします。 【form.php】 <?PHP parse_str($_COOKIE["city"]); parse_str($_COOKIE["city_name"]); ?> <html> <form method="post" action="form2.php"> <?PHP echo "名前1<input type=text name=name1 maxlength=16 size=12 value=$set_name1> <BR>ID<input type=text name=p1 maxlength=8 size=6 value=$set1><BR><BR>"; echo "名前2<input type=text name=name2 maxlength=16 size=12 value=$set_name2> <BR>ID<input type=text name=p2 maxlength=8 size=6 value=$set2>"; ?> <input type="submit" value="実行"> </form> </html> 【form2.php】 <?php if ($_POST) { $city1 = $_POST["p1"]; $city2 = $_POST["p2"]; $city_name1 = $_POST["name1"]; $city_name2 = $_POST["name2"]; setcookie ("city", "set1=$city1&set2=$city2",time()+3600*24*90); setcookie ("city_name", "set_name1=$city_name1&set_name2=$city_name2",time()+3600*24*90); } parse_str($_COOKIE["city"]); parse_str($_COOKIE["city_name"]); echo $set_name1; echo $set1; echo $set_name2; echo $set2; ?>

    • ベストアンサー
    • PHP
  • POSTで送りたい

    PHP初心者です HTMLタグが混じっ文字をHTMLごとPOSTで次ページに送る方法を教えてください ここでは<p><a href="./">TOPに戻る</a></p>をポストしたいです <form action = "test_view.php" method = "post" > <input type="text" name="<p><a href="./">TOPに戻る</a></p>"> <input type="submit" name="" value="送信"> </form> よろしくお願いします

    • ベストアンサー
    • PHP

専門家に質問してみよう