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

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

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

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

Q&A

解決済

3回答

1693閲覧

データベースから受け取った値の中に任意の値が含まれているかで条件分岐いたい

fjok

総合スコア2

PHP

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

0グッド

0クリップ

投稿2020/10/22 09:06

前提・実現したいこと

(例)PHPで予約システムもどきを作っています。
予約月・日・時間・氏名など入力・送信でデータベース(mariadb)に格納までは出来ています。
次にデータベースから既に予約済みの時間帯を受け取って該当枠の時間帯に「予約済み」と表示したい。

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

9時~ の部分は下記コードの2個目の<?php ?>部分でデータの取得を確認のため表示
3個目の<?php ?>で取得したデータに「9」が含まれれば「予約済み」、含まなければ「9:00~」と表示させたいが以下のようなエラーメッセージ。

・・・・・・・・・・・・・・・・・・・・

9時~:yamauchi
10時~:指原 莉乃
11時~:慎太郎
16時~:茂貴

Notice: Trying to access array offset on value of type bool in C:\xampp\htdocs\php_lesson\abc.php on line 20

Warning: Use of undefined constant ture - assumed 'ture' (this will throw an Error in a future version of PHP) in C:\xampp\htdocs\php_lesson\abc.php on line 20

Warning: in_array() expects parameter 2 to be array, null given in C:\xampp\htdocs\php_lesson\abc.php on line 20
9:00~

該当のソースコード

言語:PHP

<?php $dsn = 'mysql:dbname=reserve;host=localhost'; $user = '****'; $password = '********'; $dbh = new PDO($dsn, $user, $password); ?> <?php $sql = 'select timetable, name from reserveday where month = ? AND day = ? order by timetable'; $stmt = $dbh->prepare($sql); $stmt->execute(array(10, 2)); while($result = $stmt->fetch(PDO::FETCH_ASSOC)){ print($result['timetable']."時~".":"); print($result['name'].'<br>'); } ?> <?php if (in_array(9, $result['timetable'], ture)){ echo "予約済み"; }else{ echo "9:00~"; } ?>

試したこと

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

DB・サーバーは、ローカルを使用しています。

xammpバージョン 3.2.4
atom
PHPバージョン:PHP7.0.x

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

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

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

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

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

guest

回答3

0

エラーを読めば分かることも多いかと思います。

Notice: Trying to access array offset on value of type bool

注意:bool型の値で配列オフセットにアクセスしようとしています


Warning: Use of undefined constant ture - assumed 'ture' (this will throw an Error in a future version of PHP)

警告:未定義の定数tureの使用-想定される 'ture'(これはPHPの将来のバージョンでエラーをスローしま
す)


Warning: in_array() expects parameter 2 to be array, null given

警告:in_array()は、パラメーター2が配列であると想定しています。nullが指定されています

エラーメッセージの読み方と対処, 検索や質問の原則

いずれも「なぜエラーが出ているか」原因が書いてありますね。

あとは使っている機能をドキュメントで確認する。

in_array

in_array — 配列に値があるかチェックする
in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] ) : bool

以上のことから、

  • 第2引数がarray(配列)になっていない
  • 第3引数はbool(真偽値)になっていない

ということが推察されます。

$result['timetable']配列ですか?
tureって真偽値ですか?

というところを詰めていくと、「そもそもin_arrayでいいの?」ということにもなってくるのではないでしょうか。


テーブル定義とデータ及びDBとそのバージョン次第ですが、SQLだけでもやりきれそうに思います。

case構文というのがあるので、分岐させられないこともないのでは。(今回の要件にあうかどうかは現時点では他者には判断できません)

投稿2020/10/22 10:07

編集2020/10/22 10:08
m.ts10806

総合スコア80875

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

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

fjok

2020/10/22 12:09

お付き合いいただきましてありがとうございます。 あちゃー!書き間違い・・・。 trueにしましたが、ダメでした。
m.ts10806

2020/10/22 12:13

私はそこだけに言及してません。 「実装自体を検討する必要がある」という話をしています。
m.ts10806

2020/10/22 12:14

「質問への追記修正依頼」で依頼してますが、コードのマークダウン対応お願いしますね。質問は編集できます。 あとxammp→XAMPPとか細かいところで色々と間違えています。 PHP7.0もサポート終わっているバージョンなので最新使ったほうが良いです。
fjok

2020/10/22 12:29

確かに、私自身、$result['timetable']が配列で受け取れているかわからなく・・・。 ここ10日間ぐらいネットでいろいろ検索したなかに配列として受け取る方法とし「$result = $stmt->fetch(PDO::FETCH_ASSOC」が、一番それっぽかったもので。 他にはscriptでアプローチする方法もあったりincludes()を使うみたいなのもあったのでが、よくわからず。 初心者ですみません。
m.ts10806

2020/10/22 12:31

>$result['timetable']が配列で受け取れているかわからなく・・・。 デバッグしてください。 var_dump(確認したい変数等);
guest

0

自己解決

任意の値で条件分岐するアプローチはあきらめ、値があるかないかで条件分岐することにしました。
目的のtimetableで条件分岐して「予約済み」と出来きましたのでこの質問はクローズで結構です。
本番では、$stmt->execute(array(10, 2, 9));の「10」「2」は、$month、$dayをpostで受け取って分岐できことも確認できました。
ありがとうございました。
ホスピタリティの相性が合わないので退会します。

<?php $dsn = 'mysql:dbname=reserve; host=localhost'; $user = '×××××××'; $password = '*******'; $dbh = new PDO($dsn, $user, $password); ?> <?php $sql = 'select timetable from reserveday where month = ? AND day = ? and timetable = ?'; $stmt = $dbh->prepare($sql); $stmt->execute(array(10, 2, 9)); $result = $stmt->fetch(PDO::FETCH_ASSOC); if (empty($result)){ echo "9:00~"; }else{ echo "予約済み"; } ?>

投稿2020/10/24 11:48

fjok

総合スコア2

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

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

0

単純な誤記かと。
ture→true

投稿2020/10/22 09:13

Gak

総合スコア83

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問