プロが教えるわが家の防犯対策術!

PHP初心者です。PHPでMY SQLの連想配列をリンク先に受け渡す方法を質問します。

//area.php
<?php
$db = mysqli_connect('localhost' , 'root' , '' , 'area') or die(mysqli_connect_error());
mysqli_set_charset($db , 'utf8');
$recordSet = mysqli_query($db , "SELECT * FROM osaka");
while($date = mysqli_fetch_assoc($recordSet)){
// var_dump($date);
}
?>
<p><a href="text.php?id=1&town&station">大阪市</p>

//text.php リンク先
<p><?php echo ($_GET['id']); ?></p>
<p><?php echo ($_GET['town']); ?></p>
<p><?php echo ($_GET['station']); ?></p>

上記のプログラムでは連想配列の中身がリンク先に受け渡すことができず、リンク先に受け渡すプログラムやリンク先の指定方法がわからず、困っています

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

  • お答え有り難うございます

    上記のプログラムを実行すると
    Fatal error: Call to undefined function  print() in C:\xampp\htdocs・・・on line 8
    というエラーメッセージが出ます

    No.1の回答に寄せられた補足コメントです。 補足日時:2015/12/08 23:41
  • <p><a href="text.php?id=1&town&station">大阪市</a></p>
    <p><a href="text.php?id=2&town&station">堺市</a></p>
    <p><a href="text.php?id=3&town&station">枚方市</a></p>

    </a>を抜けてました(-_-;)

    No.2の回答に寄せられた補足コメントです。 補足日時:2015/12/09 10:51

A 回答 (7件)

>$dsn = 'mysql:host=localhost; dbname=area';



$dsn = 'mysql:host=localhost; dbname=area;charset=utf8';
とすればよいかもしれません。

またhtml上でもmetaでutfの指定があった方がベターです。
(もしわかればテキストで保存時にutf8n形式で保存してください)

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
・・・・
</body>
</html>
    • good
    • 0
この回答へのお礼

$dsn = 'mysql:host=localhost; dbname=area;charset=utf8';で実現したいプログラムが表示されました
念のため、html上でのutf8指定、テキストで保存時にutf8n形式での保存も確認致しました

たびたび有難うございましたm(__)m

お礼日時:2015/12/09 19:04

あーっと、ごめんなさい


転記ミス

>print "ID:".$row["id"]."<br>\n";
の個所を
print "ID:".$data["id"]."<br>\n";
としてください。

Noticeは「ちょっと変だけど大丈夫?」というエラーです
    • good
    • 0
この回答へのお礼

上記の通り、修正するとエラーメッセージは表示しなくなりましたが、
表示したい個所は、ID:1<br>1TOWN:???<br>STATION:???<br>となります

お礼日時:2015/12/09 18:17

>area.php側からはidのみを渡す方が、シンプルなプログラムになりますね



idのみ渡す場合はtext.phpで再検索をします

//text.php
<?php
$data=array("id"=>"","town"=>"","station"=>"");//初期化
try{
$dsn = 'mysql:host=localhost; dbname=area';
$user = 'root';
$password = 'xxxx';
$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 id,town,station FROM osaka WHERE id=?";
$stmt = $pdo->prepare($sql);
$stmt->execute($input);
$data= $stmt->fetch(PDO::FETCH_ASSOC);
}catch(PDOException $e){
die($e->getMessage());
}
?>
・・・
表示したい個所
<?PHP
print "ID:".$row["id"]."<br>\n";
if($data["town"]!=="") print "TOWN:".htmlspecialchars($data["town"])."<br>\n";
if($data["station"]!=="") print "STATION:".htmlspecialchars($data["town"])."<br>\n";
//htmlに出力する際にはかならずhtmlspecialchars()をかますこと
?>
    • good
    • 0
この回答へのお礼

たびたび有難うございます

上記のプログラムをそのまま実行する(パスワードは入れる)と、エラーメッセージNotice: Undefined variable: row in・・・未定義の変数でエラーになっているのでしょうか?

お礼日時:2015/12/09 17:27

なるほど・・・


本来であればarea.php側からはidのみ渡すのが妥当だと思います
while($data = mysqli_fetch_assoc($recordSet)){
print '<p><a href="text.php?id='.$data["id"].'">'.$data["town"].'</p>';
}
としておいて、text.php側で$_GET["id"]を元に再検索して表示

ただどうしてもarea側から値を渡したいのであれば
while($data = mysqli_fetch_assoc($recordSet)){
print '<p><a href="text.php';
print '?id='.$data["id"];
print '&town='.urlencode($data["town"]);
print '&station='.urlencode($data["station"]);
print '">'.htmlspecialchars($data["town"]).'</a>';
print '</p>';
}
的な処理でもよいかも・・・
    • good
    • 0
この回答へのお礼

有難うございます
area.php側からはidのみを渡す方が、シンプルなプログラムになりますね

area.php側を
while~での繰り返し表示と下記のリンクを付け足し
<table>
<tr>
<td><a href="text.php?id=1">大阪市</a></td>
<td><a href="text.php?id=2">堺市</a></td>
<td><a href="text.php?id=3">枚方市</a></td>
</tr>
<table>

text.php側で$_GET["id"]を元に再検索して表示させるには
text.phpにどのようなプログラムを書くことになりますか?

市名、駅名を表示させたい箇所に下記プログラムを書くと思うのですが
<?php echo ($_GET['town']); ?>
<?php echo ($_GET['station']); ?>

お礼日時:2015/12/09 16:06

//area.php


<p><a href="text.php?id=1&town&station">大阪市</p>
<?php
$db = mysqli_connect('localhost' , 'root' , '' , 'area') or die(mysqli_connect_error());
mysqli_set_charset($db , 'utf8');
$recordSet = mysqli_query($db , "SELECT * FROM osaka");
while($date = mysqli_fetch_assoc($recordSet)){
echo '<p>';
echo 'id = '.$date['id'];
echo ',town = '.$date['town'];
echo ',station = '.$date['station'];
echo '</p>';
}
?>
    • good
    • 0

>SELECT * FROM osaka



まず、きちんと検証したいなら「*」はやめた方がいいです。
idとtownとstationをとれるなら

SELECT id,town,station FROM osaka
そうでないならそうでないなりのカラムの羅列をして問題をきりわけてください

またwhile内でリンクを表示してもいいですが
例示の場合すべて「大阪市」でリンクが作られますが本当にそれでよいのでしょうか?
逆にosakaテーブルにデータが一つしかない前提であればwhileで回す必要はありません。
この回答への補足あり
    • good
    • 0
この回答へのお礼

>まず、きちんと検証したいなら「*」はやめた方がいいです。
idとtownとstationをとれるなら
SELECT id,town,station FROM osaka

了解です
*⇒id,town,stationで書きます

>またwhile内でリンクを表示してもいいですが
例示の場合すべて「大阪市」でリンクが作られますが本当にそれでよいのでしょうか?

<p><a href="text.php?id=1&town&station">大阪市</p>
<p><a href="text.php?id=2&town&station">堺市</p>
<p><a href="text.php?id=3&town&station">枚方市</p>
データベースは、id=1、town=大阪市、station=梅田駅、id=2、town=堺市、station=堺東駅、id=3、town=枚方市、station=樟葉駅

上記のようにリンクは市ごとに作り、市名、駅名を読み込めるプログラムはどうなりますか?

お礼日時:2015/12/09 10:46

//area.php


<p><a href="text.php?id=1&town&station">大阪市</p>
<?php
$db = mysqli_connect('localhost' , 'root' , '' , 'area') or die(mysqli_connect_error());
mysqli_set_charset($db , 'utf8');
$recordSet = mysqli_query($db , "SELECT * FROM osaka");
while($date = mysqli_fetch_assoc($recordSet)){
 print('<p>');
 print('id = '.$date['id']);
 print(',town = '.$date['town']);
 print(',station = '.$date['station']);
 print('</p>');
}
?>
この回答への補足あり
    • good
    • 0

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