ゆう's Blog
色々

VARBINARY型は、可変長のバイナリデータを格納するためのデータ型です。これは、テキストではなくバイナリデータ(画像、暗号化データ、ファイルの一部など)を扱う際に使用されます。

可変長: VARBINARY(n)のnは最大バイト数を指定します(nの範囲は1〜65535)。
バイナリデータとして扱う: 通常のVARCHAR型のように文字セットや照合順序の影響を受けません。
パディングなし: BINARY型とは異なり、格納時に余分なスペースで埋めることはありません。

InnoDB ストレージエンジンでは、1行のサイズが最大8126バイトに制限されます

TEXT型やBLOB型のデータは、一定サイズ以上になるとページ外(オーバーフロー領域)に保存されるため、行データサイズの制約を回避できますが、パフォーマンスに影響する可能性があります。

VARCHAR(n) は エンコーディングによって実際のバイトサイズが異なります。例えば、UTF-8の場合、1文字が最大4バイトになる可能性があります。
追加で1〜2バイトの長さ情報(Length Indicator)が必要です。

TEXT型

MySQLのTEXT型には具体的な「文字数の指定」がなく、最大保存可能なバイト数で制限されます。

TEXT型の種類と最大サイズ
TEXT型最大サイズ
TINYTEXT255バイト
TEXT65,535バイト
MEDIUMTEXT16,777,215バイト
LONGTEXT4,294,967,295バイト

UTF-8エンコーディングの場合、日本語などのマルチバイト文字は1文字あたり最大3〜4バイトを使用します。

入力された文字列のバイト数を計算し、指定された制限を超えた場合にアラートを表示

<input type="text" id="textBox" placeholder="文字を入力してください"> <script> function checkByteLength(inputElement, maxBytes) { const text = inputElement.value; let byteLength = new TextEncoder().encode(text).length; // バイト数を計算する if (byteLength > maxBytes) { const overBytes = byteLength - maxBytes; alert(`${overBytes}バイトオーバーです`); } } // 例: テキストボックスの入力イベントにバイト数チェックを追加 const textBox = document.getElementById("textBox"); textBox.addEventListener("input", () => checkByteLength(textBox, 50)); // 50バイトが制限 </script>

フォーム毎トークン

function setToken($formName) { // トークンを生成 $csrf_token = bin2hex(random_bytes(32)); // $_SESSION['csrf_token']が配列であることを確認 if (!isset($_SESSION['csrf_token']) || !is_array($_SESSION['csrf_token'])) { $_SESSION['csrf_token'] = array(); } $_SESSION['csrf_token'][$formName] = $csrf_token; return $csrf_token; }


<input type="hidden" name="form_name" value="entry-form"> <input type="hidden" name="csrf_token" value="<?php echo h(setToken('entry-form')); ?>">


session_start(); if ($_SERVER['REQUEST_METHOD'] == 'POST') { $formName = $_POST['form_name']; if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token'][$formName]) { exit('不正なリクエスト'); } unset($_SESSION['csrf_token'][$formName]); unset($_POST['form_name']); }

テキストボックスをフォーカスしたときに全選択状態にする

<input type="text" id="textbox" value="全選択されるテキスト">

const textbox = document.getElementById('textbox'); textbox.addEventListener('focus', () => { textbox.select(); });

暗号化

主に以下の2種類があります:

共通鍵暗号(対称暗号):
同じ鍵を使ってデータを暗号化・復号します。
例: AES(Advanced Encryption Standard)
利点: 処理が高速。
課題: 鍵を安全に共有する必要がある。

公開鍵暗号(非対称暗号):
公開鍵で暗号化し、対応する秘密鍵で復号します。
例: RSA、ECC(Elliptic Curve Cryptography)
利点: 鍵を共有する必要がない(公開鍵は誰でも使える)。
課題: 処理が遅い。


公開鍵暗号の仕組み
公開鍵暗号では、以下のような流れでデータを保護します:
鍵ペアの生成:
公開鍵と秘密鍵のペアを生成します。
公開鍵は暗号化に使用され、誰でも利用可能です。
秘密鍵は復号に使用され、厳重に保管します。
暗号化:
公開鍵を使ってデータを暗号化します。
暗号化されたデータは、公開鍵に対応する秘密鍵でしか復号できません。
復号:
秘密鍵を使って暗号化されたデータを復号します。
公開鍵では復号できないため、秘密鍵が漏洩しない限り安全です。


1. 公開鍵は暗号化にしか使用されない:
公開鍵は暗号化のプロセスに使用されます。一方で、復号に必要なのは「秘密鍵」のみです。そのため、暗号化プロセスで使用された公開鍵がリロードによって更新されても、暗号化されたデータは生成された秘密鍵で復号可能です。

2. 暗号化データと秘密鍵の関係:
RSA(または非対称暗号)の仕組みにより、暗号化されたデータは公開鍵に対応する秘密鍵だけで復号できます。暗号化されたデータ自体は公開鍵の更新によって影響を受けません。つまり、元の秘密鍵を保持していれば復号が可能です。

3. 復号は新しい公開鍵に依存しない:
新しい公開鍵が生成されたとしても、復号処理ではその新しい公開鍵は使われません。復号時に必要なのは、暗号化時に使用された公開鍵に対応する秘密鍵です。この秘密鍵が正しく入力されていれば、暗号化されたデータを正常に復号できます。

4. 暗号化データの変更がない限り有効:
暗号化されたデータそのものが破損したり変更されたりしていない限り、元の秘密鍵を用いることで復号可能です。


公開鍵は暗号化にしか使用されない。復号時に必要なのは暗号化時の秘密鍵。

GETクエリ

POST:維持

GET:上書き
残したいなら、input[type="hidden"] を使ってフォームデータにパラメータを加える。

lastInsertId()関数

// 挿入したIDを取得 $id = $dbh->lastInsertId();

テーブル内のカラム名がidである必要はありません。この関数は、直前に実行されたINSERTクエリによって生成された自動インクリメント値を返します。そのため、カラム名が何であれ、テーブル内で自動インクリメントとして設定されているカラムであれば機能します。大事なのは、AUTO_INCREMENT属性が設定されているカラムを利用していることです。

連想配列を foreach 文を使って作成する方法

<?php // 元のデータ $keys = ["apple", "banana", "cherry"]; $values = [100, 200, 300]; // 空の連想配列を初期化 $associativeArray = []; // foreach文で配列を作成 foreach ($keys as $index => $key) { $associativeArray[$key] = $values[$index]; } // 結果を表示 print_r($associativeArray); ?>

ショートハンド

指定していない値は、デフォルトにリセットしてしまう。