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

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

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

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

PHP

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

Q&A

解決済

3回答

2010閲覧

MySQLの二つのテーブルをselect

Z-TALBO

総合スコア525

MySQL

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

PHP

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

0グッド

0クリップ

投稿2016/03/04 03:34

tablename = fulltime
tablename = parttime

上記のように一つのDB内に二つのtableがあるとします。

PHP

1// connectDb()の関数を作成してあります。 2require_once('config.php'); 3 4// fulltimeのselect 5$dbh = connectDb(); 6$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 7$stmt = $dbh->prepare("SELECT * FROM fulltime"); 8$stmt->execute(); 9while ($row = $stmt->fetch()) : 10?> 11※省略 12<?php endwhile; ?> 13 14// parttimeのselect 15$dbh = connectDb(); 16$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 17$stmt = $dbh->prepare("SELECT * FROM parttime ORDER BY DESC limit 10"); 18$stmt->execute(); 19while ($row = $stmt->fetch()) : 20?> 21※省略 22<?php endwhile; ?>

間にいろいろHTMLもありますが、、、一つのファイル(例えばindex.php)にこれも例えばですが、左にfulltime、右にparttimeと表示させようとしたときに、fulltimeに関しては問題なかったのですが、parttimeに関してはエラーが出ました。

エラー内容

Fatal error: Uncaught Error: Call to a member function execute() on boolean in C:○○/○○/index.php:○○ Stack trace: #0 {main} thrown in

いろいろ検索はしてみましたが、、、解決策がわからず、、、

connectDb()をもうfulltimeで使ってしまっているから、使えないのかな?
と思ったんですが、そういうことでしょうか?

そうであれば、解決策としては??という感じです。

よろしくお願いします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

connectDb()が何を返しているのかわかりませんが、文脈からPDOであろうと推測します。

エラーの直接的な原因はprepare()に失敗してfalseが返っているためです。

テーブルそれぞれが同じデータベース内にあるなら、2回目の
$dbh = connectDb();
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
は不要ですね。

それからSQLを再利用しない、かつリテラルで固定ならprepare()を使わず、
$dbh->query('SQL文')
の方が簡潔かなと思います。
参考 PHP PDO::query

投稿2016/03/04 04:02

編集2016/03/04 04:04
dupont_kedama

総合スコア925

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

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

Z-TALBO

2016/03/04 05:35

解答ありがとうございます! 質問の内容に不足があり、申し訳ございません! 二行を消した(コメント)のも、試していたのですが、特に変化は無かったのです。 また検証してみます!
dupont_kedama

2016/03/04 05:41 編集

SQL文が SELECT * FROM parttime ORDER BY DESC limit 10 になってるのですが、ORDER BY 列名 DESC であるべきです。 prepare()したときにDBサーバーに評価問い合わせが飛び、syntaxエラーが返されてprepare()が失敗しているのかもしれません。
Z-TALBO

2016/03/04 07:30

大変!申し訳ない! なんという初歩の初歩なミスでしょう、、、何をdesc順にするのか? そこが抜けていただけでした、、、
guest

0

全然試してないので、もしかしたら的外れかもしれませんが…

>connectDb()をもうfulltimeで使ってしまっているから、使えない
…のだとすると、parttimeに使っている方の変数「$dbh」を別の名前にしてしみてはいかがでしょう?

投稿2016/03/04 03:46

takushi168

総合スコア228

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

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

Z-TALBO

2016/03/04 03:53

解答ありがとうございます! 私ももしかしたらと思ってやってみたのですが、変わらなかったんです、、、 もう一度検証してみます。
guest

0

$stmt変数が同じだからじゃありませんか?

追記
コード読み間違いました。失礼しました。

投稿2016/03/04 05:22

編集2016/03/04 05:33
JinwonKim

総合スコア312

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問