// 挿入したIDを取得 $id = $dbh->lastInsertId();
テーブル内のカラム名がidである必要はありません。この関数は、直前に実行されたINSERTクエリによって生成された自動インクリメント値を返します。そのため、カラム名が何であれ、テーブル内で自動インクリメントとして設定されているカラムであれば機能します。大事なのは、AUTO_INCREMENT属性が設定されているカラムを利用していることです。
UPDATEしても、カラムの値が変更されていなければ、更新されない
MySQLのTIMESTAMPは内部的にはUTCで保存されますが、クライアント(この場合はphpMyAdmin)に返す際に、セッションのタイムゾーンに従って変換されます。 もし@@session.time_zoneがSYSTEMになっている場合、MySQLはOSのタイムゾーン設定に依存して値を変換し、その変換後の値を返すため、phpMyAdminではOSのタイムゾーンでの値が表示されます。
タイムゾーンの設定確認
SELECT @@global.time_zone, @@session.time_zone;
優先順位: NOT > AND > OR
PHP 内でゼロ埋めを行う方法
データベースから取得した後、PHP の str_pad() 関数を使ってゼロ埋めすることもできます。
str_pad($value, 4, 0, STR_PAD_LEFT);
implodeを使った方法
メリット
シンプルで読みやすい:カンマ区切りの文字列として保存されるため、簡単に人間が読める形式になります。
検索性:文字列として保存されるため、特定の要素を簡単に検索したい場合に便利です。
デメリット
形式の制約:配列の要素が文字列であり、カンマを含まないことが前提です。もし要素にカンマが含まれていると、解析が困難になります。
情報の欠落:多次元配列やオブジェクトなど、単純な文字列としては表現できないデータ構造を扱う際に不向きです。
serializeを使った方法
メリット
柔軟性:多次元配列やオブジェクトなど、複雑なデータ構造もそのまま保存できます。
完全な保存:配列の情報をそのまま失わずに保存できるため、取り出した際に元の構造を保ったまま復元できます。
デメリット
読みやすさ:人間が直接読むのには向いていない形式です。デバッグや直接の確認が難しくなります。
互換性:シリアライズされたデータはPHP特有の形式であるため、他のプログラム言語やツールとの互換性がありません。
まとめ
シンプルな文字列として保存し、読みやすさや単純な検索性を重視するなら、implodeを使用する方法が適しています。
複雑なデータ構造をそのまま保存し、復元時に完全な形で取り出したい場合は、serializeを使用する方法が優れています。
// データを挿入または更新するSQL文 $sql = "INSERT INTO your_table (id, column1, column2) VALUES (:id, :column1, :column2) ON DUPLICATE KEY UPDATE column1 = VALUES(column1), column2 = VALUES(column2)"; $stmt = $pdo->prepare($sql); // パラメータの設定 $stmt->bindParam(':id', $id); $stmt->bindParam(':column1', $column1); $stmt->bindParam(':column2', $column2);
主キー(またはユニークキー)に基づいて動作します。これは、重複するキーがある場合にUPDATEを実行するためです。したがって、この構文を使用する場合は、必ずしもIDである必要はありませんが、ユニークキーまたは主キーに基づく必要があります。
複数のカラムを組み合わせてユニークキーを作ることは可能ですし、それを使ってINSERT ... ON DUPLICATE KEY UPDATE構文を使用することも可能です。実際、複合ユニークキーを設定すれば、複数カラムの組み合わせに基づいてINSERTまたはUPDATEを行うことができます。
例えば、次のように複合ユニークキーを設定します:
CREATE TABLE your_table ( id INT AUTO_INCREMENT PRIMARY KEY, column1 VARCHAR(255), column2 VARCHAR(255), column3 VARCHAR(255), UNIQUE KEY unique_key (column1, column2) );
このようにテーブルを作成した場合、column1とcolumn2の組み合わせがユニークキーとして機能します。これに基づいてINSERT ... ON DUPLICATE KEY UPDATE構文を使用する例を以下に示します:
// データを挿入または更新するSQL文 $sql = "INSERT INTO your_table (column1, column2, column3) VALUES (:column1, :column2, :column3) ON DUPLICATE KEY UPDATE column3 = VALUES(column3)"; $stmt = $pdo->prepare($sql); // パラメータの設定 $stmt->bindParam(':column1', $column1); $stmt->bindParam(':column2', $column2); $stmt->bindParam(':column3', $column3);
この例では、column1とcolumn2の組み合わせがユニークであるため、重複するデータがある場合にはcolumn3が更新され、重複しない場合には新しいレコードが挿入されます。
この方法なら複数カラムのユニーク性を活かしてデータの挿入および更新ができます。
CREATE TABLE your_table ( id INT AUTO_INCREMENT PRIMARY KEY, column1 VARCHAR(255) NOT NULL, column2 VARCHAR(255) NOT NULL, column3 VARCHAR(255), UNIQUE KEY unique_key (column1, column2) );
GUIでは「Null」にはできるが「空文字」にはできなかった。
なので、phpMyAdminの「SQL」タブを使用して、直接SQLクエリを実行した。
ALTER TABLE テーブル名 ALTER COLUMN カラム名 SET DEFAULT '';
シングルクオートは不可。
INSERT文でデータを挿入する時にカラム名を省略する事ができます。
この場合、対象テーブルの全てのカラムに対して値を指定する必要があります。
挿入する値の数が足りなかったり、カラムの定義と違うデータ型を指定すると実行時エラーとなります。
INSERT INTO テーブル名
VALUES
('値1','値2','値3','値4'…)
テーブルの定義通りに、VALUESの後にカンマ区切りで全ての値を指定します。