学びをアウトプットするblog

このブログでは、プログラミング初心者がruby on rails を用いてアプリを作成していく中で、つまづいたことやどうしたら解決することができたのかを発信しています。

phpでデータベースに接続して値を入れる。

「気づけばプロ並みをp●p」を参考に、ECサイトを作成していました。

フレームワークの勉強もしたかったのですが、スクラッチ開発をすることで、一つ一つの流れを構築していき、ロジックを理解することができると思ったからです。

 

フレームワークに頼り切ってしまうと、応用が効かなくなるという話を聞いたので、スクラッチ開発をもう一度復習も兼ねて学習しようとしていました。

 

ところが、

 

p111の商品を追加する画面を追加し、確認画面pro_add_done.phpで、データベース接続して、

INSERT文でデータを入れようとしましたが、値が入りません。

「気づけばプロ並みをp●p」のソースコードをまるまるコピペしてみましたが、それでもデータが入りません。

その時のコードがこれです。

 

<?php

try {

$pro_name = $_POST['name'];
$pro_price = $_POST['price'];

$pro_name = htmlspecialchars($pro_name, ENT_QUOTES, 'UTF-8');
$pro_price = htmlspecialchars($pro_price, ENT_QUOTES, 'UTF-8');

$dsn = 'mysql:dbname=shop;host=localhost;charset=utf8';
$user = 'root';
$password = '';
$dbh = new PDO($dsn, $user, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$sql = 'INSERT INTO mst_product(name,price) VALUES (?,?)';
$stmt = $dbh->prepare($sql);
$data = $pro_name;
$data = $pro_price;
 
$stmt->execute($data);
$dbh = null;

print $pro_name;
print 'を追加しました。<br />';
} catch (Exception $e) {
print 'ただいま障害により大変ご迷惑をお掛けしております。';
exit();
}

?>

<a href="pro_list.php">戻る</a>

</body>
 

 

ここで、「.$e->getMessage()」をcatch(Exception $e)の

print 'ただいま障害により大変ご迷惑をお掛けしております。'.$e->getMessage();

.$e->getMessage()を挿入してみました。

 

すると

こんなエラー文が

SQLSTATE[HY000]: General error: 1364 Field 'gazou' doesn't have a default value

 

gazouの値が入っていないというエラーだと思われます。

値が入っていなくても、dbにデータを挿入することができるようにするために、調べてみると、

アプリケーション→XAMPP→etc→my.cnf

のファイルの中の
[mysqld] のしたに

sql_mode=NO_ENGINE_SUBSTITUTION

 

を挿入して、サーバーを再起動すると、

 

データがすべて入っていなくても、値を挿入することができました。

f:id:at_at_0209:20200420103640p:plain

 

f:id:at_at_0209:20200420103712p:plain

 

 

日付の表示を必要なところだけ表示したい。

研修申し込みフォームをつくろうとしていたときのこと、

開始時刻と終了時刻を表示させようとしたら、

 

f:id:at_at_0209:20200310105010p:plain

 

        f:id:at_at_0209:20200311085426j:plain

くわしすぎる時刻に。

 

開始時刻 <%= @post.time.strftime('%H:%M') %>
終了時刻 <%= @post.endtime.strftime('%H:%M') %>

 

をこのように追記すると、

 

f:id:at_at_0209:20200311085255p:plain

 

すっきりとした表記になりました。

データベースに初期値を挿入!時のエラー

NameError: uninitialized constant Usersののエラーに対して【ruby on rails】

 

【やりたいこと】

Targetというマイグレーションファイルに初期値を挿入して、データベースに反映させる。

 

データベースに初期値を挿入しようとしました。

seeds.rbにこのように記入。

Targetテーブルのtargetカラムに初任者などの値を作成していこうとしました。

f:id:at_at_0209:20200309180047p:plain

 モデル名.create(カラム名:"○○")

 

rails db:seedコマンドをじっこうしたところ、

 

rails aborted!

Name Error: uninitialized constant Targets

Caused by : NameError: uninitialized constant Targets 


のエラーが発生。 

 

どうやら、

モデル名のTargetsを複数形にしてたことが原因だったようです。

TargetsをTargetの単数形にして再度 rails db:seed を実行

f:id:at_at_0209:20200309184745p:plain

 

f:id:at_at_0209:20200309184220p:plain

 値を入れることができました。

rails db:rollbackしたあとなども、データが消えるので、db:rollbackしたあとは

rails db:seedを忘れずにしよう!

hamlを使って、link_to を文中で使う方法

htmlのことについては、ググってもいろんな記事がでてくるのですが、hamlになると、なかなか見つからず、困ることが多いです。

 

正規表現がどのようなルールなのかも、あまりのっていないので、いろんなページを見ては、試行錯誤をしていました。

 

そして、hamlを使って、サイトをチームで作っている中で、文中にリンクのある文があり、どのようにしたら作れるか戸惑い、なんとか解決でき、感動したので、忘れないようにブログに残しておこうと思います。

 

例えば、こんな感じの文。

 

文中に、リンクがあるよ。

f:id:at_at_0209:20200223204714p:plain

 link_to=のすぐ下に記入した文字にリンクが貼られるということです。

 

 

「登録」のボタンを押すことにより、
%span.bule
= link_to "#" do
に同意したものとみなします

とすると、

f:id:at_at_0209:20200223224130p:plain

 

このようになります。

DB設計をしていて分からなかったbooleanのこと。

ここからは、プログラミングに関して、ネットで調べていても、なかなか出てこなかったことや、つまづいていて、ようやく理解できたことを記していって、忘れないようにと言う意味と、同じようにつまづいた人の一助になればいいなと思って、書いていこうと思います。

 

 

テックエキスパート での内容

1.個人課題(基礎のインプット)

2.応用課題(基礎を生かしてさらに機能を追加してチャットアプリを作成→デプロイ)

3.チーム開発(既存のフリーマーケットサイトを参考にフリーマーケットサイトの作 

 成)

 

フリーマーケットサイトを作成するにあたって、まずはチームでDB(データベース設計)を行いました。

 

今まで作っていたチャットアプリとは違って、テーブルが16個ぐらいになり、大変多くその関係性を考えるのがものすごく大変でした。

 

           f:id:at_at_0209:20200216140106j:plain



でも、それもテーブルに加えるのかと、自分の思考が整理、ブラッシュアップされたところもあったので、難しい課題をチームで考えることができるのはとってもいい機会だったと思います。  

 

その中で、参考にしていたサイト記事の中にで、booleanと言うのがあり、ネットで調べてもヒットするものがなく、そのまま訳してもよく分からないと言う状態でした。

今回はそれがようやくわかったので、ブログに残しておこうと思いました。

 

 

データを残す時には、内容の種類や範囲があります。

例えば、日付はどのような型かというと文字列ではありません。日付の型と言うものがあります。

内容の範囲の中にはデータベースで定義することで、、それに相応しくない値が格納されないようにできるものがあります。

その中の1つがデータ型です。

 

データベースのカラムには型を指定します。

データ型

説明

:integer

符号付き整数

:text

文字列(長い文章)

:string

文字列(短い文字列)

:date

日付

:datetime

日時

:float

浮動小数点数

:boolean

真偽値

 

ずっと分からなかった

「boolean」

true もしくは false

真ですよ もしくは 偽ですよということを示すものということでした。

エラーから学んでいく。

 学習や技術、など身につけようとする時に、アウトプットは欠かせません。

 

 アウトプットをすることによって、自分の知識や技術が定着したり、整理されたりしていき、それがもっとも効率の良いことだからです。

 

 しかし、プログラミングをしていて、何かを制作しようとする時に、必ずといっていいほど、初学者の場合、エラーが出ることがあります。エラーが出た時に、5〜6時間かかっても一向に解決しなかったことはざらにあります。(これについてはもっと早くに解決できる方法(人に聞くなど)できることはあったかもしれません。)

 

 しかし、プログラミングで、エラーを解決するということは、成長につながる大きなチャンスでもあります。

 

 このエラーを解決する時に、私も学習初期のころはエラーの向き合い方で失敗をしていたなと思うことがありました。

 

 1つ目は

 何も考えずに色々とネットに書いていることを試して時間を無駄にしてしまったことです。

 

f:id:at_at_0209:20200216122031p:plain

 

 そんなの当たり前だと思うかもしれないですが、エラーに当たった時って、それをとにかく解決して早く前に進みたいという気持ちも出て来るんですよね。

 最初は自分でこれが原因かなと思って解決を図るんですが、なかなかうまく行かないうちに思考が停止してくるんです。

 

そこから学んだことは、思考停止しそうになったら、「何を解決していきたいのか紙に書いて明確にする」です。

 

 時間を無駄にしていると、時間はあっという間に過ぎ去ってしまいます。

 

2つ目は

詰まったところを、もう一度全てを復習しようとしたことです。

 

例えば、railsで詰まったら、rails全てをわかっていないように捉えてしまって、多くの時間を使って、インプットをしなおしていたことです。

 全てを復習しようとすると、時間を膨大に使ってしまうので、アウトプットに避ける時間がなくなってしまいます。

 そこから、学んだことは、わかっていないところだけをまずは、復習し直すということがいいように思いました。

 

 プログラミングスクールでは、同じ時期に入った人とも大きな差をあけられてしまって自分の学習の仕方を見直すきっかけにもなりました。

 

だから、

1.常に仮説を立てる

2.今何をしているのかをはっきりさせること

3.分からないところだけに絞って復習してみる。

 

この3点はプログラミングを学ぶ上で非常に大切だと思います。

目的をいつも見失わずに、学習でき、アウトプットに時間を避けると力が身についていきます。

 

私自身もこれからもこの姿勢は大事にしていこうと思います。

 

 

プログラミングはアウトプット多めに学習しよう

プログラミングで出てくる言葉にまずは慣れるところから

 プログラミングを学習していて、新しい概念や言葉に出会うことはとても多いです。

例えば

いままで使っていた言葉

 

=(イコール)

 

はイコールではなくて、右の値を左にいれる(代入する)ということなんですね。

何十年もイコールで 左と右が等しいという意味に慣れていた私にとっては、初めは代入するということがなかなか理解できなかった。

 

表になっている行のこともカラム、列のこともレコード、表のタイトルもテーブルと行ったりする。

ここでは、id、titleなどががカラム縦の項目ですね。

レコードがidが2番の人の横の項目です。titleが「先生たちのサッカースクール」、大阪梅田などです。

 

f:id:at_at_0209:20200208082354p:plain



 そういった言葉を初めは覚えたり、慣れたりするのに、時間がかかりました。最初はテキストや本を読んでいても、慣れない言葉が出てきた時に、どういうことだったかなと止まることも多く、それを確認しては次にいくということを繰り返していたため、時間がかかっていました。

 最初はなんでも時間がかかるものなので、そういうものと割り切っておいた方が気持ちも楽かもしれません。

 

 インプットでわかったつもりになりがち

 人間忘れるものが早いものです。特にインプットしたことなんかは自分のものになっていないことも多く、すぐに忘れてしまいます。

f:id:at_at_0209:20200207075836p:plain

エビングハウス忘却曲線


 エビングハウス忘却曲線が示すように、学んだことなんて2日目にはほとんど忘れてしまいます。

 

 その場では、わかっていることも、あとでそれの意味や学んだことを使ってコードを書くように問われた時には、ほとんど何も覚えていないこともしばしばでした。

 

 わたしが、行っていたテックエキスパートでも、「コードの流れや意味はわかるんだけど、書くのはできないな」という言葉は、いろいろな人から出ていましたし、かなり優秀な人からも出ていた言葉でした。 

  

 それでも、まずはインプットをしてからでないと、アウトプットはできないので、

インプット3したら、7アウトプットするというようにしていくと



 成長も早いのではないかと思います。そして、初めは特に、インプットする量が多く、忘れるのも早いものなので、単語帳を使うようにとテックエキスパート では、勧められていました。

 

 紹介しているのは、10個セットで、初めは多いなあと思いましたが、あっという間になくなるほどでした。これを書いては夜寝る前、朝起きたら、見るようにしていました。

  ただ、書いて満足していることもありました。それだとほとんど意味がないので、忘れる前に何回もやってみることが大切です。

 

 エビングハウス忘却曲線が示すように、すぐに忘れてしまうものなので、スピード感も大切にした方がいいです。

 

 そして、単語帳だけをやっている時は、言葉の意味をなんとなくでしか理解できないかもしれません。

 

 それらをアウトプットをしていく中で、定着させることが大切です。

 

f:id:at_at_0209:20200208084117p:plain

ラーニングピラミッド

 学んだことが定着するのは以下のように、能動的になればなるほど、定着すると言われています。

・講義を受ける 5%

・資料や書籍を読む 10%

・視聴覚(ビデオや音声等による学習)20%

実演を見る 30%

他者と議論する 50%

実践による経験、練習 75%

・他者に学んだことを教える 90%

 まさに下から2番目のコードを書いてみて、アウトプットするのが定着するには、効果的なんですね。テックエキスパートでも、学んだことをアウトプットする機会が朝と夕方にあります。

 

 独学で学ぶ人は、ブログで誰かに教えるつもりで アウトプットしていく、もしくはコードを書きまくるのが一番効率がいいと言えます。

 

 そんな感じでどんどんアウトプット量を増やして、一つ一つ定着していきましょう。