質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

23734閲覧

Notice: Undefined variable: 定義に失敗?

vitabrevisarsl1

総合スコア57

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2017/12/10 11:16

編集2017/12/10 11:17

###前提・実現したいこと
MySQL 入門以前」という書籍で取り上げられている住所録をその通りにニュ力したつもりですがエラーとなるため、解消したい。

###該当のソースコード
j_kensaku1.php

php

1<body> 2 3 <?php 4 5 extract($_POST); 6 echo " 7 <p>検索する氏名の一部を入力する。</p> 8 <form action=\"j_kensaku1.php\" method=\"post\"> 9 <p>検索氏名:<input type=\"text\" name=\"nam\" value=\"$nam\" size=\"40\"></p> 10 <p><input type=\"submit\" value=\"登録\"> 11 <input type=\"reset\" value=\"リセット\"></p> 12 </form> 13 "; 14 15 if($nam<>''){ 16 mysql_connect('localhost', 'root', '8999'); 17 mysql_select_db('lesson'); 18 19 $sql = "select * from jushoroku where simei like '%$nam%'"; 20 // $sql = "select * from jushoroku WHERE id 1"; 21 // $sql = "select * from jushoroku where match(`simei`) against('%$nam%' in boolean mode)"; 22 $result = mysql_query($sql) or die('query error' . mysql_error()); 23 $rows = mysql_num_rows($result); 24 25 echo "$result"; 26 27 if($rows == 0){ 28 echo "<p>該当データは存在しません。</p>"; 29 } else { 30 while($row = mysql_fetch_array($result)){ 31 echo "<p>"; 32 echo $row["renban"]; 33 echo " "; 34 echo $row["tourokubi"]; 35 echo "<br />"; 36 echo $row["simei"]; 37 echo " "; 38 echo $row["yubin1"]; 39 echo "-"; 40 echo $row["yubin2"]; 41 echo " "; 42 echo $row["jusho1"]; 43 echo $row["jusho2"]; 44 echo "br />TEL"; 45 echo $row["denwa"]; 46 echo " FAX "; 47 echo $row["fax"]; 48 echo " CELL "; 49 echo $row["keitai"]; 50 echo " MAIL "; 51 echo $row["meruado"]; 52 echo "<br />"; 53 echo $row["biko"]; 54 echo "</p>"; 55 echo "<a href=\"j_shusei1.php?id="; 56 echo $row["renban"]; 57 echo "\"> [このレコードを修正する] </a>  "; 58 echo "<a href=\"j_sakujo1.php?id="; 59 echo $row["renban"]; 60 echo "\"> [このレコードを削除する] </a><hr>"; 61 } 62 } 63 } 64 ?> 65 66</body>

###発生している問題・エラーメッセージ
イメージ説明

###試したこと
$namが認識されていない理由が判然としません。
登録したデータを修正するphpが別にあるのですが、そこでも同じエラー
j_shusei1.php

php

1Notice: Undefined variable: nam in C:\xampp\htdocs\first_mysql\j_shusei1.php on line 19 2 3<body> 4<?php 5extract($_POST); 6extract($_GET); 7mysql_connect('localhost','root','8999'); 8mysql_select_db('lesson'); 9 10//MySQLレコード修正 11if($nam<>""){ 12 $sql = "update jushoroku set 13 tourokubi = '$tou', 14 simei = '$nam', 15 yubin1 = '$yu1', 16 yubin2 = '$yu2', 17 jusho1 = '$ju1', 18 jusho2 = '$ju2', 19 denwa = '$tel', 20 fax = '$fax', 21 keitai = '$kei', 22 meruado = '$mai', 23 biko = '$bik' 24 where renban = $ren"; 25 26 mysql_query($sql); 27 echo "レコードの修正が完了しました"; 28 exit; 29} 30 31//修正のためのフォーム 32$sql = "select * from jushoroku where renban = $id"; 33$result = mysql_query($sql); 34$rows = mysql_num_rows($result); 35 if($rows == 0){ 36 echo "<p>該当データがありません。</p>"; 37 } 38 else{ 39 while($row = mysql_fetch_array($result)){ 40 echo "<p>データを修正してください。</p>"; 41 echo "<form action = \"j_shusei1.php\" method = \"post\">"; 42 echo "<p>連番:"; 43 echo $row["renban"]; 44 echo "</p>"; 45 46 echo "<p>登録日:"; 47 echo $row["tourokubi"]; 48 echo "</p>"; 49 50 echo "<p>氏名:<input type = \"text\" name = \"nam\" value =\""; 51 echo $row["simei"]; 52 echo "\" size = \"40\"></p>"; 53 54 echo "<p>郵便番号:<input type = \"text\" name = \"yu1\" value =\""; 55 echo $row["yubin1"]; 56 echo "\" size = \"5\">-<input type = \"text\" name = \"yu2\" value =\""; 57 echo $row["yubin2"]; 58 echo "\" size = \"8\"></p>"; 59 60 echo "<p>住所1:<input type = \"text\" name = \"ju1\" value =\""; 61 echo $row["jusho1"]; 62 echo "\" size = \"50\"></p>"; 63 64 echo "<p>住所2:<input type = \"text\" name = \"ju2\" value =\""; 65 echo $row["jusho2"]; 66 echo "\" size = \"50\"></p>"; 67 68 echo "<p>TEL:<input type = \"text\" name = \"tel\" value =\""; 69 echo $row["denwa"]; 70 echo "\" size = \"20\">"; 71 72 echo "FAX:<input type = \"text\" name = \"fax\" value =\""; 73 echo $row["fax"]; 74 echo "\" size = \"20\"></p>"; 75 76 echo "<p>ケータイ:<input type = \"text\" name = \"kei\" value =\""; 77 echo $row["keitai"]; 78 echo "\" size = \"20\">"; 79 80 echo "MAIL:<input type = \"text\" name = \"mai\" value =\""; 81 echo $row["meruado"]; 82 echo "\" size = \"25\"></p>"; 83 84 echo "<p>備考:<textarea name = \"bik\" rows =\"10\" cols = \"50\">"; 85 echo $row["biko"]; 86 echo "</textarea></p>"; 87 88 echo "<input type = \"hidden\" name = \"tou\" value =\""; 89 echo $row["tourokubi"]; 90 echo "\">"; 91 92 echo "<input type = \"hidden\" name = \"ren\" value =\""; 93 echo $row["renban"]; 94 echo "\">"; 95 96 echo "<p><input type=\"submit\" value=\"登録\">"; 97 echo "<input type=\"reset\" value=\"リセット\"></p>"; 98 echo "</form>"; 99 } 100} 101?> 102</body>

が表れます。

タグの中で定義済みと思うのですが、ちがうでしょうか?

ヒントをいただけますと幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Undefined variable は変数が定義されていない時に出るメッセージです。

$namが認識されていない理由が判然としません。

このコメントの意味がよくわからないのですが、コードの中で、$namを定義する箇所がないので、定義するか利用箇所を迂回するかが必要となります。

それよりも、mysql_*を使用している教本で学ぶことが気になります。
現行の php では非推奨の関数となるので、もう少し新しい教本を使用して学ぶことをオススメします。
DB を扱うのに不適切なコードが入っているので、早めに切り替えることが学習の効率を高めます。

追記
asahina1979 さんの指摘の通り、$namを定義する箇所として、extract($_POST); があります。
lucker さんの回答も同じことが書いてあります。

回答は間違いですね。失礼しました^^;

であるので、定義してある場合と、ない場合にルートを分ける必要があります。
issetを使用して、条件分岐してあげてください。

ちなみに、$_POSTの取り扱いに関しては、以下が非常に参考になります。オススメです!
$_GET, $_POSTなどを受け取る際の処理

投稿2017/12/10 12:10

編集2017/12/11 00:21
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/12/10 23:36

多分extractで展開された結果のことだと思うぞ nam
退会済みユーザー

退会済みユーザー

2017/12/11 00:10

おぉw確かに^^; `$nam`を定義する箇所が無いっていうのは誤りですね。 `$nam`が定義されていない場合、迂回するルートを作ってあげる。っていうのが正解ですね。
guest

0

ベストアンサー

とりあえず、コードがゴミクズ過ぎるのでほかの本で勉強した方がよさそうですが、内容としてはこうなります。

まず、

PHP

1extract($_POST);

これですが、これは連想配列$_POSTを変数に展開する命令です。
例えば

PHP

1$_POST = ["name" => "lucker", "gender" => "male", "points" => 842]

のような場合、extract()することで

PHP

1$name = "lucker"; 2$gender = "male"; 3$points = 842;

こんな感じに展開します。ただまぁ、普通はこんなことしませんけどね。

それで、$_POSTは、WEB入力フォームから送信されたデータの複製が連想配列で入っています。

PHP

1echo " 2<p>検索する氏名の一部を入力する。</p> 3<form action=\"j_kensaku1.php\" method=\"post\"> 4<p>検索氏名:<input type=\"text\" name=\"nam\" value=\"$nam\" size=\"40\"></p> 5<p><input type=\"submit\" value=\"登録\"> 6<input type=\"reset\" value=\"リセット\"></p> 7</form> 8";

これが、期待する$namを送信するための部分です。分かりやすくHTMLだけにすると、

HTML

1<p>検索する氏名の一部を入力する。</p> 2<form action="j_kensaku1.php" method="post"> 3<p>検索氏名:<input type="text" name="nam" value="" size="40"></p> 4<p><input type="submit" value="登録"> 5<input type="reset" value="リセット"></p> 6</form>

こんな感じですね。textタイプのinputフィールドの内容がnamというnameで設定されていて、formはPOSTでデータをj_kensaku1.phpに送信する、というフォームです。

で、こうやって送られてきたデータの複製が先ほど説明した$_POSTに格納され、extract()関数で変数展開され、晴れて、

PHP

1$num="あなたの名前";

と、なる事が期待されています。

ところで、あなたがNoticeを見たのは何故なのか、ですが、入力フォームからnumの送信を行う前にj_kensaku1.phpを開いた結果でしょう?

送信が行われていないので$_POSTには["num" => "あなたの名前"]のようなデータが一切なく、当然、変数展開もされないので$namは作られず、それを利用しようとした

PHP

1<p>検索氏名:<input type=\"text\" name=\"nam\" value=\"$nam\" size=\"40\"></p>

で、「Undefined variable」=定義されていない変数、という注意が報告されたわけです。

そんなわけですから、これを避けるためには$namが定義されているかを確認して処理を分ければ良い事になります。その本のコードを活かすのであれば、例えば以下ですね。

j_kensaku1.php

PHP

1<body> 2<?php 3 4 extract($_POST); 5 6 echo " 7 <p>検索する氏名の一部を入力する。</p> 8 <form action=\"j_kensaku1.php\" method=\"post\"> 9 <p>検索氏名:<input type=\"text\" name=\"nam\" value=\"" . (isset($nam)? $nam : "") . "\" size=\"40\"></p> 10 <p><input type=\"submit\" value=\"登録\"> 11 <input type=\"reset\" value=\"リセット\"></p> 12 </form> 13 "; 14 15 if(!isset($num)) 16 { 17 echo "</body>"; 18 19 die(); // ここでPHPの処理終了 20 } 21 22 // ※以下同じ

机上コードなので間違いあるかもしれませんが、大体、これでいいはずです。

最後にもう一度いいますが、その本のコードは下等すぎて害悪にしかならないです。よくもまぁ、そんなクソコードで本を出せたなという感じですので、あんまりその本で勉強することはお勧めできないですね。

投稿2017/12/10 12:51

編集2017/12/10 22:34
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問