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

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

ただいまの
回答率

90.53%

  • PHP

    20255questions

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

PHPでMYSQLの検索結果にリンクをつけたい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 990
退会済みユーザー

退会済みユーザー

PHPを始めたばかりの初心者です。
PHPを用いてMYSQLにあるデータベースから検索しWebサイトに表示するプログラムを作っています。
現在下記のプログラムで検索結果を表示するところまで完成しております。
ここから検索結果ででた文字一つ一つにリンクをつけ、それぞれのリンク先に見に行けるコードの作り方がわかりません。会社ごと、履物ごとにリンクをつけたいです。表現が乏しくて申し訳ございませんがご教授お願い致します。

追記2
例えば、検索で配列させたA紳士靴の文字にマウスを乗っけると紳士靴Aのサイトに飛ぶリンクを作成したいです。
理想は会社ごと、履物ごとにリンクをつけたいです。
イメージのサイトはこちらです。
リンク内容

追記

発生している問題

motuo様とkunai様のアドバイスを実践して、検索結果にコードを挿入しました。
DBのカラムに新たにURL_shoesを造り、紳士靴Aが入っている行にkustuA.phpを入れました。
<前略>

<?php foreach ($stmt as $row): ?>
      <tr>
        <td><?=h($row['name'])?></td>
        <td><?=h($row['company'])?></td>
        <td><a hfef="<?h($row['URL_shoes'])?>"<?=h($row['shoes'])?></a></td>
        <td><?=h($row['yuka'])?></td>
        <td><?=h($row['surface'])?></td>
        <td><?=h($row['atai'])?></td>
      </tr>
<?php endforeach; ?>

その結果を見ると履物の欄が空欄になってしまいました。

該当のソースコード

input.php
<?php
header('Content-Type: text/html; charset=utf-8');   
?>

<!DOCTYPE html>
<html>
<head>
<title>サンプル</title>
</head>
<body>
<form method="post" action="/aaa/search.php">
検索条件を指定してください<br>

<table width="500" border="1" cellspacing="1" cellpadding="0">

<tr> 
<td bgcolor="#DCF0F0">会社名</td>
<td>
<input type="checkbox" name="company[]" value="A会社">A会社<br>
<input type="checkbox" name="company[]" value="B会社">B会社<br>
<input type="checkbox" name="company[]" value="C会社">C会社<br>
<input type="checkbox" name="company[]" value="D会社">D会社<br>
<input type="checkbox" name="company[]" value="E会社">E会社
</td>
</tr>
<tr> 
<td bgcolor="#DCF0F0">履物</td>
<td>
<input type="checkbox" name="shoes[]" value="紳士靴A">紳士靴A<br>
<input type="checkbox" name="shoes[]" value="紳士靴B">紳士靴B<br>
<input type="checkbox" name="shoes[]" value="紳士靴C">紳士靴C
</td>
</tr>
<tr> 
<td bgcolor="#DCF0F0">床材料</td>
<td>
<input type="checkbox" name="yuka[]" value="塗り床">塗り床<br>
<input type="checkbox" name="yuka[]" value="張り床">合張り床<br>
<input type="checkbox" name="yuka[]" value="セラミックタイル">セラミックタイル<br>
</td>
</tr>
<tr> 
<td bgcolor="#DCF0F0">介在物</td>
<td>
<input type="checkbox" name="surface[]" value="清掃">清掃<br>
<input type="checkbox" name="surface[]" value="水"><br>
<input type="checkbox" name="surface[]" value="水ダストA">水ダストA<br>
<input type="checkbox" name="surface[]" value="水ダストB">水ダストB
</td>
</tr>

</table>
<input type="submit" value="検索">
<input type="reset" value="条件クリア">
</form>
</body>
</html>

該当のソースコード

search.php
<?php

define('FILTER_STRUCT_FORCE_ARRAY', 1);
define('FILTER_STRUCT_TRIM', 2);
define('FILTER_STRUCT_FULL_TRIM', 4);
function filter_struct_utf8($type, array $default) {
    static $is_recursive_static = false;
    $is_recursive = $is_recursive_static;
    if (!$is_recursive) {
        $types = array(
            INPUT_GET => $_GET,
            INPUT_POST => $_POST,
            INPUT_COOKIE => $_COOKIE,
            INPUT_REQUEST => $_REQUEST,
        );
        $type = (int)$type;
        if (!isset($types[$type])) {
            throw new LogicException('unknown super global var type');
        }
        $var = $types[$type];
        $is_recursive_static = true;
    } else {
        $var = $type;
    }
    $trim_chars = "\\0\x20\x09\x0a\x0d\x0b";
    $full_trim_chars = "{$trim_chars}\xc2\xa0\xe3\x80\x80";
    $trim_pattern = "/\A[{$trim_chars}]++|[{$trim_chars}]++\z/u";
    $full_trim_pattern = "/\A[{$full_trim_chars}]++|[{$full_trim_chars}]++\z/u";
    $ret = array();
    foreach ($default as $key => $value) {
        if (is_int($value) && !($value & (
            FILTER_STRUCT_FORCE_ARRAY |
            FILTER_STRUCT_FULL_TRIM | 
            FILTER_STRUCT_TRIM
        ))) {
            if (!$is_recursive) {
                $is_recursive_static = false;
            }
            throw new LogicException('unknown bitmask');
        }
        if (is_int($value) && $value & FILTER_STRUCT_FORCE_ARRAY) {
            $tmp = array();
            if (isset($var[$key])) {
                foreach ((array)$var[$key] as $k => $v) {
                    if (!preg_match('//u', $k)) {
                        continue;
                    }
                    $value &= FILTER_STRUCT_FULL_TRIM | FILTER_STRUCT_TRIM;
                    $tmp += array($k => $value ? $value : '');
                }
            }
            $value = $tmp;
        }
        if (isset($var[$key]) && is_array($value)) {
            $ret[$key] = filter_struct_utf8($var[$key], $value);
        } elseif (!isset($var[$key]) || is_array($var[$key])) {
            $ret[$key] = is_int($value) ? '' : $value;
        } else {
            if (!isset($var[$key]) || is_array($var[$key])) {
                $var[$key] = null;
            } elseif (is_int($value) && $value & FILTER_STRUCT_FULL_TRIM) {
                $var[$key] = preg_replace($full_trim_pattern, '', $var[$key]);
            } elseif (is_int($value) && $value & FILTER_STRUCT_TRIM) {
                $var[$key] = preg_replace($trim_pattern, '', $var[$key]);
            } else {
                $var[$key] = preg_replace('//u', '', $var[$key]);
            }
            if ($var[$key] === null) {
                $var[$key] = is_int($value) ? '' : $value;
           }
            $ret[$key] = $var[$key];
        }
    }
    if (!$is_recursive) {
        $is_recursive_static = false;
    }
    return $ret;
}

// HTML特殊文字エスケープ用
function h($input) {
    return htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
}

// $_POSTを不適切な送信が来ても問題ないように確実に期待する構造でextractする
//  - FULL_TRIMは全角スペースを含むトリミングを行う
//  - FORCE_ARRAYは強制的に一次元配列にする
extract(filter_struct_utf8(INPUT_POST, array(
    'name' => FILTER_STRUCT_FULL_TRIM,
    'company' => FILTER_STRUCT_FORCE_ARRAY,
    'shoes' => FILTER_STRUCT_FORCE_ARRAY,
    'yuka' => FILTER_STRUCT_FORCE_ARRAY,
    'surface' => FILTER_STRUCT_FORCE_ARRAY,
    'atai' => FILTER_STRUCT_FULL_TRIM,
)));

// 製品名
if ($name !== '') {
    $wheres[] = '`name` LIKE ?';
    $values[] = '%' . addcslashes($name, '\\_%') . '%';
}

// 会社名(配列)
foreach ($company as $s) {
    if ($s !== '') {
        $s_wheres[] = '`company` LIKE ?';
        $values[] = '%' . addcslashes($s, '\\_%') . '%';
    }
}
if (!empty($s_wheres)) {
    $wheres[] = '(' . implode(' OR ', $s_wheres) . ')';
}
 // 履物(配列)
foreach ($shoes as $t) {
    if ($t !== '') {
        $t_wheres[] = '`shoes` LIKE ?';
        $values[] = '%' . addcslashes($t, '\\_%') . '%';
    }
}
if (!empty($t_wheres)) {
    $wheres[] = '(' . implode(' OR ', $t_wheres) . ')';
}
 // 床材料(配列)
foreach ($yuka as $p) {
    if ($p !== '') {
        $p_wheres[] = '`yuka` LIKE ?';
        $values[] = '%' . addcslashes($p, '\\_%') . '%';
    }
}
if (!empty($p_wheres)) {
    $wheres[] = '(' . implode(' OR ', $p_wheres) . ')';
}
 // 介在物(配列)
foreach ($surface as $c) {
    if ($c !== '') {
        $c_wheres[] = '`surface` LIKE ?';
        $values[] = '%' . addcslashes($c, '\\_%') . '%';
    }
}
if (!empty($c_wheres)) {
    $wheres[] = '(' . implode(' OR ', $c_wheres) . ')';
}
// データ
if ($atai !== '') {
    $wheres[] = '`atai` LIKE ?';
    $values[] = '%' . addcslashes($atai, '\\_%') . '%';
}

// SQL文生成
$sql = 'SELECT * FROM sampledata';

if (!empty($wheres)) {
    $sql .= ' WHERE ' . implode(' AND ', $wheres);
}

try {

    // DB接続
    $dsn = 'mysql:dbname=testdb;host=localhost;charset=utf8mb4';
    $username = '*******';
    $password = '*******';
    $options = array(
        // デフォルトフェッチモードを連想配列にする
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        // SQLエラー時に例外をスローさせる
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        // SELECTに対してもrowCount()を使えるようにする
        PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
    );
    $pdo = new PDO($dsn, $username, $password, $options);

    // プリペアドステートメントを生成
    $stmt = $pdo->prepare($sql);
    // 値をバインドして実行
    $stmt->execute(isset($values) ? $values : array());

    // メッセージをセット
    if ($stmt->rowCount()) {
        $message = $stmt->rowCount() . '件ヒットしました';
    } else {
        $message = '該当するデータはありませんでした';
    }

} catch (Exception $e) {

    $message = $e->getMessage();

}

// ヘッダー送信
header('Content-Type: text/html; charset=utf-8');

?>
<!DOCTYPE html>
<html>
  <head>
    <title>検索結果</title>
  </head>
  <body>
    <h1>検索結果</h1>

    <p><?=h($message)?></p>
<?php if (isset($stmt) && $stmt->rowCount()): ?>
    <table border="1" cellpadding="3">
      <tr>
        <th>製品名</th>
        <th>会社名</th>
        <th>履物</th>
        <th>床材料</th>
        <th>介在物</th>
        <th>データ</th>
      </tr>
<?php foreach ($stmt as $row): ?>
      <tr>
        <td><?=h($row['name'])?></td>
        <td><?=h($row['company'])?></td>
        <td><?=h($row['shoes'])?><</td>
        <td><?=h($row['yuka'])?></td>
        <td><?=h($row['surface'])?></td>
        <td><?=h($row['atai'])?></td>
      </tr>
<?php endforeach; ?>
    </table>
<?php endif; ?>
    <p><a href="/aaa/input.php">再検索</a></p>
  </body>
</html>

```

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

<a>タグを使うのは如何でしょうか?リンク先はDBから取得した内容をセットすれば良いのではないでしょうか?

<td><a href="リンク先"><?=h($row['company'])?></a></td>

追記

<td>
    <a hfef="<?h($row['URL_shoes'])?>">
        <?=h($row['shoes'])?>
    </a>
</td>

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/12 11:48

    回答ありがとうございます。
    <a>を用いて作りたいと思います。
    質問に質問えお重ねて申し訳ありません。リンク先はDBから取得した内容をセットすれば良いのではないでしょうか? とは具体的にどういうことでしょうか?
    たとえば、A会社のリンク先をkaishaA.phpにしようと考えてます。上記の”リンク先”にkaishaAを組み込めばよろしいでしょうか?

    キャンセル

  • 2017/01/12 11:57 編集

    単純にデータの1項目として、例えば"URL”というカラムを持たせて、下記の様にすればリンクが生成できるのかと思いました。(URLには、kaishaA.phpという値が入っている前提)
    <a href="http://example.com/url/<?=h($row['URL'])?>"><?=h($row['company'])?></a>

    キャンセル

  • 2017/01/12 12:12

    DBのカラムに会社名用のURLの値を追加(それぞれにマッチしたリンク)して<?=h($row['URL'])?>のコードを<h1>検索結果</h1>の欄に加えてみます。

    <?h($row['URL'])?>にもforeach文を新たに入れるべきですか? すでにforeachでURLも出るから入れなくていいですか?

    キャンセル

  • 2017/01/12 12:56

    <td>の追加をするのであれば不要ではないでしょうか。

    キャンセル

  • 2017/01/12 15:19

    何度も質問を重ねてしまい申し訳ありません。
    追記に記載した内容が上手くいきませんでした。
    <td><a hfef="<?h($row['URL_shoes'])?>"<?=h($row['shoes'])?></a></td> と
    <a href="http://example.com/url/<?=h($row['URL'])?>"><?=h($row['company'])?></a>
    の2パターンで実際に検索をかけましたら、検索結果の表示には問題はありませんでしたが、履物の欄が空白になってしまいました。
    また、カラム内に値が入っていないから非表示? になると考え全てに値を挿入し試みましたが表示されませんでした。

    キャンセル

  • 2017/01/12 15:28 編集

    <td><a hfef="<?h($row['URL_shoes'])?>"<?=h($row['shoes'])?></a></td>が本来、やりたい事だと解釈して、回答を編集してみました。>が抜けているだけなような気もします。
    それと、表示されているhtmlの内容を確認して貼り付けて頂けますでしょうか。

    キャンセル

  • 2017/01/12 15:59

    すいませんでした。ケアレスミスでした。そして、直した結果、無事解決しました。

    今回の質問に協力してくださったkunai様、motuo様に感謝を申し上げます。忙しいところ初心者の私のために、回答を下さりありがとうございました。
    そして、時間を最も割いて頂いたmotuo様をベストアンサーとさせていただきます。

    キャンセル

+1

<td><a href="http://example.com/url?name=<?=h($row['name'])?>"><?=h($row['name'])?></a></td>


とかそういう事ですか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/12 11:42

    回答ありがとうございます。
    はい。その形にさらに質問したいことがございます。
    紳士靴Aのリンク先をkustuA.phpにしようと考えてます。まだWebに挙げてないのでlocalhost経由で表示しています。
    上記のコードの(http://example.com/url?name=<?=h)を kustuA.php と挿入すれば動くということでしょうか?

    キャンセル

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

  • ただいまの回答率 90.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    20255questions

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