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

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

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

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

PHP

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

Q&A

解決済

1回答

905閲覧

validateメソッドが実行されない

hiro4040

総合スコア4

MySQL

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

PHP

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

0グッド

0クリップ

投稿2021/08/06 02:54

**先に質問文を書かせていただいた後に、ソースコードと、実行した際の画像を添付しております。

ーーー起きている問題ーーー
読書ログを作っており、
タイトルを入力せずに登録した場合、もしくは255文字以上で登録した場合、エラーメッセージを表示したいのですが、
ターミナルからタイトルを空で登録を実行したところ、登録が可能で、mysqlから確認しても登録ができてしまいます。

ーーー聞きたいことーーー
2つあります。
ーー1つ目ーー
validate関数、もしくはcreateReview関数の中の、validate関数を呼び出し元で間違いがございますでしょうか?

ーー2つ目ーー
$validated 定義下のif文の条件ですが、元々は、 if (count $($validated) > 0)
という条件式でやっていたのですが、countが指定できるのは配列に対してのみという以下のエラー文が出てきたため、issetで代替しています。
count(): Parameter must be an array or an object that implements Countable

もともとvalidate関数では$errorsという配列に文章を入れているため、何故countが指定できないのかがわかっていません。
issetで代替できることはネットの記事を見つけて知って当てはめているのですが、
私のコードにもこのまま適応可能でしょうか?

以上2点気になっております。

ーー問題解決するために試したこと、考えたことーー
登録自体はできているため、登録する際の変数や連想配列には問題がないと考え、
validateメソッドもしくは、createReview関数の中の、validate関数を呼び出している$validatedの箇所に問題があるのかと思い英文字の打ち間違いなど確認しましたが、
間違いが見つけられなかったためこちらで質問させていただきました。

以下、ソースコードを貼らせていただきます

php

1コード 2<?php 3 4$link = dbConnect(); 5$valuation = []; 6$reviews = []; 7 8 9function validate($valuation) 10{ 11 $errors = []; 12 //書籍名が正しく入力されているかチェック 13if (!strlen($valuation['title'])) { 14 $errors['title'] = '書籍名を入力してください'; 15} elseif (strlen($valuation['title']) > 255) { 16 $errors['title'] = '書籍名は255文字以内で入力してください'; 17 return $errors; 18} 19} 20 21function dbConnect() { 22 $link = mysqli_connect('db', 'book_log', 'pass', 'book_log'); 23 if (!$link) { 24 echo 'データベースに接続できませんでした' . PHP_EOL; 25 echo 'debugging_error: ' . mysqli_connect_error() . PHP_EOL; 26 exit; 27 } 28 echo 'データベースに接続できました' . PHP_EOL; 29 30 return $link; 31} 32 33 34 35function createReview($link) 36{ 37 echo '書籍名:'; 38 $valuation['title'] = trim(fgets(STDIN)); 39 40 echo '著者名:'; 41 $valuation['writer'] = trim(fgets(STDIN)); 42 43 echo '読書状況(未読、読んでる、読了):'; 44 $valuation['status'] = trim(fgets(STDIN)); 45 46 echo '評価(1~5):'; 47 $valuation['$score'] = trim(fgets(STDIN)); 48 49 echo '感想:'; 50 $valuation['$thoughts'] = trim(fgets(STDIN)); 51 52 53 $validated = validate($valuation); 54 if (isset($validated)) { 55 foreach($validated as $error) { 56 echo $error . PHP_EOL; 57 } 58 return; 59 } 60 61 $sql = <<<EOT 62INSERT INTO book_log ( 63 title, 64 writer, 65 status, 66 score, 67 thoughts 68) VALUES ( 69 "{$valuation['title']}", 70 "{$valuation['writer']}", 71 "{$valuation['status']}", 72 "{$valuation['$score']}", 73 "{$valuation['$thoughts']}" 74) 75EOT; 76 77 $result = mysqli_query($link, $sql); 78 if ($result) { 79 echo '登録が完了しました' . PHP_EOL . PHP_EOL; 80 } else { 81 echo 'データの追加に失敗しました' . PHP_EOL; 82 echo 'debuggingError: ' . mysqli_error($link) . PHP_EOL . PHP_EOL; 83 } 84} 85 86 87function displayReview ($reviews) { 88 echo '読書ログを表示します' . PHP_EOL . PHP_EOL; 89 90 foreach ($reviews as $review) { 91 echo '書籍名:' . $review['title'] . PHP_EOL; 92 echo '著者名:' . $review['writer'] . PHP_EOL; 93 echo '読書状況:' . $review['status'] . PHP_EOL; 94 echo '評価:' . $review['score'] . PHP_EOL; 95 echo '感想:' . $review['thoughts'] . PHP_EOL; 96 echo '-----------------' . PHP_EOL; 97 } 98} 99 100 101 102while (true) { 103 echo '1.読書ログを登録' . PHP_EOL; 104 echo '2.読書ログを表示' . PHP_EOL; 105 echo '9.読書ログを終了' . PHP_EOL; 106 echo '番号を選択してください(1,2,9) :'; 107 $num = trim(fgets(STDIN)); 108 109 if ($num === '1') { 110 //複数登録 111 createReview($link); 112 } elseif($num === '2') { 113 //読書ログを表示 114 displayReview($reviews); 115 } elseif($num === '9'){ 116 mysqli_close($link); 117 echo 'データベースとの接続を切断しました' . PHP_EOL; 118 break; 119 } 120}

登録、ターミナル 実行
mysqlより登録確認

以上ご教授いただければ幸いです。
また、私自身プログラミング初心者であり、質問の仕方があまり上手くわかっておりません。上記の質問で何か理解が難しい点、失礼な点がございましたら誠に申し訳ございません。

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

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

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

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

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

guest

回答1

0

ベストアンサー

validate関数が255文字超のときかreturn $errorsしていませんね
$errors['title']が空のときや問題がないときの戻り値がありません

なおmysqliであってもprepareで処理して下さい

投稿2021/08/06 03:48

yambejp

総合スコア114775

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

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

hiro4040

2021/08/06 04:03

回答ありがとうございます。 仰る通り、if文の中にreturnを書いていて、 全体のreturn $errors ができていない状態でした。訂正したところ問題なく実行できました。 mysqli_queryとしているところのことでしょうか、そのような指定方法もあり、役割が少し違うのですね。prepareについてももう少し調べてみます。 とても早い回答で大変助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問