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

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

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

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

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

1回答

1847閲覧

$result = pg_query("DB接続リソース",SQLクエリ)の結果、$resultがfalseになってしまいます

y_programming

総合スコア48

SQL

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

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2020/03/30 12:40

PHP

1$con = pg_connect("dbname=db0000 user=nobody"); 2if(!$con){ 3 return_error("DB接続失敗"); 4} 5 6$sql = "SELECT TO_CHAR(y.yoyaku_date,'YYYY-FMMM-FMDD') AS yoyaku_date, s.sname, y.start_time, y.end_time " 7."FROM tbl_4_2_1 AS y INNER JOIN tbl_4_2_2 AS s " 8."ON y.scode = s.scode " 9."WHERE TO_DATE(y.yoyaku_date,'YYYY-MM')=TO_DATE('$year-$month','YYYY-MM') " 10."ORDER BY s.scode,y.start_time,y.end_time"; 11$result = @pg_query($con,$sql); 12if(!$result){ 13 return_error( 14 "検索に失敗しました<br> 15 [$result]<br> 16 [$con]<br> 17 [$sql]" 18 ); 19}

PHP

1 return_error( 2 "検索に失敗しました<br> 3 [$result]<br> 4 [$con]<br> 5 [$sql]" 6 );

の部分はブラウザ上で以下のように表示されます。ここで$result,$con,$sqlの中身を確認しようと考えています。ここで、$resultに何も入っていない事が判明しました。

検索に失敗しました [] [Resource id #2] [SELECT TO_CHAR(y.yoyaku_date,'YYYY-FMMM-FMDD') AS yoyaku_date, s.sname, y.start_time, y.end_time FROM table1 AS y INNER JOIN table2 AS s ON y.scode = s.scode WHERE TO_DATE(y.yoyaku_date,'YYYY-MM') =TO_DATE('2020-3','YYYY-MM') ORDER BY s.scode,y.start_time,y.end_time]

以下の一行の処理により、$resultの中に$conで指定しているdb0000に対して命令を飛ばした内容が入ると思ったのですが失敗して$resultにはfalseが入っているようです。

PHP

1$result = pg_query($con,$sql);

マニュアルを読んでみたところ、pg_query_params()という上位互換?と思われる
関数があった為、それも使ってみました。

PHP

1$result = pg_query_params($con,$sql);

↑の結果のエラーは、
Warning: pg_query_params() expects parameter 1 to be string, resource given in ファイルパス

というものです。「パラメータ1が文字列であることを期待しています。」との事なので、
pg_query_paramsに2つ渡す引数のうち、1つ目である$conが間違っているのかなと予想しました。
$conの直近の代入である、

PHP

1$con = pg_connect("dbname=db0000 user=nobody"); 2if(!$con){ 3 return_error("DB接続失敗"); 4}

を見直してみても、どうもここの部分はエラーに関与していないように思ってしまいます。
$conには、ブラウザ上に表示されたように「Resource id #2」という文字列が入っていると判断した為です。

エラー原因に辿り着く事が出来なかった為、何かヒントが欲しい状況です。
何かお気づきの方がいらっしゃいましたらご指摘いただきたいです。
よろしくお願いします。

環境
・postgreSQL 9.4.26
・PHP 5.3.3
・virtualBox6.1.4 r136177(Qt5.6.2)
・CentOS-6.8-x86_64-minimal.iso

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

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

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

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

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

m.ts10806

2020/03/30 12:43

PDOは試されたのでしょうか。 https://teratail.com/questions/250187 いずれにしても「PHP介さずDBに対して直接実行して想定の結果が返ってくるSQL」であることが前提です。PHPの前にPostgreSQLに対して直接実行して確認して、確証とれたSQLを使ってください。 前も聴いたかもしれません、PHP 5.3.3という古すぎる環境はどうにもなりませんか?
退会済みユーザー

退会済みユーザー

2020/03/30 12:45 編集

そもそも、接続できてなくて、$con = FALSE; だったりしませんか。FALSEでないとすると、SQL文字列をvar_dump()させて、それを直接PostgreSQLに例えばpsqlコマンド上やphpPgAdmin上で与えるとどうなりますか。
y_programming

2020/03/30 12:56

さっそくの書き込みありがとうございます、 ご指摘の通り、PHP経由でなく、まず直接DBに対してちゃんと命令が通るか?を確認すべきでした まずはpsql上で直接操作するところから始めます m.ts 様 バージョンに関してはyumでinstallした時に自動で入ったものをそのままにしているだけでして、 こだわりなどはまったく無いです。いい機会なので更新します
退会済みユーザー

退会済みユーザー

2020/03/30 12:59

CentOS系なら、remiレポジトリの追加をすれば最新版PHPも入れられます。 https://rpms.remirepo.net/wizard/
退会済みユーザー

退会済みユーザー

2020/03/30 13:20

なんとなくだが TO_DATE(y.yoyaku_date,'YYYY-MM') TO_DATE('2020-3','YYYY-MM') 上記2つはのぞみのものかえってきてる?
y_programming

2020/04/10 14:37

研修が始まり、このコードをpostgreSQL 8.4で動かす機会があり、原因が判明しました。 「y.yoyaku_date」を 「y.yoyaku_date::text」と書く事によってTO_CHAR()が正常に動きました。 TO_CHAR()がpostgreSQLのバージョン次第で書き方が変わることがあるようです。 asahina1979 様 TO_DATE(y.yoyaku_date,'YYYY-MM') TO_DATE('2020-3','YYYY-MM') のうち前者が動いていなかったようです。 ありがとうございました。 PHPのビルトイン関数とDBMSで相性があるのは気付くのに時間がかかってしまいましたが、 よい経験だったように思います。 P.S. PHPを5から7に変えてみましたが、手元にある大量のPHPファイルの参照渡しが全て動かなくなって しまい、結局PHP5.3.3に戻しました。 そのソース達は恐らく数カ月以内に使う必要がなくなるので、その後にPHP7に上げたいと思います。
guest

回答1

0

ベストアンサー

文字列の連結、しかも、文字列内に変数展開も組み合わせているというのが、
想定外のクエリー文字列になっていたりしないでしょうか。

PHP: pg_prepare - Manual

を駆使してプリペアドステートメントとして安全にクエリーに実行時パラメータを与える方法で組み直してください。
その際、ヒアドキュメント構文も駆使して、
読みやすいSQLクエリーにするとよいかと。

php

1$sql = <<<EOT 2SELECT TO_CHAR(y.yoyaku_date,'YYYY-FMMM-FMDD') AS yoyaku_date, s.sname, y.start_time, y.end_time 3FROM tbl_4_2_1 AS y INNER JOIN tbl_4_2_2 AS s ON y.scode = s.scode 4WHERE TO_DATE(y.yoyaku_date,'YYYY-MM')=TO_DATE($1,'YYYY-MM') 5ORDER BY s.scode,y.start_time,y.end_time; 6EOT; 7$result = pg_prepare($con, 'query', $sql); 8$result = pg_execute($con, 'query', array($year . '-' . $month));

(あくまで机上のコードなので、エラーが出たらご指摘を。)

投稿2020/03/30 12:49

編集2020/03/30 12:56
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

y_programming

2020/04/10 14:38

すみません、他の方の書いたこのコードを動くようにする、というのが 取り組む上での趣旨だった為、今回のクエリを理解していなかったのが主たる原因です。 今回は原因がTO_CHARの仕様だった為なんとか事なきを得ましたが、 SQL文に手を加える必要があったなら、現時点の自分では対処できなかったように思います。 まずはSQLの基礎からですね・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問