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

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

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

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

Q&A

解決済

1回答

810閲覧

検索フォーム(php)にて、入力されたものを適切に表示したい。

haniwamk3

総合スコア12

PHP

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

0グッド

0クリップ

投稿2019/05/18 03:56

前提・実現したいこと

phpを使って簡単な検索、登録、更新ができるフォームを作っています。

発生している問題・エラーメッセージ

フォームに入力したデータを検索したいのですが、違うものが表示されてしまいます。

### 該当のソースコード <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>登録画面</title> </head> <body> <?php if(empty($_POST)) { header("Location: kensaku.html"); exit(); }else{ //名前入力判定 $name=null; if (!isset($_POST['name']) || $_POST['name'] === "" ){ $errors['name'] = "名前が入力されていません。"; } $zip11=null; if (!isset($_POST['zip11']) || $_POST['zip11'] === "" ){ $errors['zip11'] = "名前が入力されていません。"; } $addr11=null; if (!isset($_POST['addr11']) || $_POST['addr11'] === "" ){ $errors['addr11'] = "名前が入力されていません。"; } $email=null; if (!isset($_POST['email']) || $_POST['email'] === "" ){ $errors['email'] = "名前が入力されていません。"; } } if(count($errors= array()) === 0){ $dsn = 'mysql:host=localhost;dbname=kensaku;charset=utf8'; $user = 'haniwa'; $password = 'gojira0217'; try{ $dbh = new PDO($dsn, $user, $password); $statement = $dbh->prepare("SELECT * FROM juushoroku WHERE name LIKE '%{$name}%' or '%{$zip11}%' or '%{$addr11}%' or '%{$email}%'"); if($statement){ $like_yourname = "%".$name."%"; //プレースホルダへ実際の値を設定する $statement->bindValue('$name', $like_yourname, PDO::PARAM_STR); if($statement->execute()){ //レコード件数取得 $row_count = $statement->rowCount(); while($row = $statement->fetch()){ $rows[] = $row; } }else{ $errors['error'] = "検索失敗しました。"; } //データベース接続切断 $dbh = null; } }catch (PDOException $e){ print('Error:'.$e->getMessage()); $errors['error'] = "データベース接続失敗しました。"; } } ?> <!DOCTYPE html> <html> <head> <title>検索結果</title> <meta charset="utf-8"> </head> <body> <?php if (count($errors) === 0): ?> <p><?=htmlspecialchars($name, ENT_QUOTES, 'UTF-8')."さんで検索しました。"?></p> <p><?=$row_count?>件です。</p> <table border='1'> <tr><td>名前</td><td>郵便番号</td><td>住所</td><td>メールアドレス</td></tr> <?php foreach($rows as $row) ?> <tr> <td><?=htmlspecialchars($row['name'],ENT_QUOTES,'UTF-8')?></td> <td><?=htmlspecialchars($row['zip11'],ENT_QUOTES,'UTF-8')?></td> <td><?=htmlspecialchars($row['addr11'],ENT_QUOTES,'UTF-8')?></td> <td><?=htmlspecialchars($row['email'],ENT_QUOTES,'UTF-8')?></td> </tr> <?php ?> <?php elseif(count($errors) > 0): ?> <?php foreach($errors as $value){ echo "<p>".$value."</p>"; } ?> <?php endif; ?> </body> </html> ```ここに言語名を入力 php データベースはこんな感じです。

イメージ説明

sql文に変数を入れてみたのですが、うまく表示されません。
検索をしてみてもいまいち参考になるものが見当たらず,,,皆様のお力をお貸しいただけないでしょうか。
よろしくお願いします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

思いつきであれこれ指摘してみる。

$_POST受信パラメータの検証は例えば

php

1$name = filter_input(INPUT_POST, 'name'); 2if ($name === "" ){ 3 $errors['name'] = "名前が入力されていません。"; 4} 5$zip11 = filter_input(INPUT_POST, 'zip11'); 6 if ($zip11 === "" ){ 7 $errors['zip11'] = "郵便番号が入力されていません。"; 8} 9$addr11 = filter_input(INPUT_POST, 'addr11'); 10if ($addr11 === "" ){ 11 $errors['addr11'] = "住所が入力されていません。"; 12} 13$email = filter_input(INPUT_POST, 'email'); 14if ($email === "" ){ 15 $errors['email'] = "メールアドレスが入力されていません。"; 16}

みたいにするとか。

filter_input()で検証したとはいえ外部から受信したデータをそのままクエリー文字列に連結するのは怖いので、例えば

php

1$where_phrase = []; 2$bind_values = []; 3if ($name !== '') { 4 $where_phrase[] = 'name like :name'; 5 $bind_values[] = '%' . $name . '%'; 6} 7if ($zip11 !== '') { 8 $where_phrase[] = 'zip11 like :zip11'; 9 $bind_values[] = '%' . $zip11 . '%'; 10} 11if ($addr11 !== '') { 12 $where_phrase[] = 'addr11 like :addr11'; 13 $bind_values[] = '%' . $addr11 . '%'; 14} 15if ($email !== '') { 16 $where_phrase[] = 'email like :email'; 17 $bind_values[] = '%' . $email . '%'; 18} 19$sql = "SELECT * FROM juushoroku "; 20if (count($where_phrase) > 0) { 21 $sql .= 'where ' . implode(' and ', $where_phrase); 22} 23$sql .= ';'; 24try { 25 $stmt = $dbh->prepare($sql); 26 if (count($bind_values) > 0) { 27 $stmt->execute($bind_values); 28 } 29 30 31 32} 33catch /* 以下略 *? 34

とか。すべて未入力のときはクエリー実行しないものとしたけども。

投稿2019/05/18 04:28

編集2019/05/18 05:17
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問