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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

Q&A

解決済

3回答

665閲覧

フォームから送ったデータをデータベースから引っ張ってきて、ブラウザに反映させたい

bigin

総合スコア67

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

0グッド

0クリップ

投稿2017/10/18 12:25

編集2017/10/19 02:42

現在フォームからデータを受け取って、それをブラウザに表示するプログラムをphpで書いています。

フォームのhtmlファイル内にselectタグでデータを送る箇所があります。
以下ご確認ください。

registration.html

都道府県<br> <select name="prefecture"><br> <option value="all">全て</option> <option value="tokyo">東京</option> <option value="kanagawa">神奈川</option> <option value="chiba">千葉</option> <option value="saitama">埼玉</option> <option value="hokkaido">北海道</option> <option value="sendai">仙台</option> <option value="aichi">愛知</option> <option value="osaka">大阪</option> <option value="fukuoka">福岡</option> </select><br>

ここで選択した値が入っているカラムを全て表示させたいと考えています。
以下そのためのphpです。

<!DOCTYPE html> <html lang = "ja"> <head> <meta charset ="UTF-8"> <tittle>登録ページ</tittle> </head> <body> <table border='1' class="TableStyle1" width="1000"> <tr> <th>名称</th> <th>都道府県</th> <th>市区町村</th> <th>番地</th> <th>区分</th> <th>電話番号</th> <th>担当者名</th> <th>部数</th> <th>設置/配布</th> <th>消去</th> </tr> <?php $dsn = 'mysql:dbname=delivery_list;host=127.0.0.1'; $usr = 'root'; $passwd = ''; try{ $db = new PDO($dsn,$usr,$passwd); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql= 'SELECT * FROM zenkoku where prefecture like :prefecture'; $stmt=$db->prepare($sql); $stmt ->bindParam(':prefecture',filter_input(INPUT_POST,'prefecture'),PDO::PARAM_STR); $stmt->execute(); $users = $stmt -> fetchAll(PDO::FETCH_ASSOC); foreach($users as $user){ ?> <tr> <td><?php echo $user['name'];?></td> <td><?php echo $user['prefecture'];?></td> <td><?php echo $user['city'];?></td> <td><?php echo $user['address'];?></td> <td><?php echo $user['type'];?></td> <td><?php echo $user['tel'];?></td> <td><?php echo $user['person_name'];?></td> <td><?php echo $user['copies'];?></td> <td><?php echo $user['set_type'];?></td> </tr> <?php echo $user; } }catch(PDOException $e){ echo $e->getMessage(); exit; } ?> </body> </html>

すでにprefectureのカラムを作っていて、そこからPOSTした値と同じものを出力したいです。

以下はtableのカラムです。

| id | name | prefecture | city | address | type | tel | person_name | copies | set_type |

こちらは反映したブラウザです。
内容が表示されていません。

イメージ説明

もし、原因がわかればご教示いただけますと幸いです。
よろしくお願いいたします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2017/10/18 12:33

必要な内容を再度整理してください。エラーの内容も追記してください。
bigin

2017/10/18 14:15

エラーを追加しました。ご確認ください。
guest

回答3

0

ベストアンサー

まず基本の話

$sql= 'SELECT * FROM zenkoku where prefecture like $_POST['prefecture']';

  • 文字列をシングルクォーテーションで囲むと変数は展開されません。
  • 受け取ったポストデータをそのままSQL文に投入するには適当なクォーテーションでくくる必要があります
  • ワイルドカードをつかわないlike検索はあまり意味が無いので「=」で十分です

ここまでを反映すると

$sql= "SELECT * FROM zenkoku where prefecture ='".$_POST['prefecture']."'";

また、postデータはfilter_inputなどで存在や整合性チェックします。
(今回はサンプルなので存在チェックのみ)

PHP

1$prefecture=filter_input(INPUT_POST,"prefecture");

この上で、$prefectureが流れてきた時だけ処理するようにし
インジェクション対策が必要なのでprepareで処理します

$prefecture=filter_input(INPUT_POST,"prefecture"); if(!is_null($prefecture) and $prefecture!==""){ $sql= "SELECT * FROM zenkoku where prefecture = ?"; $data[]=$_POST['prefecture']; $stmt = $pdo->prepare($sql); $stmt->execute($data); $rows=$stmt->fetchAll(PDO::FETCH_ASSOC); }

その他実用にはいくつか工夫が必要です

投稿2017/10/19 01:15

編集2017/10/19 01:16
yambejp

総合スコア114769

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

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

bigin

2017/10/20 10:10

お返事遅くなりました。 $_POST['prefecture'] の前後にピリオドがありますが、これはなぜ必要なのでしょう?
guest

0

php

1$pdo = new PDO($dsn, $usr, $passwd); 2$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 3$sql = 'SELECT * FROM zenkoku where prefecture like :prefecture'; 4$stmt = $pdo->prepare($sql); 5$stmt->bindParam(':prefecture', filter_input(INPUT_POST, 'prefecture'), PDO::PARAM_STR); 6$stmt->execute(); 7$rows = $stmt->fetchAll();

投稿2017/10/18 12:33

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

bigin

2017/10/18 14:08

ありがとうございます。エラーが出ました。何かmysqlのバージョンが関係あるのでしょうか? 以下バージョンです。 mysql Ver 14.14 Distrib 5.7.19, for osx10.12 (x86_64) using EditLine wrapper 以下エラーコードです。 SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ':prefecture' at line 1
退会済みユーザー

退会済みユーザー

2017/10/18 15:58 編集

回答どうりにやってないからでしょう それに、動作テストするだけの情報が提示もされていないので、SQL文自体はチェックしてませんよ。
bigin

2017/10/20 10:10

お返事遅くなりました。 コードを書き換えましたのでご確認いただけますと幸いです。
退会済みユーザー

退会済みユーザー

2017/10/20 12:33

一体何を確認してくれと?
guest

0

php

1class Users {}

というようなクラスを作っておきデータベースのカラムとして取得したい場合は
fetchAllの第1引数にPDO::FETCH_CLASS、第2引数にクラス名を指定します。

php

1$users = $stmt->fetchAll(PDO::FETCH_CLASS, 'Users');

のように指定すると

php

1$id = $users->id; 2$name = $users->name; 3$prefecture = $users->prefecture; 4$city = $users->city; 5$address = $users->addres; 6$type = $users->type; 7$tel = $users->tel; 8$person_name = $users->person_name; 9$copies = $users->copies; 10$set_type = $users->set_type;

として取得できます。fetchAllの第1引数にPDO::FETCH_OBJを指定しても同等なことができます。

投稿2017/10/22 23:58

naohiro19_

総合スコア178

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

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

bigin

2017/10/23 14:54

ありがとうございます。オブジェクト思考を用いてやるやり方ということですかね?上記の場合クラスの中身はどのような変数と関数を設置するのですか?
退会済みユーザー

退会済みユーザー

2017/10/23 22:58

この回答って、何の意図があるんですか? 質問の回答になっていないようですが。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問