質問編集履歴

2 私が思い描いているイメージの追記

退会済みユーザー

退会済みユーザー

2017/01/12 15:27  投稿

PHPでMYSQLの検索結果にリンクをつけたい
PHPを始めたばかりの初心者です。
PHPを用いてMYSQLにあるデータベースから検索しWebサイトに表示するプログラムを作っています。
現在下記のプログラムで検索結果を表示するところまで完成しております。
ここから検索結果ででた文字一つ一つにリンクをつけ、それぞれのリンク先に見に行けるコードの作り方がわかりません。
会社ごと、履物ごとにリンクをつけたいです。表現が乏しくて申し訳ございませんがご教授お願い致します。
ここから検索結果ででた文字一つ一つにリンクをつけ、それぞれのリンク先に見に行けるコードの作り方がわかりません。会社ごと、履物ごとにリンクをつけたいです。表現が乏しくて申し訳ございませんがご教授お願い致します。
追記2
例えば、検索で配列させたA紳士靴の文字にマウスを乗っけると紳士靴Aのサイトに飛ぶリンクを作成したいです。
理想は会社ごと、履物ごとにリンクをつけたいです。
イメージのサイトはこちらです。
[リンク内容](http://dova-s.jp/bgm/)
 
追記
###発生している問題
```
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>
```
```
  • PHP

    28057 questions

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

1 新たな問題の追記

退会済みユーザー

退会済みユーザー

2017/01/12 12:54  投稿

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

    28057 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る