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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

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回答

775閲覧

PHP SQL文内容が反映しない

退会済みユーザー

退会済みユーザー

総合スコア0

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

SQL

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

PHP

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

0グッド

0クリップ

投稿2019/05/27 12:32

データベースのデータを画面に反映させたい

現在、「気づけばプロ並みPHP改訂版」で、
ショッピングサイトを作成する練習をしています。

現段階としては、データベースに蓄積されたデータを取り出すために、
csvを作る演習の最中です。

今回は、sql分などが$csvにしっかりと反映されているかを確認するため、
$csvをprintしたものの、sql分の内容が反映されない状況です。

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

https://gyazo.com/30b37df2cf72a80b318a1518b66160cf

該当のソースコード

php

1<?php 2session_start(); 3session_regenerate_id(true); 4if(isset($_SESSION['login'])==false) 5{ 6 print 'ログインされていません。<br />'; 7 print '<a href="../staff_login/staff_login.html">ログイン画面へ</a>'; 8 exit(); 9} 10else 11{ 12 print $_SESSION['staff_name']; 13 print 'さんログイン中<br />'; 14 print '<br />'; 15} 16?> 17 18<!DOCTYPE html> 19<html> 20<head> 21<meta charset="UTF-8"> 22<title> ろくまる農園</title> 23</head> 24<body> 25 26<?php 27 28try 29{ 30 31$year=$_POST['year']; 32$month=$_POST['month']; 33$day=$_POST['day']; 34 35$dsn='mysql:dbname=shop;host=localhost;charset=utf8'; 36$user='root'; 37$password='root'; 38$dbh=new PDO($dsn,$user,$password); 39$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 40 41$sql=' 42SELECT 43 dat_sales.code, 44 dat_sales.date, 45 dat_sales.code_member, 46 dat_sales.name AS dat_sales_name, 47 dat_sales.email, 48 dat_sales.postal1, 49 dat_sales.postal2, 50 dat_sales.address, 51 dat_sales.tel, 52 dat_sales_product.code_product, 53 mst_product.name AS mst_product_name, 54 dat_sales_product.price, 55 dat_sales_product.quantity 56FROM 57 dat_sales,dat_sales_product,mst_product 58WHERE 59 dat_sales.code=dat_sales_product.code_sales 60 AND dat_sales_product.code_product=mst_product.code 61 AND substr(dat_sales.date,1,4)=? 62 AND substr(dat_sales.date,6,2)=? 63 AND substr(dat_sales.date,9,2)=? 64'; 65$stmt=$dbh->prepare($sql); 66$data[]=$year; 67$data[]=$month; 68$data[]=$day; 69$stmt->execute($data); 70 71$dbh=null; 72 73$csv='注文コード,注文日時,会員番号,お名前,メール,郵便番号,住所,TEL,商品コード,商品名,価格,数量'; 74$csv.="\n"; 75while(true) 76{ 77 $rec=$stmt->fetch(PDO::FETCH_ASSOC); 78 79 print $rec['code']; 80 if($rec==false) 81 { 82 break; 83 } 84 $csv.=$rec['code']; 85 $csv.=','; 86 $csv.=$rec['date']; 87 $csv.=','; 88 $csv.=$rec['code_member']; 89 $csv.=','; 90 $csv.=$rec['dat_sales_name']; 91 $csv.=','; 92 $csv.=$rec['email']; 93 $csv.=','; 94 $csv.=$rec['postal1'].'-'.$rec['postal2']; 95 $csv.=','; 96 $csv.=$rec['address']; 97 $csv.=','; 98 $csv.=$rec['tel']; 99 $csv.=','; 100 $csv.=$rec['code_product']; 101 $csv.=','; 102 $csv.=$rec['mst_product_name']; 103 $csv.=','; 104 $csv.=$rec['price']; 105 $csv.=','; 106 $csv.=$rec['quantity']; 107 $csv.="\n"; 108} 109 110print nl2br($csv); 111 112} 113catch (Exception $e) 114{ 115 print 'ただいま障害により大変ご迷惑をお掛けしております。'; 116 exit(); 117} 118 119?> 120 121<br /> 122<a href="../staff_login/staff_top.php">トップメニューへ</a><br /> 123 124</body> 125</html>

試したこと

AND substr(dat_sales.date,1,4)=?
AND substr(dat_sales.date,6,2)=?
AND substr(dat_sales.date,9,2)=?
';
$stmt=$dbh->prepare($sql);
$data[]=$year;
$data[]=$month;
$data[]=$day;

の部分を実際にデータを入力した日を
下記のように直接入力したら、
データは反映されて、画面に出てきました。

AND substr(dat_sales.date,1,4)="2019"
AND substr(dat_sales.date,6,2)="05"
AND substr(dat_sales.date,9,2)="26"
';
$stmt=$dbh->prepare($sql);
//$data[]=$year;
//$data[]=$month;
//$data[]=$day;

また、前ページから、$_POSTを受け取れていないかと確認するために、
print $_POST[]でそれぞれ確認しましたが、
そこは受け取れていました。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

m.ts10806

2019/05/27 12:42

画像はteratailの画像投稿機能をお使いください。 またコードブロック内はマークダウンが反映されません。 あと、コードはマークダウンのcode機能を利用してご提示ください。
Orlofsky

2019/05/27 14:28

正誤表に ;) → ); mamber → member ってあるだけでも経験の少ない人が書いた本だと判断できます。
退会済みユーザー

退会済みユーザー

2019/05/27 21:30

>m6uさん 正誤表ありがとうございます。こちらは確認済みでした。
guest

回答3

0

ベストアンサー

php

1$year=$_POST['year']; 2$month=$_POST['month']; 3$day=$_POST['day'];

この時点で$year,$month,$dayは文字列として扱われているとしても、

php

1$stmt=$dbh->prepare($sql); 2$data[]=$year; 3$data[]=$month; 4$data[]=$day; 5$stmt->execute($data);

この時点でどうだろう? まだ文字列かなぁ。
では、SQL文の

AND substr(dat_sales.date,1,4)=? AND substr(dat_sales.date,6,2)=? AND substr(dat_sales.date,9,2)=?

ここで数値として比較されていたりしないだろうか。
そういうのを避けるためにも

php

1$stmt=$dbh->prepare($sql); 2$stmt->bindValue(1, $year, PDO::PARAM_STR); 3$stmt->bindValue(2, $month, PDO::PARAM_STR); 4$stmt->bindValue(3, $day, PDO::PARAM_STR); 5$stmt->execute();

としてみるか、
もう一点、これクエリーが遅くなる要因の一つだから

AND dat_sales.date=?

にして、$year,$month,$dayをもとに合成した日付の文字列を与えたほうがいいよ。

とりあえず気づいた点として以上。


老婆心ながら、
日付や時刻はデータベースのDATE型TIME型TIMESTAMP型を活用したほうが良いです。
(phpではDateTimeやDateTimeIntervalなどのクラス群があります。)
日付に例えば日数を足したり引いたりするのをクエリー上でラクに扱えます。
日付を文字列のまま格納するのはナンセンス。

投稿2019/05/27 12:59

編集2019/05/27 13:07
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2019/05/27 21:31

ご回答ありがとうございます。 日付を文字列のまま入力するのはよろしくないのですね。。。 いただいた内容で、もう一度打ち直してみます!
guest

0

まず、データベースに対して直接SQLを発行して
データがあることを確認しましょう。
また、実行時にエラーが出ていないかも要注意です。
ちなみに、下記は必要なんでしょうか?

$dbh=null;

投稿2019/05/27 13:38

takasima20

総合スコア7458

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

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

退会済みユーザー

退会済みユーザー

2019/05/27 21:35

$dbh=null; は、本の主張によると 毎回、データベースにログインした場合は、 ログアウトもするべき、ということで、 付け足していました。
takasima20

2019/05/27 22:39

もし書くなら print した後、つまり $rec=$stmt->fetch(PDO::FETCH_ASSOC); を使い終わった後の方がいいと思います。
guest

0

m6uさんがご指摘されてる文字列で検索されてるかもしくはexecuteの引数の渡し方かなあと思います。

pdostatement.execute
上記マニュアルにはパラメータについて

実行される SQL 文の中のバインドパラメータと同数の要素からなる、 値の配列。すべての値は PDO::PARAM_STR として扱われます。

とあります。Stringだからやはり文字列なのかなぁと。
そしてもう一つ。
マニュアルの下の方に書いてますが配列の場合はarrayでexecuteに渡してあげるといいみたいです。

投稿2019/05/27 13:26

mepon

総合スコア480

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

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

退会済みユーザー

退会済みユーザー

2019/05/27 21:33

ご回答ありがとうございます。 executeにはarrayで渡すようにします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問