dポイントプレゼントキャンペーン実施中!

大阪市24区と24区の602町名をそれぞれ区名、町名のみ変更し、リンクでつなげるPHPプログラムを制作中ですが、なかなか前に進まず、分かる方いましたら宜しくお願い致します
データベースはMY SQLを使用
テーブル:city フィールド:id(区のID)、region_id(大阪市のID)、city(区名)、station(駅名)、overviem(概要)
テーブル:town フィールド:id、town(町名)、city_id(区のID)

//top.php(大阪市24区を表示し、各24区へリンク)
<?php
$recordSet = mysqli_query($db , "SELECT id,region_id,city FROM city where region_id=24");
?>
★<?php
while($data = mysqli_fetch_assoc($recordSet)){
print '<li><a href="ward.php?id='.$data["id"].'">'.$data["city"].'</a></li>';
}
?>

//ward.php(区ごとの情報{町名・駅名・概要})
<?php
$recordSet = mysqli_query($db , "SELECT town FROM town");
$data=array("id"=>"","region_id"=>"","city"=>"","station"=>"","overview"=>"","town"=>"","city_id"=>"");//初期化
try{
$pdo = new PDO($dsn, $user,$password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$id=isset($_GET["id"])?$_GET["id"]:"";
$input=array();
$input[]=$id;
$sql="SELECT city.id,city_id,city,station,overview,town.id,town,city_id FROM city,town WHERE city.id=town.city_id and city.id=?";
$stmt = $pdo->prepare($sql);
$stmt->execute($input);
$data= $stmt->fetch(PDO::FETCH_ASSOC);
}catch(PDOException $e){
die($e->getMessage());
}
?>
<title><?php if($data["city"]!=="") print htmlspecialchars($data["city"],ENT_QUOTES);?>の主な概要</title>

<h1><?php if($data["city"]!=="") print htmlspecialchars($data["city"],ENT_QUOTES);?>の情報</h1>

<h2><?php if($data["city"]!=="") print htmlspecialchars($data["city"],ENT_QUOTES);?>の町名</h2>
★<p><?php
while($data = mysqli_fetch_assoc($recordSet)){
print '<li><a href="ward.php?id='.$data["id"].'">'.$data["town"].'</a></li>';
}
?>
</p>

<h2><?php if($data["city"]!=="") print htmlspecialchars($data["city"],ENT_QUOTES);?>の駅名</h2>
<p><?php if($data["station"]!=="") print htmlspecialchars($data["station"],ENT_QUOTES);?></p>

<h2><?php if($data["city"]!=="") print htmlspecialchars($data["city"],ENT_QUOTES);?>の概要</h2>
<p><?php if($data["overview"]!=="") print htmlspecialchars($data["overview"],ENT_QUOTES);?></p>

★印をしたループ2箇所が分からない
・一つ目の★、現状はtop.phpの24区のリンクをクリックすると、全件ループされ、24区それぞれの町名が表示されるように指定文を入れる(もしくは受け取り側のward.php)
・2つ目の★も一つ目の★同様で、こちらはward.phpからward.phpへの受け渡しでプログラムを実現させたいが、受け渡しプログラムが分からない

質問者からの補足コメント

  • 制作したいプログラムは
    http://www.osaka-glass.com/
    ↑このサイトのトップページの都島区をクリックして表示されるページ⇒都島区のページの網島をクリックして表示されるページです

      補足日時:2016/01/11 10:12
  • うれしい

    データベースMY SQL
    テーブル:city
    フィールド:id(区のID)、1~24
          region_id(大阪市のID)、24、大阪市以外の例えば神戸市などを追加した時のために作成するid
          city(区名)、東淀川区、淀川区・・・
          station(駅名)、新大阪駅・・・
    overviem(概要)、大阪市内の北部・・・

    テーブル:town
    フィールド:id(町名のID)、1~602
    town(町名)、相川、淡路・・・
    city_id(区のID)、1~24

      補足日時:2016/01/12 16:33
  • >ward.phpはすでにcityのidを受け取っているので参照するのはtownだけでよいのでは?
    初心者でわからないのですが、cityのidを受け取った後ならSELECT文でcityのIDとtownのcity_idを結合する必要がないということですよね

    >そもそもtownが上位cityからひっぱった駅名は、必ずしもtownに最適な駅だとは思えませんが・・・
    確かに仰る通りですが、今回のプログラムはサンプルとお考え下さい

    No.1の回答に寄せられた補足コメントです。 補足日時:2016/01/12 16:56
  • 初歩的な質問で申し訳ないですが
    //top.php
    $pdo = new PDO($dsn, $user,$password);
    この行で下記のエラーメッセージが出ます
    Undefined variable: dsn in・・・
    Undefined variable: user in・・・
    Undefined variable: password in・・・
    翻訳すると、未定義の変数:DSN、ユーザー、パスワードということなので、DSN、ユーザー、パスワードを指定していないエラーでしょうか?
    PDOを調べてみましたが、PDOは「PHP Data Objects」の略で、どのデータベースを使っているかを隠蔽してくれるものです。PDOを使うことで、どのデータベースを利用する場合でも同じ関数を使うことができます
    PDOを使ってMySQLへ接続する設定をしていないためのエラーでしょうか?

    No.3の回答に寄せられた補足コメントです。 補足日時:2016/01/13 12:02
  • 教えて頂いたward.phpを編集して
    ○○区の情報
    ○○区の駅名
    ○○駅/○○駅/○○駅/○○駅/○○駅/○○駅/○○駅/○○駅/○○駅/○○駅/○○駅
    ○○区の概要
    ○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○
    ○○区の町名
    ○○ ○○ ○○ ○○ ○○ ○○ ○○ ○○ ○○ ○○ ○○ ○○ ○○
    という並びにしたのですが、○○区の町名を○○区の駅名の上に移動させるには
    プログラムの位置を移動させるだけではなく、cityテーブル、townテーブル、cityテーブルと読み込ませるプログラムにすると思うのですが、
    print "<h1>";
    if($data["city"]!=="") print htmlspecialchars($data["city"],ENT_QUOTES);
    print "の情報</h1>";

    No.4の回答に寄せられた補足コメントです。 補足日時:2016/01/13 18:27
  • つづき
    print "<h2>";
    if($data["city"]!=="") print ($data["city"]);
    print "の駅名</h2>";
    print "<p>";
    if($data["station"]!=="") print ($data["station"]);
    print "</p>";
    print "<h2>";
    if($data["city"]!=="") print ($data["city"]);
    print "の概要</h2>";
    print "<p>";
    if($data["overview"]!=="") print ($data["overview"]);
    print "</p>";
    print "<h2>";
    if($data["city"]!=="") print ($data["city"]);
    print "の町名</h2>";

      補足日時:2016/01/13 18:31
  • つづき
    $sql="SELECT id,town FROM town WHERE city_id=?";
    $stmt = $pdo->prepare($sql);
    $stmt->execute($input);
    while($data= $stmt->fetch(PDO::FETCH_ASSOC)){
    print '<li><a href="ward.php?id='.$data["id"].'">'.$data["town"].'</a></li>';
    }
    }catch(PDOException $e){
    die($e->getMessage());
    }
    上記を並び替え、どういうプログラムを追加すればいいでしょうか?

      補足日時:2016/01/13 18:33
  • syntax errorの原因は
    $sql="SELECT city,station,overview FROM city where id=?";の上にある
    try{
    $pdo = new PDO($dsn, $user,$password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $id=isset($_GET["id"])?$_GET["id"]:"";
    $input=array($id);
    try{の閉じ忘れだと思うのですが、}の入れる場所はどこになるのでしょうか?

    No.6の回答に寄せられた補足コメントです。 補足日時:2016/01/13 20:13
  • 今回のテストプログラムは明日までに完成させる必要があったため、焦ってしまい、PHPのループ手法を使いこなすことを優先に考えてしまったため、歪な質問になり、テーブルごとの情報の取り出し方やエラーの解決方法、教えて頂いたプログラムの理解を深めていきます
    有難うございました

      補足日時:2016/01/15 17:21
  • ward.phpからテーブルtownのid(1~602)を受け渡し、新たにtown.phpを作成し、
    town.phpでテーブルcityの情報を取得し、フィールドcityをプリントしたいのですが、townのidを受け渡したページ(town.php)にテーブルcityのフィールドcityを連動させるSELECT文がわかりません

    イメージはとしては
    townテーブルのidとcity_idをcityテーブルのidとcityにどう連動されるなんですが・・・

      補足日時:2016/01/16 11:06

A 回答 (7件)

ちょっと質問と回答がずれるかもしれませんが


まずtop

//top.php(大阪市24区を表示し、各24区へリンク)
<?php
try{
$pdo = new PDO($dsn, $user,$password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$input=array(24);
$sql="SELECT id,city FROM city where region_id=?";
$stmt = $pdo->prepare($sql);
$stmt->execute($input);
while($data = $stmt->fetch(PDO::FETCH_ASSOC)){
print '<li><a href="ward.php?id='.$data["id"].'">'.$data["city"].'</a></li>';
}
}catch(PDOException $e){
die($e->getMessage());
}
?>
大阪のid=24スタティックに埋め込んでいるのであまりよくないですが
とりあえずテストということで・・・
region_id=24におけるcityの一覧が取れるのがわかると思います

ward側ではcityのidを引き継いで
from cityとしてcityの情報を得るのと
from townでcityのidから引ける町の一覧を表示すればよいでしょう

<?php
try{
$pdo = new PDO($dsn, $user,$password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$id=isset($_GET["id"])?$_GET["id"]:"";
$input=array($id);
$sql="SELECT city,station,overview FROM city where city_id=?";//一度cityの情報を取る
$stmt = $pdo->prepare($sql);
$stmt->execute($input);
$data= $stmt->fetch(PDO::FETCH_ASSOC);

print "<title>";
if($data["city"]!=="") print htmlspecialchars($data["city"]>
print "の主な概要</title>\n";
print "<h1>";
if($data["city"]!=="") print htmlspecialchars($data["city"]);
print "の情報</h1>\n";
if($data["station"]!=="") print "駅は".htmlspecialchars($data["station"])."\n";
if($data["overview"]!=="") print "概要は".htmlspecialchars($data["overview"])."\n";
print "<h2>";
if($data["city"]!=="") print htmlspecialchars($data["city"]);
print "の町名</h2>\n";

$sql="SELECT id,town FROM town WHERE city_id=?";//一度townの一覧はtownテーブルのcity_idをキーにする
$stmt = $pdo->prepare($sql);
$stmt->execute($input);
while($data= $stmt->fetch(PDO::FETCH_ASSOC)){
print '<li><a href="ward.php?id='.$data["id"].'">'.$data["town"].'</a></li>';
}
}catch(PDOException $e){
die($e->getMessage());
}
?>

質問者さんと同じ環境が作れるわけではないので、記載ミスがあるかもしれません
うまく拡大解釈しながらテストしてみてください
この回答への補足あり
    • good
    • 0
この回答へのお礼

たびたびすいません。PHPの基礎が習得できず、挫折しそうになっていただけに本当に有難いです
テストしてみます

お礼日時:2016/01/12 22:57

>Parse error: syntax error



えーと、どこでしょうね。エラーの行数が表示されていればその前後だと推定されます。
もう少し簡単なモデルにしてチェックするとわかりやすいと思いますよ。
    • good
    • 0
この回答へのお礼

エラーの行数は、最終行?>の行数です
そうですね、簡単なモデルにしてチェックすると
補足に書いたようにtryの}をどこに入れるかだと思うのです

ward.phpの区の町名(townのtown)のリンク先の表示を区のページと同じように
○○区の情報
○○区の駅名
○○駅/○○駅/○○駅/○○駅/○○駅/○○駅/○○駅/○○駅/○○駅/○○駅/○○駅
○○区の概要
○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○
○○区の町名
○○ ○○ ○○ ○○ ○○ ○○ ○○ ○○ ○○ ○○ ○○ ○○ ○○
としたいのですが
現状は
の情報
の駅名
の概要
の町名
とプログラムを読み込んでいません

http://www.osaka-glass.com/
↑このサイトのようにトップページ⇒出張エリアの豊中市をクリック⇒豊中市の出張エリアの赤阪をクリック
豊中市と赤阪は一部分(地名のみ)変更されて、他は同じ内容のページであり、この構造を実現させたいのです
プログラム初心者のため、あくまでもサンプル制作です

お礼日時:2016/01/13 20:38

ちな・・



>○○区の駅名
>○○駅/○○駅/○○駅/○○駅/○○駅/○○駅/○○駅/○○駅/○○駅/○○駅/○○駅
駅はcityテーブル上でどうやって保存されているんでしたっけ?

普通にやるとこんなっ感じ?
今回はhtml上のリストをどうしたいかわからないのでとりあえず<br>で雑に処理してあります
見出しにするのかul~li、dl~dt~ddにするのかうまくやってください

$sql="SELECT city,station,overview FROM city where id=?";
$stmt = $pdo->prepare($sql);
$stmt->execute($input);
$data= $stmt->fetch(PDO::FETCH_ASSOC);
print <<<eof
{$data["city"]}の情報<br>
{$data["city"]}の駅名<br>
{$data["station"]}<br>
{$data["city"]}の概要<br>
{$data["overview"]}<br>
eof;
//ここまでがcityテーブルから得られるcityの状況、上記の通り駅のデータの持ち方次第

$sql="SELECT id,town FROM town WHERE city_id=?";
$stmt = $pdo->prepare($sql);
$stmt->execute($input);
print "{$data["city"]}の町名<br>\n";
print "<ul>\n";
while($data= $stmt->fetch(PDO::FETCH_ASSOC)){
$id=htmlspecialchars($data["id"]);//たぶんidは数字なのでエスケープは不要ですが保険
$town=htmlspecialchars($data["town"]);
print "<li><a href=\"ward.php?id={$id}\">{$town}</a></li>\n";
}
print "</ul>\n";
この回答への補足あり
    • good
    • 0
この回答へのお礼

たびたび有難うございます
Parse error: syntax error
何かの閉じ忘れですかね?
初心者の私にはわかりませんでした

お礼日時:2016/01/13 19:39

>リンク先であるward.phpに下記のエラーメッセージが出ます


>Column not found: 1054 Unknown column 'city_id' in 'where clause'

ああ・・・そうですね
city_idはtownテーブルのcityへの紐づけidで、cityテーブルのカラム名はidでしたね
$sql="SELECT city,station,overview FROM city where id=?";
でよいんじゃないでしょうか?
    • good
    • 0
この回答へのお礼

ありがとうございます
これはcityテーブルとtownテーブルの構造を理解していれば、わかる内容でした

お礼日時:2016/01/13 18:47

>$pdo = new PDO($dsn, $user,$password);


>この行で下記のエラーメッセージが出ます

えーと、暗黙の了解で省略していたつもりですが、省きすぎましたか?

$user = 'ユーザー';
$password = 'パスワード';
$dsn = 'mysql:host=localhost; dbname=データベース名';
$pdo = new PDO($dsn, $user,$password);

となります。
mysqli_系の関数使うときもユーザー、パスワード、DB名は指定すると思うので
それと同じものを指定してあげてください
この回答への補足あり
    • good
    • 0
この回答へのお礼

PDOをよく理解していなくて、PDOの設定をしないといけないと思い込んでしまいました

ユーザー、パスワード、DB名を指定するとtop.phpは正常に表示されましたが、
リンク先であるward.phpに下記のエラーメッセージが出ます
Column not found: 1054 Unknown column 'city_id' in 'where clause'

SELECT city,station,overview FROM city WHERE city_id=?を
SELECT city,station,overview FROM city,town WHERE city.id=town.city_id and city_id=?にするエラーメッセージは出なくなります
私は初心者でPHPを理解していませんが、テーブルcityとtownを結合する必要があるのでしょうか?

お礼日時:2016/01/13 14:29

それとmysqli_系の関数とPDOを併用していますが、どうせならPDOにまとめてしまった方がよいでしょう

    • good
    • 0
この回答へのお礼

以前、yambejpさんに教えて頂いたソースをそのまま使用してました。今回はmysqli_系でまとめたいのですが、プログラム初心者のため、わかりません

お礼日時:2016/01/12 16:12

あまり細かく見ていませんが・・・



>$sql="SELECT city.id,city_id,city,station,overview,town.id,town,city_id FROM city,town WHERE city.id=town.city_id and city.id=?";
ward.phpはすでにcityのidを受け取っているので参照するのはtownだけでよいのでは?

$sql="SELECT id,town FROM town WHERE city_id=?";
もちろん、townの上位のcityの情報を表示したいなら別途cityテーブルを参照すればいいので
あえて結合する意味がないと思います
(上記の他に以下で参照するということ)
$sql="SELECT id,city,station,overview FROM city WHERE id=?";

そもそもtownが上位cityからひっぱった駅名は、必ずしもtownに最適な駅だとは思えませんが・・・
この回答への補足あり
    • good
    • 0
この回答へのお礼

私の質問内容の書き方が悪くてすいません。
わかりやすく書き直します

お礼日時:2016/01/12 16:17

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