20200522のMySQLに関する記事は5件です。

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が表示されれば、成功です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ボタンを押した時に処理を実行させたい時

今回は投稿内容を編集し、編集完了ボタンを押したら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が処理される

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

大阪府のコロナ追跡システムを考えてみる3

大阪府のコロナ追跡システムの開発費が80万円以内、14日間で納めるシステム開発続き。
初めての方は1からご覧ください。

詳細設計(内部設計)

DFD(データフロー図)とデータベース設計書を作成する。

DFD
20753BFF-5B9F-428B-BB2B-A30F5D51651D.jpeg
事業者情報ばっかり。。。

登録画面設計

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コードとして発行してする。

通知システム

感染者の情報を受けたら、来客テーブルを基に接触可能性がある者に通知する。
通知のフローは以下のフローチャートに従う。

C1863FCC-6722-48BB-90D1-0DFDACF88792.jpeg

まとめ

運用でカバーという言葉は好きではないですが、そうなりそうですね。
次回はプログラミングに入ります。先に宣言しますが、テストはしません。

※筆者のPCが絶賛故障し、新しいPCの到着を待っている状態のため、一度休止とする。
残りはhtmlでページ作成とDB作成程度であるが、現在iPadしかないため、そこまでするのは難しい。

ここまで書いた結論としては、予算80万でも意外とイケそう。である。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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 に戻す。
すると無事解決しました。

今回の教訓:試しても効果の得られなかった解決法はきちんと元の状態に戻しておくこと。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ElixirでMySQLを使う #2(Ecto/マイグレーション〜スキーマ作成〜カラム修正)

概要

の続きです。
前回、ElixirEctoを介してMySQLに接続し、データベースを作成しました。

  • 本記事では、マイグレーション〜スキーマ作成の実装から行っていきます。
  • また、Ectoで実際にレコードをMySQLに食わせていきます。
  • オマケ的に、Ectoによるテーブルカラム修正の実装も行っていきます。

なお、本記事シリーズにおける実行環境等については、前回の記事をご参照ください。

マイグレーション〜テーブル作成

Ectoでマイグレーションを実行していきます。

マイグレーションをつくることで、データベース内のテーブル及びインデックスの作成や更新をする仕組みを整えていきます。

terminal
  $ mix ecto.gen.migration create_people
  * creating priv/repo/migrations
  * creating priv/repo/migrations/20200521003013_create_people.exs
priv/repo/migrations/20200521003013_create_people.exs
  def 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.ex
  defmodule 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_namelast_nameを持たない名無しの方だったので、こんどはfirst_namelast_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_namelast_nameage、すべて持っている人のデータが登録されました。

おまけ: テーブルカラムの修正(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.exs
  def 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_namelast_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さんで実行してみます。

terminal
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: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を実行します。

terminal
iex(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のクエリを書いて実行していきます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む