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

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

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

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

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

PHP

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

Q&A

解決済

1回答

2127閲覧

DBにあるデータを使ってセレクトボックスに表示したい

YukaSaku

総合スコア52

MySQL

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

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

PHP

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

0グッド

0クリップ

投稿2017/05/25 05:24

オンラインショップのログイン画面を作っています。
ユーザーがログインした後に、商品カテゴリをセレクトボックスから選べるようにしたいと思っています。
このセレクトボックスの中身はproduct_categoryテーブルから持ってくるようになっているのですが、データが入ってきません。
//product DB//の箇所のコードなのですが、何が間違っているのでしょうか?

php

1<?php 2session_start(); 3ini_set("include_path","./includes"); 4include("dbinfo.inc"); 5if(!isset($_SESSION['username'])) { 6 header("Location: login.php"); 7} 8 9 $logtime = date("H:i:s"); 10 11// ユーザーIDからユーザー名を取り出す 12$mysqli = new mysqli($host, $user, $passwd, $dbname); 13$sql = "SELECT * FROM login WHERE username='".$_SESSION['username']."'"; 14 15$result = $mysqli->query($sql); 16if (!$result) { 17 print('Cant execute query.' . $mysqli->error); 18 $mysqli->close(); 19 exit(); 20} 21 22// GET user info 23while ($row = $result->fetch_assoc()) { 24 $username = $row['username']; 25 $email = $row['email']; 26 $gen = $row['gen']; 27 } 28$sql = "UPDATE login SET logtime = NOW() WHERE username = '" . $_SESSION['username'] . "'"; 29 30$result = $mysqli->query($sql); 31if (!$result) { 32 print('Cant execute query.' . $mysqli->error); 33 $mysqli->close(); 34 exit(); 35} 36// Cut data base 37//$result->close(); 38 39//product DB// 40$sql = "SELECT * FROM product_category WHERE category='".$_SESSION['category']."'"; 41$result = $mysqli->query($sql); 42 43foreach((array)$category as $value) 44{ 45 $category_i = $value; 46 echo $_POST['category']; 47} 48if (!$result) { 49 print('Cant execute query.' . $mysqli->error); 50 $mysqli->close(); 51 exit(); 52} 53 54 55 /* 56 function get_the_category( $id = false ) { 57 $categories = get_the_terms( $id, 'category' ); 58 if ( ! $categories || is_wp_error( $categories ) ) 59 $categories = array(); 60 61 $categories = array_values( $categories ); 62 63 foreach ( array_keys( $categories ) as $key ) { 64 _make_cat_compat( $categories[$key] ); 65 } 66 }*/ 67 68 69?> 70 71<!DOCTYPE HTML> 72<html> 73<head> 74<title>Exercise6</title> 75<link rel="stylesheet" href="custom.css"> 76<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.0/css/bootstrap.min.css"> 77</head> 78<body> 79 <div class="col-xs-6 col-xs-offset-3"> 80 <h1>Online shop</h1><p>Username:<?php echo $username; ?></p> 81 82<select name="category"> 83 <option value="NULL">Choose One</option> 84 <?php echo "<option value='" .$category_i."' ". ($category_i == $value?'selected':'') .">".$value."</option>"; ?> 85</select> 86 87<br><br> 88 <button type="submit" class="btn btn-default" name="submit"><a href="login.php">Submit</a></button> 89 <button type="button" class="btn btn-default" name="logout"><a href="login.php">Logout</a></button> 90 91 92 </div> 93</body> 94</html>

テーブル名: product_discription

catalog_id INT(5) AUTO_INCREMENT. Primary key.Unique.
name VARCHAR(50)
description VARCHAR(500)
price DECIMAL(7,2)
category_id VARCHAR(10)

テーブル名: product_category

category_id INT(10) AUTO_INCREMENT. Primary key.Unique.
category VARCHAR(100) (category name)

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

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

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

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

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

guest

回答1

0

ベストアンサー

$_SESSION['category']

上記に何も入っていないから(もしくはnull?)ではないでしょうか?

foreach((array)$category as $value)

上記、(array)でキャストしているため未定義エラーが出ていませんが、
$category自体はどこにも定義されていないようです。
本来はproduct_categoryのSELECT結果を受取るべきでは?

#追記
参考URLなど

・$_SESSIONについて
PHPマニュアル
PHP 関数($_SESSION etc)

・SELECT結果を受取る
[PHP] mysqli使い方まとめ(MySQL接続~SELECT実行まで)

・POSTとか
PHPでフォームからデータを受け取る方法(GETとPOST)

・総合的なやつ
Cookieとセッションをちゃんと理解する

投稿2017/05/25 05:30

編集2017/05/25 07:25
m.ts10806

総合スコア80850

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

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

YukaSaku

2017/05/25 06:40

そうなんです。$_SESSION['category']には何も入ってないと思います。 foreachは最初(array)がなくて、エラーが出たので(array)を入れてエラーを消しました。 product_categoryのSELECT結果を受取るべきと私も思うのですが、どのように受け取ればいいでしょうか。今まで$_SESSIONと入れればなんとかデータが取れたので、入れてみたのですが実際何を$_SESSIONの部分に書けばいいのかわかりません。
m.ts10806

2017/05/25 07:00

おおなるほど。SESSIONの基礎からっぽいですね。 $_SESSION自体はグローバル変数でsessionが開始されていればどこでも使える「連想配列」ですが、 連想配列ゆえに$_SESSIONに設定される値については自分で設定しないといけません。 $_SESSION['category']が欲しければ自分で値を設定する必要があります。 PHPマニュアル:https://secure.php.net/manual/ja/reserved.variables.session.php $_SESSION['username']も同様ですね。 あと、エラー回避のために(array)を追記することで変数に意味を持たせていますが、これはやめた方がいいです。 エラーが出るということは文法上間違いがあるということです。間違いがあるならその文法を正すべきであって目の前のエラーを出なくすることではありません。 (型名)でキャストすることは本来でるべきエラーを強引に回避しているのと同じなので(変数の前に@をつけるのも似たようなもの) エラーに気づけなくなり、コード上のバグが眠ったままとなります。 http://qiita.com/tadsan/items/fb496e450fc27c8c4494 の「安易にキャストするな」辺りに色々書いてます(僕自身もこの記事にはいまだにお世話になっています) まず、処理の順番・ロジックをきちんと整理してから作り直す必要がありそうです。
YukaSaku

2017/05/25 07:14 編集

確かにそうですね。いくらグローバル関数でも自分でデータを入れなければ、空は空ですね。 SESSIONにデータを入れることをやってみようと思います。処理の順番の整理もですね。 ありがとうございます。
m.ts10806

2017/05/25 07:17

参考URLもいろいろあるので回答に追記しておきます。
m.ts10806

2017/05/25 07:29

categoryに関してですが、カテゴリ名でカテゴリの絞込みを行う・・・ように見受けられるので$_SESSIONは不要ではなくフォームからsubmitされた値を$_POSTで受取るのでじゅうぶんかなと思います。 ユーザ毎に利用できるカテゴリが指定されているといった仕様でしたら$_SESSIONでもありですが、その場合はカテゴリID保管の方がいいですね。 ただ、その場合、ユーザからの入力を受けとるのでセキュリティの観点からSQLのエスケープはしておきましょう。もちろん画面に表示するときのエスケープも。
YukaSaku

2017/05/31 03:34 編集

たくさんの参考URLをありがとうございます。とても参考になりました。 DBから持ってきたデータをただセレクトボックスに入れたかっただけなのでSESSIONでもPOSTでもなかったと思うのですが、ここでコードを書くとわかりにくいので、また別途質問させていただきます。 ありがとうございました!!
m.ts10806

2017/05/31 03:38

了解です。よろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問