リンク貼り付け - PHPプロ!Q&A掲示板

4914

  • 募集中!! 0P

リンク貼り付け

質問日時 / 2018年1月4日 20:50    回答数 / 1件

Questioner:  keimms  このエントリーをはてなブックマークに追加 

キーワード / < a href="   

  1. <?php
  2. require_once("../../lib/util.php");
  3. // データベースユーザ
  4. $user = 'root';
  5. $password = '';
  6. // 利用するデータベース
  7. $dbName = 'optos';
  8. // MySQLサーバ
  9. $host = 'localhost';
  10. // MySQLのDSN文字列
  11. $dsn = "mysql:host={$host};dbname={$dbName};charset=utf8";
  12. ?>
  13.  
  14. <!DOCTYPE html>
  15. <html lang="ja">
  16. <head>
  17. <meta charset="utf-8">
  18. <title>レコードを取り出す(すべて)</title>
  19. <link href="../../css/style.css" rel="stylesheet">
  20. <!-- テーブル用のスタイルシート -->
  21. <link href="../../css/tablestyle.css" rel="stylesheet">
  22. </head>
  23. <body>
  24.  
  25. <div>
  26.   <?php
  27.   //MySQLデータベースに接続する
  28.   try {
  29.     $pdo = new PDO($dsn$user$password);
  30.     // プリペアドステートメントのエミュレーションを無効にする
  31.     $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARESfalse);
  32.     // 例外がスローされる設定にする
  33.     $pdo->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);
  34.     echo "データベース{$dbName}に接続しました。""<br>";
  35.     // SQL文を作る(全レコード)
  36.     $sql = "SELECT biru,kubun,kansen,bangou,idokeido FROM map limit=10";
  37.     // プリペアドステートメントを作る
  38.     $stm = $pdo->prepare($sql);
  39.     // SQL文を実行する
  40.     $stm->execute();
  41.     // 結果の取得(連想配列で返す)
  42.     $result = $stm->fetchAll(PDO::FETCH_ASSOC);
  43.     // テーブルのタイトル行
  44.     echo "<table>";
  45.     echo "<thead><tr>";
  46.     echo "<th>""ビル""</th>";
  47.     echo "<th>""区分""</th>";
  48.     echo "<th>""幹線""</th>";
  49.     echo "<th>""番号""</th>";
  50.     echo "<th>""Gmap""</th>";
  51.     echo "</tr></thead>";
  52.     // 値を取り出して行に表示する
  53.     echo "<tbody>";
  54.     foreach ($result as $row){
  55.       // 1行ずつテーブルに入れる
  56.       echo "<tr>";
  57.       echo "<td>"es($row['biru'])"</td>";
  58.       echo "<td>"es($row['kubun'])"</td>";
  59.       echo "<td>"es($row['kansen'])"</td>";
  60.       echo "<td>"es($row['bangou'])"</td>";
  61.       echo "<td>"es($row['idokeido'])"</td>";
  62.       echo "</tr>";
  63.     }
  64.     echo "</tbody>";
  65.     echo "</table>";
  66.   } catch (Exception $e) {
  67.     echo '<span class="error">エラーがありました。</span><br>';
  68.     echo $e->getMessage();
  69.     exit();
  70.   }
  71.   ?>
  72. </div>
  73. </body>
  74. </html>
上記のコードで5カラム10レコード分はテーブル構造でHTML出力されるのですが、
最後のカラム「idokeido」がリンク貼り付けではなく単なるベタ文字として出力されます。
文法に問題があるのでしょうか?エスケイプ処理等が必要なのか…

MySQLのGmapカラム「idokeido」のデータは以下のとおりです。
<a href="http://maps.google.co.jp/maps?q=43.5940915908418,142.045043314546&z=16">赤平ビル(MH/HH/FH)Hエルム1</a>


ツリー一覧

┗A01shimix>MySQLのGmapカラム「idokeido」のデータは以下のとお

回答一覧

並び替え:

A01
answerershimix [1月5日 14:14] (最終編集:1月17日 09:13)

>MySQLのGmapカラム「idokeido」のデータは以下のとおりです。
><a href="http://maps.google.co.jp/maps?q=43.5940915908418,142.045043314546&z=16">赤平ビル(MH/HH/FH)Hエルム1</a>

このデータは「このまま」htmlとして出力することを想定したデータですよね。


>エスケイプ処理等が必要なのか…

ご自身で

>echo "<td>", es($row['idokeido']), "</td>";

として、esというエスケープ関数を通していますよね。おそらくはこれが余計な処理です(esというユーザ定義関数の実体が提示されていないのであくまでも推測ですが)。


単に

echo "<td>", $row['idokeido'], "</td>";

としてください。

何でもエスケープさえすればいいということではありません。扱うデータの内容によって処理方法を決めてください。



(追記)
「htmlとして出力することを想定したデータ」ということは、格納時にhtmlspecialcharsを通してから格納されていると推測されます(そうでなければバグの元なので)。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
ログファイルの中の空のデータ行を削除したい
 このエントリーをはてなブックマークに追加 
A
ログのデータ個数(列数)が固定で、空のログが"<><><>"だと既知であれば if ($line === "<><><>") { continue; } で読み飛ばしてもいいのでは? ...

>>続きを読む

まずは配列や文字列の扱いから、じっくり勉強して行きましょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)