主キーがあればphpPgAdminで編集できる

 

PhpPgAdminって便利ですよね。

でも、私はたまに以下のことを感じていました。

各レコードの編集/削除が出来るときと出来ないときがある。

この違いなんだ?

 

 

そこでタイミングよく、敏腕上司が教えてくれました。

 

上司「主キーがあればレコード識別ができるから、GUIで編集/削除できる」

 

私「すんごい!本当だー!しらなかったー!さすが●●さん!」

ちょっと考えると、当たり前のことだなと理解しましたwww

 

上司「ブログのネタにできるね」

 

以上、こんな会話がありました。早速ネタにします。

ありがとう●●さん。

 

 

そこで自分でいろいろ試してみました。

参考:https://www.postgresql.jp/document/9.4/html/ddl-constraints.html

 

その前に、、、

データベースは整合性を保つための整合性制約があります。

<整合性制約>

・一意性制約(ユニーク制約)

・参照制約(外部キー制約)

・非NULL制約(NOT NULL制約)

の3つがあります。

 

 

私「主キーはユニークだから一意性制約か!じゃあ、uniquであればいいのか!」

いつも通り、先走る私。

CREATE TABLE id_unique_table(
 id integer UNIQUE,
 name text
);

INSERT INTO id_unique_table
VALUES(1, test1);
INSERT INTO id_unique_table
VALUES(2, test2);
INSERT INTO id_unique_table
VALUES(3, test3);
INSERT INTO id_unique_table
VALUES(NULL, 'null');

 

一意性制約のマーク(「1」)が付いています

ユニークなテーブルの定義

ユニークでNOTNULLなテーブルのデータ

 

ん?

id=NULLのところは編集/削除できんやーん><

 

 

ってことは….NOT NULLも必要なのか!

さっきのCREATE TABLE文に非NULL制約を追加

CREATE TABLE id_not_null_unique_table(
 id integer UNIQUE NOT NULL,
 name text
);

INSERT INTO id_not_null_unique_table
VALUES(1, 'test1');
INSERT INTO id_not_null_unique_table
VALUES(2, 'test2');
INSERT INTO id_not_null_unique_table
VALUES(3, 'test3');

※INSERT INTO id_not_null_unique_table
VALUES(null, ‘null’); は非NULL制約に反するためINSERTできませんでした。

 

想定通り、非NULL制約が追加されました。

ユニークでNOTNULLなテーブルの定義

ユニークでNOTNULLなテーブルのデータ

 

 

私「なるほど。id=NULLのレコードが複数あったらレコードを識別できない。

ってことは、主キーは一意性制約非NULL制約が必要なんだ!」

 

 

つまり、

CREATE TABLE テーブル(
 id integer UNIQUE NOT NULL,
 name text
);

CREATE TABLE テーブル(
 id integer PRIMARY KEY,
 name text
);

は同じ!

 

試しに、後者を実行。

PRIMARY KEY宣言したら、勝手にNOT NULLが入ってた!

idが主キーなテーブルの定義

 

 

 

ユニークでNOT NULLじゃないと、

そりゃー誰でも識別できんですわ。

 

Cookieとセッションの関係性

こんばんは!

 

暑い日はやっぱりそーめんですよね、ぜったい「揖保乃糸」ですよね!

と、言っときながら貧乏なので中間層レベルのそーめんで我慢してます。

 

・Cookie

・セッション

よく聞く語句ですが、わかんない!

この二人のいいところはページを移動しても情報を保持できるところ。

 

 

参考:こちら

 

 Cookie  -ブラウザ側に情報を持たせる

・サーバ → ブラウザ にHTTPレスポンスのヘッダで情報(Name=Value)を送る

・Cookieはサーバにアクセスするたびに自動で送信される。

・意図しないサーバにCookie情報を送らないように、Cookieを受け取ったサーバではないサーバにはCookieを送らない

 

 

セッション -サーバ側に情報を持たせる

・セッションはWebブラウザを閉じるまで保存する

・セッションに保存された内容は、Webサーバーにファイルとして保存される。

・セッションIDとWebサーバー上のファイルが照合されてセッション内容を取り出す。

 

<まとめ>

ブラウザ側:CookieでセッションIDを持たせ、サーバ側に送信

サーバ側 :ファイルのセッションIDと照合→セッション内容を取り出し、

誰がログインしてきたのかを判断する

 

サーバー移行、常時SSL対応、AMP対応したよ!

 

こんにちは、久しぶりです、暑いですね。

フェスに行って、モッシュしまくったらマーライオンのように嘔吐してしまいました、もう若くないですね。

 

なんと、、、

無料レンタルサーバ卒業しました!

 

やったことリスト

1.サーバー(ロリポップ)の申し込み

 

2. ネームサーバ設定変更 (←ムームードメインでポチるだけ)

 

3.DB移行

└ 移行したテーブル ※記事関係だけ

wp_postmeta(記事のメタデータ、主にカスタムフィードらしい),

wp_posts(記事),

wp_terms(記事のカテゴリ),

wp_terms_relationship(記事とカテゴリの紐付け)

 

postgresでいう「シーケンス」がmysqlだと「AUTO_INCREMENT」

ということを知りました。

実際に使うときは、idが「AUTO_INCREMENT=1」としたら

INSERT INTO fruit (name, price) VALUES ("apple", 120),("banana", 200);

を実行すると、勝手にidが設定される。

こんな感じ。

| id |   name    | price |

|  1  |    apple    |   120  |

|  2  |   banana  |   200  |

 

 

4.画像アップロード

wp_contents/uploads/直下のもの

 

5.常時SSL対応

└ 管理画面 設定>一般

WordPress アドレス (URL)、サイトアドレス (URL)をhttps://~に変更

 

└ .htaccess追記

RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://kin29.info/$1 [R=301,L]
RewriteCond %{HTTP_HOST} ^www\.kin29\.info
RewriteCond %{SERVER_PORT} 443
RewriteRule ^(.*)$ https://kin29.info/$1 [R=301,L]

wwwなしに統一し、httpでアクセスしてきてもhttpsになるよう変更

 

 

6.AMP対応

プラグイン再導入

AMPテスト「有効な AMP ページです」だった^^

推奨する対応で、構造化データの項目が不足してい他ので調整は必要ですが、、。

 

7.Googleアナリティクス設定

外観>テーマの編集>ヘッダー にscriptタグ追記

 

 

意外に簡単にできてて、ミスってたり、作業忘れてないか不安です。

何かあれば教えてください。

複数レコードをカンマ区切りの1レコードにまとめる方法

 

※PostgresSQLでの方法です。Mysqlとかは知りません。

こんな2つのテーブルがあったとして、、

 

<category_table>

category_id category_name
1 html
2 SQL
3 Git
4 PHP

 

<story_table>

story_id category_id
1 1
1 2
1 3
2 2
2 4
3 1
4 4

 

「story_idごとにcategory_nameをカンマ区切りで表示したい。」
そんな時あると思います!

 

 

そんな時は・・・

ARRAY_TO_STRING(カラム, ‘,’)

=配列を「,」区切り文字列にする

・・・ 「カラム, カラム, カラム」こんな感じになる。ウオー

 

 

 

で、やりたいこと

「story_idごとにcategory_nameをカンマ区切りで表示したい。」

を実現する方法

 

 

SELECT
  story_id,
  ARRAY_TO_STRING(ARRAY_AGG(category_name), ‘,’)
FROM   category_table
LEFT JOIN   story_table
USING(category_id)
GROUP BY
  story_id;

 

ARRAY_AGG(カラム)

….複数行→配列に変換

今回はARRAY()ではダメだった

 

GROUP BY story_idで

story_idごとのcateory_nameを1行にするのがポイント!

 

AMPうまくいってなかった…scriptタグ問題

 

前回、プラグインを使いAMP対応させて喜んでたんです。

プラグインで記事をAMP対応にしてみた!

 

AMPに関してはこの記事の中でちょっとまとめてます

福岡PHPカンファレンスに行ってきた!

 

しかし

AMP対応うまくいいってなかったらしく、

Googleさんからメール来た><

 

AMPページエラーメッセージ

 

 

 

AMPリファレンスをみてみると。。。

AMPリファレンス

 

AMPの場合、

scriprタグはtype=”application/ld+json以外は禁止されているようですね。

 

「じゃあ、消そう!」

 

そう思った矢先、無料サーバーを使っているために、広告用のscriptがAMPに対応できないtype=”text/javascript”で記載されていることに気づきました・・・

 

無理やりtype=”application/ld+json“に置き換えたらどうなるんやろとか思ったけど、怖いんでやめました。(サーバー止めれるの怖い)

 

悔しいですが、AMPプラグイン無効にしようと思いますx_x

 

どんまいっ

 

プラグインで記事をAMP対応にしてみた!

 

参考:ここ

 

<いるもの>

プラグイン:https://wordpress.org/plugins/amp/

 

出来上がり!

https://kin29.info/プラグインで記事をAMP対応にしてみた!/amp/

↑をスマホモードがスマホで見てみてください!

こんな風になるかと思います。

AMP記事イメージ

福岡PHPカンファレンスに行ってきた!

 

先日、福岡PHPカンファレンスに行ってきました!

http://phpcon.fukuoka.jp/2017/

 

ワードプレスの話や、Progressive Web Apps、javascript、

もはやPHPの話ではないものもたくさん!

幅広い分野について知ることができました!!!

 

 

その中でも、AMP + PWAの話がありました。

AMP自体も知らなかったので実際にしてみました!

Githubにサンプルがあるのでに実際にやってみました。

console.logのとこにでました!!

 

 

AMP =Accelerated Mobile Page

参考:https://developers-jp.googleblog.com/2016/02/google-accelerated-mobile-pages.html

仕組みとしては、Googleのキャッシュにページが入っていて、キャッシュから表示することで、ページの表示速度が上がるとのこと。
その証として、AMPページのURLはhttps://www.google.co.jp/amp/….となっていました。

下図がわかりやすかったです。(Google Developers Japanより)

SEO的にも良いらしい。(コンテンツ内容にもよる)

 

関連して、JSON-LDの話もあったので、また詳しくやってみようと思います。

 

 

セクショニングって?

 

HTML5からsectionタグが追加されましたね!

それに伴い、セクショニング  という言葉をよく見かけます。

セクショニング  について書きまーす。

 

参考:ここここここ

 

 

セクショニング

文書構造を明確にする考え方のこと。

<要素>

セクショニング・コンテンツ、ヘッディング・コンテンツ

これらの要素を用いてセクショニングすることで、文書は正しいアウトラインを得ることができる。

 

 

セクショニングの歴史

HTML5以前

・divタグとhタグを使って、セクショニングしていた。

・どんな内容でもdivで1つのセクションとしており、

内容を見ないと違いがわからない。

・ロゴなどのサイト全体に関連する情報のセクションを示す方法がない。

・暗黙的にセクショニングした時、どこからどこまでが1つのセクションなのか明確にわからない場合があった。

・文書全体で、hタグのレベルをルール付けする必要があった。

 

これらの問題から、、、

HTML5

・divタグは基本的に使わず、sectionなどのセクショニング・コンテンツ要素を用いる

・section, article, aside, navタグの誕生

・nav, header, footerタグの誕生

・正確なセクション指定と見出しの指定ができるようになり、

文章構造のアウトラインを明確に示すことができる。

・文書全体だけでなく、セクションでのhタグのレベルをルール付けする必要がある。

(同じ階級のhタグをページ内に複数指定することができるようになった。)

 

 

 

 

まとめ

HTML5の目的は、

一つのセクション内に複数の見出しを入れるのではなく、

見出しごとにセクションを明示的に包含させていくことで

文章構造を明確にするためなんだなと理解。

DBでNULLでなく空のカラムを取得したい時

 

あまりないことだと思いますが、

カラムにスペースや空白が入ってるレコードを取得したい時

 

SELECT *

FROM テーブル

WHERE TRIM(カラム) = ”;

 

※PostgreSQL, MySQL,Oracleでは使えます。SQLServerdは異なる模様

  • TRIM….左右の空白を除去した文字列を取得できる
  • LTRIM….左の空白を除去した文字列を取得できる
  • RTRIM….右の空白を除去した文字列を取得できる

 

以下では、対応できない。

SELECT *

FROM テーブル

WHERE カラム IS NULL;

OVER句、ROW_NUMBER()

 

新しいSQL語彙を知ったので書きます!

 

・OVER句

・ROW_NUMBER()

 

 

まずはOVER句!

区間ごとに分割したり、並び替えたりできるやーつ

GROUP BYと何が違うんかな?

(((((( や っ て み よ う )))))

 

こんなテーブル(niku29)があったとして

id class_id name
1
1
カルビ
1
2
ホルモン
2
1
せせり
3
1
豚バラ

※idとclass_idのテーブル用意して結合するとかだと思うんですがここでは触れないでくださいw

 

牛(id=1)、鳥(id=2)、豚(id=3)の各種類の数を知りたい場合、

GROUP BYを使うと

SELECT
id,count(class_id)
FROM
niku29
GROUP BY id;

こんな感じ。すなお。

id count
1
2
3
1
2
1

 

 

OVER句を使うと、

SELECT
id,count(class_id) OVER (PARTITION BY id)
FROM
niku29;

こんな感じ?

id count
1
2
1
2
2
1
3
1

 

しかし、これだとid=1について2行同じレコードでてきちゃいます。

 

 

 

そこで、ROW_NUMBER()を使い、idごとに行数振り、

1行目だけ取ってくるやり方で見やすくします。

とりあえず、

SELECT
row_number() OVER (PARTITION BY id) AS row_num,
id,
count(class_id) OVER (PARTITION BY id)
FROM
niku29;

で行を表示してみる。

row_num id count
1
1
2
2
1
2
1
2
1
1
3
1

イイカンジ、もうちょい。

 

 

んで、1行目だけ取ってきて
SELECT
row_number() OVER (PARTITION BY id) AS row_num,
id,
count(class_id) OVER (PARTITION BY id)
FROM
niku29
WHERE row_num = 1;

ERROR:  列"row_num"は存在しません

え、あるやん。

 

そこで、

SELECT
row_number() OVER (PARTITION BY id) AS row_num,
id,
count(class_id) OVER (PARTITION BY id)
FROM
niku29
WHERE row_number() OVER (PARTITION BY id) = 1;

ERROR:  WHERE句ではウィンドウ関数を使用できません

使えないらしい・・・。

ウィンドウ関数 → row_number()、rank()とか….

 

 

すんごいネストするけどこれならできる!

SELECT
id,count
FROM
(SELECT
row_number() OVER (PARTITION BY id) AS row_num,
id,
count(class_id) OVER (PARTITION BY id) AS count
FROM
niku29) niku
WHERE row_num = 1;

id count
1
2
2
1
3
1

 

 

うーん、しかし例が悪かった。

もっとOVER,ROW_NUMBER()が役立つ時がきっとある!

 

まとめ

・WHERE句にWindow関数(ROW_NUMBERとか)は使えない。