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>
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/01/12 02:48
2017/01/12 02:57 編集
退会済みユーザー
2017/01/12 03:12
2017/01/12 03:56
退会済みユーザー
2017/01/12 06:19
2017/01/12 06:33 編集
退会済みユーザー
2017/01/12 06:59