- 投稿日:2020-05-22T23:41:12+09:00
XAMPPでLaravel開発環境構築
XAMPPを使って、Laravel開発環境を構築します。
以下のサイトから、Windows向けのXAMPPをダウンロードします。
https://www.apachefriends.org/jp/download.html
私の環境では、[PHP 7.3.18]を使用しました。
ダブルクリックしてインストールを行います。
このとき、からパスを変更しないほうが良いです。インストールが完了したら、
を起動しましょう。XAMPP Control Panelが立ち上がったら、さっそくApacheを起動してみます。
Apacheの[Start]ボタンをクリックしてみましょう。
次に、[Admin]ボタンをクリックすると、ブラウザが立ち上がります。
Skypeを入れていると、エラーが発生し、立ち上がらないことがあります。
Skypeが80、443ポートを使用しているために、既に使われているとエラーが発生し立ち上がらないことがあります。
この解決策は、Apacheの[Config]ボタンをクリックして、[Apache(httpd.conf)]の修正が必要です。エディターで起動してみましょう。
修正箇所は2か所です。
①Listen 80
②ServerName localhost:80
ポートを80以外に変更します。
今回は8081に変更しました。では、再度[Start]して[Admin]から、起動を確認しましょう。
ブラウザが立ち上がり、エラーとなりました。
URLをhttp://localhost/ → http://localhost:8081/に変更して確認したところ
正常に立ち上がっていることを確認しました。では、Laravelでプロジェクトを構築します。
コマンドプロンプトを開いてください。
[cd ]と入力し、ルートに移動します。
次に[cd xampp\htdocs]に移動します。composerを使用して、プロジェクトを作成します。
composer create-project laravel/laravel --prefer-dist {作成するプロジェクト名}
と入力してEnterしてください。
5分程度かかりますので、そのままお待ちください。
Successと表示されたら、成功です。次に、エクスプローラからをエディターで開きます。
DocumentRootとDirectoryを設定します。DocumentRoot "/xampp/htdocs/{作成済プロジェクト名}/public"
保存して、同様にxampp Control Panelから[Admin]を起動してみましょう。
Laravelの画面が表示されたらOKです。次は、XAMPP Control PANELからMySQLのAdminボタンをクリックして、MySQLを起動します。
ポートを変更していますので、エラーが出るようでしたら、
http://localhost:8081/phpmyadmin/
と入力しなおしてください。(ポートはご自身の環境に合わせて)左側のツリーから新規作成ボタンをクリックしてデータベースを作成します。
DB名称は作成済のプロジェクトに合わせて名称を入力します。
文字コードは[utf8-general-ci]を選択しました。
最後に作成ボタンをクリックして終了です。.envファイルの設定も必要です。
エクスプローラからに移動します。
その下に保存されている<.env>ファイルをエディターで開きます。
そして、以下の設定を変更します。
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306 ←MySQLのデフォルト
DB_DATABASE=作成したデータベース名
DB_USERNAME=root ←デフォルト
DB_PASSWORD= ←デフォルト次に1行目のAPP_NAMEも設定してください。
デフォルトの表示言語を変更します。
初期は英語で表示されていますので、日本語に設定する際は、
をエディターで開き、以下の2か所を修正します。
① 'locale' => 'en', → 'locale' => 'ja',
② 'timezone' => 'Asia/Tokyo',では、起動を確認してみましょう。
Apacheを一度[Stop]してから[Start]して[Admin]から確認をしてください。
Laravelが表示されれば、成功です。
- 投稿日:2020-05-22T23:12:17+09:00
ボタンを押した時に処理を実行させたい時
今回は投稿内容を編集し、編集完了ボタンを押したらdbの投稿内容を書き換える(更新する)というもの
if文で条件を指定してからデータベースへアクセスし書き換えるという流れ
<?php
/ post_rewriteはinputタグのname属性/if(isset($POST['post_rewrite'])){
$statement = $db->prepare('UPDATE posts SET message=? WHERE id=?');
$statement->execute(array($SESSION['message'],$SESSION['postsid']));
?>HTML文(ボタンの部分のみ)
これで修正完了するボタンを押すとphpが処理される
- 投稿日:2020-05-22T22:44:50+09:00
大阪府のコロナ追跡システムを考えてみる3
大阪府のコロナ追跡システムの開発費が80万円以内、14日間で納めるシステム開発続き。
初めての方は1からご覧ください。詳細設計(内部設計)
DFD(データフロー図)とデータベース設計書を作成する。
登録画面設計
Htmlを用いて事業者ごとに登録画面を作成する。
データベース設計(covid.db)
事業者管理テーブル(store)
名前 カラム名 データ型 制約 事業者ID Store_id char Primary,Not NULL 事業者名 Store_name varchar Not NULL 登録日 Reg_date date Not NULL 来客管理テーブル(visiter)
名前 カラム名 データ型 制約 来客ID Vis_id char Primary,Not NULL, AUTO_INCREMENT 事業者ID Store_id char Foreign,Not NULL メールアドレス Address varchar Not NULL 来店日 Vis_date Timestamp Not NULL QRコード作成システム設計
URL(https://covid-19tsuuchi.com/Store_ID) をQRコードとして発行してする。
通知システム
感染者の情報を受けたら、来客テーブルを基に接触可能性がある者に通知する。
通知のフローは以下のフローチャートに従う。まとめ
運用でカバーという言葉は好きではないですが、そうなりそうですね。
次回はプログラミングに入ります。先に宣言しますが、テストはしません。※筆者のPCが絶賛故障し、新しいPCの到着を待っている状態のため、一度休止とする。
残りはhtmlでページ作成とDB作成程度であるが、現在iPadしかないため、そこまでするのは難しい。ここまで書いた結論としては、予算80万でも意外とイケそう。である。
- 投稿日:2020-05-22T14:29:02+09:00
XAMPPのmysqlを起動できないエラー
いつものようにxamppを起動しようとしたところ、apcheは起動できるのにmysqlは起動できない。検索してmy.iniのportの部分を3306から3308にしたりもしたけど解決しない。
エラーログを見たところ、次のような記述がありました。2020-05-22 14:00:03 0 [ERROR] c:\xampp\mysql\bin\mysqld.exe: unknown variable 'default-character-set=cp932'
そういえば前回xamppを使った時、データベースに入れたデータを日本語で表示させたくて’default-character-set=utf8’をmy.iniの中の何か所に書いた。結果的にこれでデータベースの内容が日本語になることはなかったものの、元に戻し忘れていた。
default-character-set=utf8の前に#を付けることで解決
……と思いきや、いざ起動してmysql -u rootと打ち込むと、以下のようなエラーが。
ERROR 2002 (HY000): Can't connect to MySQL server on 'localhost' (10061)
少し調べた結果、ポート番号などが関係している模様。
mysqlが起動できなかった時に書き換えたmy.iniの port = 3308 を port = 3306 に戻す。
すると無事解決しました。今回の教訓:試しても効果の得られなかった解決法はきちんと元の状態に戻しておくこと。
- 投稿日:2020-05-22T12:56:39+09:00
ElixirでMySQLを使う #2(Ecto/マイグレーション〜スキーマ作成〜カラム修正)
概要
の続きです。
前回、ElixirでEcto
を介してMySQLに接続し、データベースを作成しました。
- 本記事では、マイグレーション〜スキーマ作成の実装から行っていきます。
- また、Ectoで実際にレコードをMySQLに食わせていきます。
- オマケ的に、Ectoによるテーブルカラム修正の実装も行っていきます。
なお、本記事シリーズにおける実行環境等については、前回の記事をご参照ください。
マイグレーション〜テーブル作成
Ectoでマイグレーションを実行していきます。
マイグレーションをつくることで、データベース内のテーブル及びインデックスの作成や更新をする仕組みを整えていきます。
terminal$ mix ecto.gen.migration create_people * creating priv/repo/migrations * creating priv/repo/migrations/20200521003013_create_people.exspriv/repo/migrations/20200521003013_create_people.exsdef change do create table(:people) do --> add add :first_name, :string --> add add :last_name, :string --> add add :age, :integer --> add end endデータ型の定義を行いました。
ちなみに、デフォルト値の設定やNOT NULL(NIL)などバリデーション関係は書いていませんが、一旦このまま進めます。
(NOT NULL制約の適用修正については後述します)
mix ecto.migrate
を実行します。terminal$ mix ecto.migrate 09:32:21.356 [info] == Running 20200521003013 Friendsmysql.Repo.Migrations.CreatePeople.change/0 forward 09:32:21.358 [info] create table people 09:32:21.370 [info] == Migrated 20200521003013 in 0.0sテーブル
people
が作成できました!結果確認(MySQL)
この時点で、念のためデータベースの状況をMySQL側で確認してみます。
terminal(MySQL)mysql> show tables; +-----------------------------+ | Tables_in_friendsmysql_repo | +-----------------------------+ | people | | schema_migrations | +-----------------------------+ 2 rows in set (0.00 sec) mysql> desc people; +------------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+---------------------+------+-----+---------+----------------+ | id | bigint(20) unsigned | NO | PRI | NULL | auto_increment | | first_name | varchar(255) | YES | | NULL | | | last_name | varchar(255) | YES | | NULL | | | age | int(11) | YES | | NULL | | +------------+---------------------+------+-----+---------+----------------+ 4 rows in set (0.00 sec)テーブル
people
がデータベースに入ってます。スキーマ作成
つづいて、
Ecto.Scheme
のセッティングをしていきます。Scheme(スキーマ)は、データベースのデータをElixirで表現したものにあたり、データベースのテーブルに関連付けがされます。
実装は以下の通りです。
lib/friends/person.exdefmodule Friendsmysql.Person do use Ecto.Schema schema "people" do field :first_name, :string field :last_name, :string field :age, :integer end endレコード作成(Create)〜MySQLにデータを渡す
それでは、以下の手順でElixir側からMySQL側へレコードを渡してみます。
IEx
で実行します。terminal$ iex -S mix iex(1)> person = %Friendsmysql.Person{age: 28} %Friendsmysql.Person{ __meta__: #Ecto.Schema.Metadata<:built, "people">, age: 28, first_name: nil, id: nil, last_name: nil } iex(2)> Friendsmysql.Repo.insert(person) 09:39:55.834 [debug] QUERY OK db=0.9ms decode=0.8ms queue=1.8ms idle=321.1ms INSERT INTO `people` (`age`) VALUES (?) [28] {:ok, %Friendsmysql.Person{ __meta__: #Ecto.Schema.Metadata<:loaded, "people">, age: 28, first_name: nil, id: 1, last_name: nil }}
person = %Friendsmysql.Person{age: 28}
で、personという人のデータをつくり、insert()
でデータをDBテーブルに渡しました。つづけて、もう1レコード用意してみます。
先ほどのpersonさんはage: 28
だけで、first_name
とlast_name
を持たない名無しの方だったので、こんどはfirst_name
とlast_name
を持ってる人のデータで実行します。iex(3)> im = %Friendsmysql.Person{first_name: "im", last_name: "miolab", age: 28} %Friendsmysql.Person{ __meta__: #Ecto.Schema.Metadata<:built, "people">, age: 28, first_name: "im", id: nil, last_name: "miolab" } iex(4)> Friendsmysql.Repo.insert(im) 09:42:41.351 [debug] QUERY OK db=1.5ms queue=1.6ms idle=1841.3ms INSERT INTO `people` (`age`,`first_name`,`last_name`) VALUES (?,?,?) [28, "im", "miolab"] {:ok, %Friendsmysql.Person{ __meta__: #Ecto.Schema.Metadata<:loaded, "people">, age: 28, first_name: "im", id: 2, last_name: "miolab" }}結果確認(MySQL)
terminal(MySQL)mysql> select * from people; +----+------------+-----------+------+ | id | first_name | last_name | age | +----+------------+-----------+------+ | 1 | NULL | NULL | 28 | | 2 | im | miolab | 28 | +----+------------+-----------+------+ 2 rows in set (0.00 sec)
first_name
、last_name
、age
、すべて持っている人のデータが登録されました。おまけ: テーブルカラムの修正(NOT NULL制約を追加)
ところで、名前が
NULL
の人をinsertできることに関して気持ちがよくないので、NOT NULL
制約を適用しておきます。
apply_notnull_to_names
という名前で、マイグレーションファイルを新しく作ります。terminal$ mix ecto.gen.migration apply_notnull_to_names * creating priv/repo/migrations/20200522004701_apply_notnull_to_names.exs以下のようにコード記述します。
priv/repo/migrations/20200522004701_apply_notnull_to_names.exsdef change do alter table(:people) do --> add modify :first_name, :string, null: false --> add modify :last_name, :string, null: false --> add end endなお、さきほど一番はじめにデータベースへ登録された「名前がNULLの人」は、MySQL側でdeleteしておきます。
terminal(MySQL)mysql> delete from people where id="1"; Query OK, 1 row affected (0.00 sec)ここまで準備が整ったら、
mix ecto.migrate
します。terminal$ mix ecto.migrate 09:54:06.756 [info] == Running 20200522004701 Friendsmysql.Repo.Migrations.ApplyNotnullToNames.change/0 forward 09:54:06.758 [info] alter table people 09:54:06.899 [info] == Migrated 20200522004701 in 0.1s impc:friendsmysql im$ iex -S mix Erlang/OTP 22 [erts-10.5.3] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [hipe]結果確認(MySQL)
MySQL側で、
first_name
とlast_name
へのNOT NULL適用変更が反映されているか見てみます。terminal(MySQL)mysql> desc people; +------------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+---------------------+------+-----+---------+----------------+ | id | bigint(20) unsigned | NO | PRI | NULL | auto_increment | | first_name | varchar(255) | NO | | NULL | | | last_name | varchar(255) | NO | | NULL | | | age | int(11) | YES | | NULL | | +------------+---------------------+------+-----+---------+----------------+ 4 rows in set (0.00 sec)変更されていることを確認できました。
MySQLにデータを渡す(NOT NULL制約適用後)
ふたたび
IEx
で、MySQLにデータを投げてみます。まずは失敗パターン想定で、先ほどと同じ名無しのpersonさんで実行してみます。
terminaliex(1)> person = %Friendsmysql.Person{age: 28} %Friendsmysql.Person{ __meta__: #Ecto.Schema.Metadata<:built, "people">, age: 28, first_name: nil, id: nil, last_name: nil } iex(2)> Friendsmysql.Repo.insert(person) 09:55:02.022 [debug] QUERY ERROR db=10.6ms queue=2.2ms idle=145.0ms INSERT INTO `people` (`age`) VALUES (?) [28] ** (MyXQL.Error) (1364) (ER_NO_DEFAULT_FOR_FIELD) Field 'first_name' doesn't have a default value (ecto_sql) lib/ecto/adapters/myxql.ex:242: Ecto.Adapters.MyXQL.insert/6 (ecto) lib/ecto/repo/schema.ex:661: Ecto.Repo.Schema.apply/4 (ecto) lib/ecto/repo/schema.ex:263: anonymous fn/15 in Ecto.Repo.Schema.do_insert/4ぶじ失敗を確認できました。
first_name
を持たないため、errorで弾かれています。つづいて、成功パターン想定でデータinsertを実行します。
terminaliex(2)> ryan_bigg = %Friendsmysql.Person{first_name: "Ryan", last_name: "Bigg"} %Friendsmysql.Person{ __meta__: #Ecto.Schema.Metadata<:built, "people">, age: nil, first_name: "Ryan", id: nil, last_name: "Bigg" } iex(3)> Friendsmysql.Repo.insert(ryan_bigg) 09:55:11.713 [debug] QUERY OK db=1.3ms queue=0.7ms idle=1849.1ms INSERT INTO `people` (`first_name`,`last_name`) VALUES (?,?) ["Ryan", "Bigg"] {:ok, %Friendsmysql.Person{ __meta__: #Ecto.Schema.Metadata<:loaded, "people">, age: nil, first_name: "Ryan", id: 3, last_name: "Bigg" }}こんどは問題なく登録できました。
結果確認(MySQL)
terminal(MySQL)mysql> select * from people; +----+------------+-----------+------+ | id | first_name | last_name | age | +----+------------+-----------+------+ | 2 | im | miolab | 28 | | 3 | Ryan | Bigg | NULL | +----+------------+-----------+------+ 2 rows in set (0.00 sec)終わり & 次回
マイグレーション〜スキーマ作成を行って、Elixir側からデータをMySQLに渡すことができました。
また、Ectoを介してちょっとしたテーブルカラムの修正も行いました。次回は、ElixirでのCRUD操作(データ作成・読み出し・更新・削除)を、Ectoのクエリを書いて実行していきます。