みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

PHP データベース データ更新

データベース更新について

お世話になっております。
データベースの更新ができず困っております。
ご教授いただければと思います。
PHPは初心者です。
コードは下記の用になっております。

form.php
<?php



$member = $_GET[name];



$query_member = sprintf("SELECT * FROM `member` WHERE ID='$member'");
$result_member = mysql_query($query_member, $link);
if ($result_member) {
$row = mysql_fetch_array($result_member);
if ($row) {
$m_id = $row['id'];
$m_first_name = $row['first_name'];
$m_last_name = $row['last_name'];
$m_first_kana = $row['first_kana'];
$m_last_kana = $row['last_kana'];
$m_b_year = $row['b_year'];
$m_b_month = $row['b_month'];
$m_b_day = $row['b_day'];
}
}
?>
<html>
<body>
<form action="complete.php?<?php print $m_id; ?>" method="POST">
<input type="text" name="<?php print $m_first_name; ?>" value="<?php print $m_first_name; ?>" />
<input type="text" name="<?php print $m_last_name; ?>" value="<?php print $m_last_name; ?>" />
<input type="text" name="<?php print $m_first_kana; ?>" value="<?php print $m_first_kana; ?>" />
<input type="text" name="<?php print $m_last_kana; ?>" value="<?php print $m_last_kana; ?>" />

<input type="text" name="<?php print $m_b_year; ?>" value="<?php print $m_b_year; ?>"> 年
<input type="text" name="<?php print $m_b_month; ?>" value="<?php print $m_b_month; ?>"> 月
<input type="text" name="<?php print $m_b_day; ?>" value="<?php print $m_b_day; ?>"> 日

<input type="submit" name="regist" value="編集">

</form>

complete.php


<?php



$m_id = $_GET[name];



$first_name = mysql_real_escape_string($_POST['m_first_name']);
$last_name = mysql_real_escape_string($_POST['m_last_name']);
$first_kana = mysql_real_escape_string($_POST['m_first_kana']);
$last_kana = mysql_real_escape_string($_POST['m_last_kana']);
$year = mysql_real_escape_string($_POST['m_b_year']);
$month = mysql_real_escape_string($_POST['m_b_month']);
$day = mysql_real_escape_string($_POST['m_b_day']);

$query_edit = sprintf("UPDATA `member` SET `first_name`='$first_name', `last_name`='$last_name' WHERE id='$m_id'");
$result_edit = mysql_query($query_edit, $link) or die(mysql_error());
if ($result_edit) {
$msg = '編集しました。';
} else {
$msg = '編集に失敗しました。';
}

?>
<html>
<body>
<?php print $msg; ?>
</body>
</html>

となっております。

$member = $_GET[name];はhttp://oshiete1.goo.ne.jp/qa5783266.htmlにてご教授いただいたので使用しています。

$result_edit = mysql_query($query_edit, $link) or die(mysql_error());でエラーが出力されたところデータの受け渡しができていませんでした。

どこを直せば良いのかわからず困っております。

お分かりの方がいらっしゃいましたらご教授お願いいたします。

投稿日時 - 2010-03-29 23:52:24

QNo.5788987

すぐに回答ほしいです

質問者が選んだベストアンサー

UPDATA→UPDATE
スペルミスですね。

それとよく見ると↓もおかしい。
<form action="complete.php?<?php print $m_id; ?>" method="POST">

<form action="complete.php" method="POST">
<input type="hidden" name="name" value="<?php print $m_id; ?>" />
とした方がいいですね。

そのかわりに、complete.phpでは
$m_id = $_GET[name];

$m_id = $_POST['name'];
と変えなくてはならない。

$_GET['name']を活かしたければ、以下のような感じに変更で。
<form action="complete.php?name=<?php print $m_id; ?>" method="POST">

あとは、
"SELECT * FROM `member` WHERE ID='$member'"
ID='$member'→`id`='$member'

"UPDATA `member` SET `first_name`='$first_name', `last_name`='$last_name' WHERE id='$m_id'"
id='$m_id'→`id`='$m_id'

大文字小文字の統一と、オブジェクト名をすべて``で括るルールを採用するなら、idにも``を、ってところで、別に動作がおかしい原因にはなりませんが、見た目というかプログラミング意識レベルのツッコミですが。

投稿日時 - 2010-03-30 02:13:54

補足

BellBellさん有難う御座います。

スペルミスでした。申し訳ありません。

><form action="complete.php" method="POST">
><input type="hidden" name="name" value="<?php print $m_id; ?>" />
のように変更したところできました。
有難う御座いました。

投稿日時 - 2010-03-30 11:53:00

このQ&Aは役に立ちましたか?

4人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

横槍の上、蛇足失礼します。
これまでの貴方の投稿を拝見し、疑問を抱いた者です。
少々キツイ事を申し上げますが、別に貴方やこの掲示板のあり方を否定したいわけでは御座いません事、予め申し添えさせて頂きます。

>sprintfにつきましてはPHPの書籍にて勉強したところついておりましたので、使用しています。
>書籍も書籍(ネットもですが)で、ものによっては違う記述がしてあったりするので、できる限り使えるとこは使っているという感じです。

恐らく、No3さんが提示してくれたリンク先さえ読んでいらっしゃらないと思うのですが、「使える所は使う」というレベルであれば誰も指摘なんてしない気がします。
この掲示板の回答者さんは皆さん優しいので、目的の物が完成するまで質問し続ければ、ソースコードを提示してくれたりして、継ぎ接ぎのソースコードで、脆弱性や無駄な処理を抱えたまま、どうにか目的の物が完成するかもしれませんが…
貴方がステップアップして自分で自由に組みたいものを組めるようになりたいと考えるなら、サンプルコードを参考にするにしても、

「何故ここでこのような記述をするのか」

エラーが発生したら

「何故ここでこのようなエラーが発生したのか」

といった事を「考え」「検証」する事が重要だと思います。
(クエリエラーが発生した場合はsql文に問題がある可能性があると考え、SQL文を一旦出力し、そのSQL文が実行可能であるかをチェックするとか…。)

「貰ったアドバイスを無にする」というのは初心者だろうが何だろうが理由にならない気がします。
まず、リンク先を見てsprintfがどういう処理を行うものなのかを確認してみてはいかがでしょうか?

投稿日時 - 2010-03-30 15:31:37

ANo.4

これは ただのアドバイスです。
というか、むしろ ただの余計なお世話です。
つか単に口を出したくなっただけです。

> $m_id = $row['id'];
> $m_first_name = $row['first_name'];
> $m_last_name = $row['last_name'];
> $m_first_kana = $row['first_kana'];
> $m_last_kana = $row['last_kana'];
> $m_b_year = $row['b_year'];
> $m_b_month = $row['b_month'];
> $m_b_day = $row['b_day'];

↑ この部分は、この一行↓で済みます。

extract($row , EXTR_PREFIX_ALL , "m");

ただ extract は マニュアルにも書いていますが、$_GET や $_FILE などには使わないほうがいいので、濫用はしないほうがいいです。
今回は、テーブルのフィールド($rowの中身)以上に展開される事がないので、使用しています。

http://php.net/manual/ja/function.extract.php

あと、 extract() を使う場合は、mysql_fetch_array() ではなく mysql_fetch_assoc() を使ったほうがいい感じです。
mysql_fetch_array() と mysql_fetch_assoc() を var_dump() してみれば分かりますが、
assoc のほうが 作られる配列が少ないので、extract() で 展開した時に、無駄な変数を作りません。
-------------------------------------------------
↓ここら辺の一連の並びとか、
> $first_name = mysql_real_escape_string($_POST['m_first_name']);

↓ここら辺とかは、
> <input type="text" name="m_first_name" value="<?php print $m_first_name; ?>

俺なら別の書き方をしますが、いよいよ邪道っぽくなってくるので 今回は提示しません。
有刺鉄線使ったり電流爆破をするわけではありませんけど。

投稿日時 - 2010-03-30 14:07:40

補足

ご回答有難う御座います。

また、ご指摘有難う御座います。

何分まだ、初心者のためわからないことや間違っていることがあるためご了承ください。

現在みなさんのお陰である程度のサイトができているため、この辺で自分なりにおさらいをしようと思っております。

いろいろと有難う御座います。

投稿日時 - 2010-03-30 23:59:15

ANo.3

> $member = $_GET[name];
> はhttp://oshiete1.goo.ne.jp/qa5783266.htmlにてご教授いただいたので使用しています。

よぅし。
中途半端な説明でぶん投げてしまった俺が悪いので、
ここは 俺が 責任を持って、説明しましょう。
基本、説明は下手なので、覚悟してください。

ネットにおいて、PHP が HTMLなどからデータを受け取る方法としては、
大雑把に言って $_GET と $_POST と言う スーパーグローバル変数の どちらかを使います。
--------------------------------------------------
$_GET は 前回 俺が説明したように
<a href=Script.php?ID=$id>送信</a>
などのような時に
$id = $_GET[ID]
として受け取ります。
--------------------------------------------------
$_POSTは
<form action=Script.php method=POST>
<input type=text name=ID value='$id'>
<input type=submit value='送信'>
</form>
などのような時に
$id = $_POST[ID]
として受け取ります。
--------------------------------------------------

> たしか、[]内は''を付け忘れても動いたような気がする、
> と記憶していますが、忘れていない方が良いと思うのであえてツッコミ。
あぁ、すみません。そいつは きっと俺のせいです。f(^^;)
↑の書き方を見てもらうと分かるかと思いますが、だいぶ王道から外れた書き方をします。
俺は ハショれるクォート系は ことごとく ハショってしまいます。
W3Cのチェッカー通すと、ことごとく ツッコまれます。
SQL文書く時も、バッククォートは書いた事がありません。
内部的に 速度面とか どうなのか分からないですし、noticeぐらいは出てるかもしれませんが、
warning以上のものは出さずに動けばいいと思ってしまっているところがあります。


閑話休題。前回に引き続き、軽くツッコみどころがあったので。
> $query_member = sprintf("SELECT * FROM `member` WHERE ID='$member'");
> $query_edit = sprintf("UPDATA `member` SET `first_name`='$first_name', `last_name`='$last_name' WHERE id='$m_id'");

何か 他から持ってきたコードを参考にして使っているのは分かりますが、
sprintf は この場合、全く必要ありません。

これ↓でも問題はないはずです。
$query_member = "SELECT * FROM `member` WHERE ID='$member'";
$query_edit = "UPDATA `member` SET `first_name`='$first_name', `last_name`='$last_name' WHERE id='$m_id'";

sprintf の 正しい使い方は こちら。↓
http://php.net/manual/ja/function.sprintf.php

あと、俺なら こう書く。って所が かなり ありますが、
そちらが書いたものを だいぶ 違う形にしてしまうので、自重しておきます。

投稿日時 - 2010-03-30 02:45:56

補足

bm_hiroさんご回答有難う御座います。

自分の勉強不足でお手数お掛けして申し訳ありません。

sprintfにつきましてはPHPの書籍にて勉強したところついておりましたので、使用しています。

書籍も書籍(ネットもですが)で、ものによっては違う記述がしてあったりするので、できる限り使えるとこは使っているという感じです。

教えてgooは本当にいつもご参考にさせていただいております。

投稿日時 - 2010-03-30 12:03:34

ANo.1

以下のような記述すべてですが
<input type="text" name="<?php print $m_first_name; ?>" value="<?php print $m_first_name; ?>

<input type="text" name="m_first_name" value="<?php print $m_first_name; ?>

と、$_POST['m_first_name']で受ける際の名前にしなければなりません。

<input type="text" name="xxxxx" value="">
name='xxxxx'と指定しているので、
$_POST['xxxxx']
で受け取れるという形です。

他に気になるのは、
$_GET[name];

$_GET['name'];
たしか、[]内は''を付け忘れても動いたような気がする、と記憶していますが、忘れていない方が良いと思うのであえてツッコミ。

投稿日時 - 2010-03-30 01:05:18

補足

BellBellさんご回答有難う御座います。
先日はお世話になりました。

上記の内容に変更したのですが、かわらずエラーが表示されてしまいます。

エラー内容は下記です。
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UPDATA `member` SET `first_name`='XXXX',`last_name`='XXXX',`first_kana`='XXXX' at line 1 at line 1
と表示されています。

お分かりになりますでしょうか?

投稿日時 - 2010-03-30 01:37:21

あなたにオススメの質問