**先に質問文を書かせていただいた後に、ソースコードと、実行した際の画像を添付しております。
ーーー起きている問題ーーー
読書ログを作っており、
タイトルを入力せずに登録した場合、もしくは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}
以上ご教授いただければ幸いです。
また、私自身プログラミング初心者であり、質問の仕方があまり上手くわかっておりません。上記の質問で何か理解が難しい点、失礼な点がございましたら誠に申し訳ございません。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/06 04:03