Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHPでデータベースを作ってみた/create-data-with-php

 PHPでデータベースを作ってみた/create-data-with-php

PHPカンファレンス福岡2024の登壇資料です。

Ryo Tomidokoro

June 22, 2024
Tweet

More Decks by Ryo Tomidokoro

Other Decks in Technology

Transcript

  1. @hanhan1978 名前 富所 亮 所属 株式会社カオナビ CTO室 BackEnd Re-architecturing Team

    (BERT) Blog https://blog.hanhans.net Podcast https://podcasters.spotify.com/pod/show/yokohama-north-am 2
  2. さっそくMySQLの通信を見る 引数は match と filter 上の例は match は無指定、filter に port

    3306 を指定 これで3306番ポートにまつわるローカル ホストの通信が確認できる
  3. プロトコル読解 - Handshake このパケットは Header 4 Byte + Payload 74

    Byte の 78 Bytea MySQLのパケットを考える際は常にこの Header を考慮にいれる
  4. プロトコル読解 - General Response 7ByteのPayload header ▶ 0x00 affected_rows ▶

    0x00 last_insert_id ▶ 0x00 君はここにいたのか!!
  5. SELECTの通信 Header ▶ Payloadサイズは37 Payload ▶ 先頭に 0x03 ▶ ETX

    制御コード Payload残り ▶ クエリの文字列 SELECT id, value1, value2 FROM items
  6. SELECTの通信 40Byte の Payload 04 74657374▶ 4byte の文字列メッセージ test データベース名

    05 6974656d73▶ 5byte の文字列メッセージ items テーブル名 05 6974656d73▶ 5byte の文字列メッセージ items オリジナルのテーブル名
  7. SELECTの通信 40Byte の Payload 04 74657374▶ 4byte の文字列メッセージ test データベース名

    05 6974656d73▶ 5byte の文字列メッセージ items テーブル名 05 6974656d73▶ 5byte の文字列メッセージ items オリジナルのテーブル名 02 6964▶ 2byte の文字列メッセージ id カラム名 02 6964▶ 2byte の文字列メッセージ id オリジナルのカラム名
  8. SELECTの通信 40Byte の Payload 0c ▶ 固定値 3f00 ▶ キャラセット

    binary 0b000000 ▶ カラムサイズ int(11) 03 ▶ データ型
  9. SELECTの通信 40Byte の Payload 0c ▶ 固定値 3f00 ▶ キャラセット

    binary 0b000000 ▶ カラムサイズ int(11) 03 ▶ データ型 0350 ▶ ビット演算されたフラグ
  10. SELECTの通信 40Byte の Payload 0c ▶ 固定値 3f00 ▶ キャラセット

    binary 0b000000 ▶ カラムサイズ int(11) 03 ▶ データ型 0350 ▶ ビット演算されたフラグ 000000 ▶ Packet終端
  11. SELECTの通信 結果行 - 1行目 0131 ▶ idカラムの結果 文字列 1 05686f676531

    ▶ value1カラムの結果 文字列 hoge1 05686f676532 ▶ value2カラムの結果 文字列 hoge2
  12. SELECTの通信 結果行 - 1行目 0131 ▶ idカラムの結果 文字列 1 05686f676531

    ▶ value1カラムの結果 文字列 hoge1 05686f676532 ▶ value2カラムの結果 文字列 hoge2 intは文字列で返ってくる PDO, ORMなどで型変換の不具合イシューが上がっ てくるのはここらへんの仕様が関係ありそう
  13. 簡単にまとめると... Handshake ▶ OKパケット DML, 更新系クエリ ▶ OKパケット 参照系クエリ ▶

    カラム定義を含む、結果セットのパケット 細かくはもっといろいろあるのだけど 偽データベースを動作させるには十分