Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
PHPバージョンアップと決済テストを支えたユニットテスト
Search
Kazuki Higashiguchi
August 07, 2018
Technology
6
5.6k
PHPバージョンアップと決済テストを支えたユニットテスト
「レガシーコード改革!UT/CIでWebサービスの技術的負債を解消する取り組み」での発表資料です。
https://base.connpass.com/event/94476/
Kazuki Higashiguchi
August 07, 2018
Tweet
Share
More Decks by Kazuki Higashiguchi
See All by Kazuki Higashiguchi
Practical Monitoring for Knative Serving / KubeCon + CloudNativeCon Japan 2025
hgsgtk
0
35
Cell-Based Architecture Design in AWS
hgsgtk
1
130
インフラコストとセキュリティ課題解決のためのリアーキテクチャリング / srekaigi2025
hgsgtk
3
6.6k
Design of a Stateful system for Robust Deployment and Observability
hgsgtk
0
1.4k
A guide to joining operational work in your new DevOps team
hgsgtk
1
1.5k
HTTP Tunneling in Go
hgsgtk
0
1.5k
ブラウザ自動操作技術の深層へ、直接触れて学ぶ WebDriver と Chrome DevTools Protocol
hgsgtk
3
6.7k
HTTP Server on random available port in Go
hgsgtk
0
1.1k
Agile Testingを夢見たテスト自動化 〜ATDDへの挑戦から始まる 1年間の試行錯誤〜 / dreaming agile testing at basebank
hgsgtk
14
8.1k
Other Decks in Technology
See All in Technology
o11yツールを乗り換えた話
tak0x00
2
1.5k
生成AIによるデータサイエンスの変革
taka_aki
0
3k
九州の人に知ってもらいたいGISスポット / gis spot in kyushu 2025
sakaik
0
180
Kiroでインフラ要件定義~テスト を実施してみた
nagisa53
3
380
LLM 機能を支える Langfuse / ClickHouse のサーバレス化
yuu26
9
2.4k
Telemetry APIから学ぶGoogle Cloud ObservabilityとOpenTelemetryの現在 / getting-started-telemetry-api-with-google-cloud
k6s4i53rx
0
150
Jamf Connect ZTNAとMDMで実現! 金融ベンチャーにおける「デバイストラスト」実例と軌跡 / Kyash Device Trust
rela1470
1
200
LTに影響を受けてテンプレリポジトリを作った話
hol1kgmg
0
380
僕たちが「開発しやすさ」を求め 模索し続けたアーキテクチャ #アーキテクチャ勉強会_findy
bengo4com
0
2.5k
リモートワークで心掛けていること 〜AI活用編〜
naoki85
0
180
GISエンジニアよ 現場に行け!
sudataka
1
100
2時間で300+テーブルをデータ基盤に連携するためのAI活用 / FukuokaDataEngineer
sansan_randd
0
160
Featured
See All Featured
Mobile First: as difficult as doing things right
swwweet
223
9.9k
Fireside Chat
paigeccino
38
3.6k
Docker and Python
trallard
45
3.5k
Adopting Sorbet at Scale
ufuk
77
9.5k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
34
3.1k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
8
450
Become a Pro
speakerdeck
PRO
29
5.5k
Visualization
eitanlees
146
16k
Building Applications with DynamoDB
mza
96
6.5k
Why You Should Never Use an ORM
jnunemaker
PRO
58
9.5k
For a Future-Friendly Web
brad_frost
179
9.9k
Statistics for Hackers
jakevdp
799
220k
Transcript
PHPόʔδϣϯΞοϓͱ ܾࡁϦϓϨΠεΛࢧ͑ͨ Ϣχοτςετ 2018/8/7 (Tue) ϨΨγʔίʔυվֵʂUT/CIͰWebαʔϏεͷٕज़తෛ࠴Λղফ͢ΔऔΓΈ BASEגࣜձࣾ ౦ޱᏻ @Khigashiguchi
ʮϨΨγʔίʔυʯͱ IUUQTCBTFDPOOQBTTDPNFWFOU
–ϚΠέϧɾCɾϑΣβʔζஶʰϨΨγʔίʔυվળΨΠυʱ “ϨΨγʔίʔυͱɺ ୯ʹςετͷͳ͍ίʔυͰ͢ɻ” https://www.shoeisha.co.jp/book/detail/9784798116839
BASEʹͱͬͯͷ ʮϨΨγʔίʔυվֵʯ • ςετ͕ͳ͍ίʔυʹରͯ͠Ϣχοτςε τΛॻ͍͍ͯ͘
“ίʔυΛมߋ͢ΔͨΊʹɺςετΛ උ͢Δඞཁ͕͋Δɻଟ͘ͷ߹ɺςε τΛඋ͢ΔͨΊʹɺίʔυΛมߋ͢ Δඞཁ͕͋Δɻ” ʢϨΨγʔίʔυͷδϨϯϚʣ –ʰϨΨγʔίʔυվળΨΠυʱ
BASEʹͱͬͯͷ ʮϨΨγʔίʔυվֵʯ • ςετ͕ͳ͍ίʔυʹରͯ͠Ϣχοτςε τΛॻ͍͍ͯ͘ • ʮϨΨγʔίʔυͷδϨϯϚʯʹటषཱ͘ ͔ͪ͏
࣍ • ࣗݾհ • BASEͷഎܠ • Ϣχοτςετͷʮ͍ํʯ • Ϣχοτςετͷʮ՝ʯͱʮରࡦʯ •
͜Ε͔Βͷʮ՝ʯ • ·ͱΊ
ࣗݾհ • ౦ޱ ᏻ @Khigashiguchi • BASE, Inc / BASE
Product Division • Server Side EngineerʢPHP / Goʣ • Works • EίϚʔεϓϥοτϑΥʔϜ ʮBASEʯͷܾࡁྖҬ • PHP/CakePHPͷόʔδϣϯΞοϓ
PHPΧϯϑΝϨϯεؔ2018ʹͯɺ ςετʹ͍ͭͯͷʮݸਓతʯͷ IUUQTTQFBLFSEFDLDPNLIJHBTIJHVDIJUFTVUPXPTIVJUBLPUPLBOBJFOTJOJBLBUFTVUPXPTIV LFSVZPVOJOBSVNBUFZBUVUBLPUPBUQIQLBOIVBSFOTVHVBOYJ
BASEͷϛογϣϯͱࣄۀ ՁͷަΛΑΓγϯϓϧʹ͠ɺ ੈքதͷਓʑ͕࠷దͳܦࡁ׆ಈΛߦ͑ΔΑ͏ʹ͢Δ MISSION ແྉʗ؆୯ͳωοτγϣοϓ࡞ͷΈ ˍ ʮཉ͍͠ʯ͕ݟ͔ͭΔγϣοϐϯάΞϓϦ γϯϓϧͳΦϯϥΠϯܾࡁιϦϡʔγϣϯ ɾ QRίʔυͳͲγϯϓϧͳܾࡁखஈ
※PAYגࣜձࣾʢBASEגࣜձࣾ100%ࢠձࣾʣʹͯఏڙ
BASEࣄۀ - ֓ཁ ߪೖऀ͚ͷγϣοϓ͕ू·Δγϣοϐϯά Ϟʔϧɻ EίϚʔεϓϥοτϑΥʔϜʮBASEʯ EίϚʔεϓϥοτϑΥʔϜʮBASEʯ BASEੈͷதͷʮՁͷަΛΑΓγϯϓϧʹʯ͢ΔͨΊͷ ECϓϥοτϑΥʔϜࣄۀͰ͢ ωοτγϣοϓ࡞αʔϏεʮBASEʯ
γϣοϐϯάΞϓϦʮBASEʯ ళฮʗൢചऀ͚ͷγϯϓϧɾֹ݄ແྉͷ γϣοϓ࡞ιϦϡʔγϣϯɻ
BASEͷഎܠ
BASEͷഎܠ(~2017) • 6(2012ϦϦʔε) • ଟ͘ͷαʔϏεͰPHP5.3/CakePHP2.3Λ ར༻ • ςετ͕ॻ͔Ε͍ͯΔαʔϏε͕গͳ͔ͬ ͨ
ϨΨγʔࠀͷʮ͖͔͚ͬʯ • ςετΛॻ͘͜ͱʹΑͬͯɺΑΓ҆શʹγ εςϜΛѻ͍͍ͨϞνϕʔγϣϯ • ฤूͯ͠فΔʢEdit and Prayʣ • อޢͯ͠มߋ͢ΔʢCover
and Modifyʣ • PHPόʔδϣϯΞοϓPJɾܾࡁؔ࿈PJͳ ͲʹΑΔϢχοτςετͷॆ࣮Խ • ʢܾࡁؔ࿈PJ=τʔΫϯܾࡁରԠɾܾࡁϦϓϨΠε… etcʣ
ʮPHPόʔδϣϯΞοϓʯ • 2016͔Β࢝·ͬͨPHPɾCakePHPͷ όʔδϣϯΞοϓσʔτ • PHP5.3 -> PHP7.1 • CakePHP2.3~2.10
-> CakePHP2.10(2.x ࠷৽) • 20185݄ʹྃ
ৄ͘͠ɺʮBASEɹPHPΞοϓσʔτʯͰݕࡧ IUUQTEFWCMPHUIFCBTFJOFOUSZ
ʮܾࡁؔ࿈PJʯ • BASEओʹҎԼ5ͭͷܾࡁํ๏ΛରԠ • ΫϨδοτΧʔυܾࡁɺίϯϏχܾࡁɾPay-easyɺۜ ߦৼࠐɺޙ͍ܾࡁɺΩϟϦΞܾࡁ • දͷʮܾࡁϦϓϨΠεʯ • =
ޙ͍ܾࡁϦϓϨΠε IUUQTUIFCBTFJOQBZNFOUT
Ϣχοτςετͷʮ͍ํʯ
PHPΞοϓσʔτ&ςετ • 50ສళฮͷϢʔβʔͷ͍ΔαʔϏεͷ PHPɾCakePHPͷόʔδϣϯΛ҆શʹ্͛ Δ • ςετΧόϨοδΛ্͛ͯɺอޢൣғΛ ͛Δ • ControllerϨϕϧ͔ΒൣғͷΧόϨοδ
Λर͏
ܾࡁϦϓϨΠε&ςετ • ηϯγςΟϒͳܾࡁʹରͯ͠Կࣄͳ҆͘ શʹ͢Δඞཁੑ • طଘίʔυͷৼΔ͍Λཧղ͢Δ • طଘͷৼΔ͍Λอޢ͢Δ • อޢ্ͨ͠ͰɺϦϑΝΫλϦϯάɾίʔυ
ՃΛߦ͏ɻ
> طଘͷৼΔ͍Λอޢ͢Δ
ʮ༷Խςετʯ • “characterization test” • ίʔυͷطଘͷৼΔ͍Λ໌Β͔ʹ͢Δς ετ • ॲཧͰૢ࡞͢Δཁૉʹର͢Δ࣮ࢪ͍ͯ͠ ͘
• Viewʹηοτ͞ΕΔ • Sessionͷ • Dataͷొ/ߋ৽ • FUD
ʮௐࠪతϦϑΝΫλϦϯάʯ • “exploratory refactoring” • طଘίʔυʹର͢ΔཧղΛਂΊΔ • “ʮະͷڪΕʯΛࠀ͢Δ࠷ྑͷํ๏ɺͦͷ ίʔυʹඈͼࠐΜͰɺ͍͡Γ࢝ΊΔ͜ͱͩɻ” (ʰϨΨ
γʔιϑτΣΞվળΨΠυʱ) • ཧղΛਂΊΔͨΊิॿͱͯ͠ʮ༷Խςε τʯΛߦ͏ɻ https://www.shoeisha.co.jp/book/detail/9784798145143
༷Խςετͷखॱ 1. ςετίʔυͷதͰରͷίʔυΛݺͼ ग़͢ 2. ࣦഊ͢ΔͱΘ͔͍ͬͯΔද໌Λॻ͘ 3. ࣦഊͨ݁͠Ռ͔Β࣮ࡍͷৼΔ͍Λ֬ೝ ͢Δ 4.
ίʔυ͕࣮ݱ͢ΔৼΔ͍Λظ͢ΔΑ ͏ʹɺςετΛมߋ͢Δ 5. Ҏ্ͷखॱΛ܁Γฦ͢
༷ԽςετͷਐΊํʢྫʣ $result = $this->testAction( ‘/samples/index’, [‘data’ => $data, ‘method’ =>
‘post’] ); 1. ςετίʔυͷதͰରͷίʔυΛݺͼग़͢ɻ
༷ԽςετͷਐΊํʢྫʣ $result = $this->testAction( ‘/samples/index’, [‘data’ => $data, ‘method’ =>
‘post’] ); $expected = []; $this->assertSame($expected, $this->vars); 2. ࣦഊ͢ΔͱΘ͔͍ͬͯΔද໌Λॻ͘
༷ԽςετͷਐΊํʢྫʣ $ ./Console/cake test app —-stderr Controller/SampleController PHPUnit 5.7.27 by
Sebastian Bergmann and contributors. F 1 / 1 (100%) Time: 19.32 seconds, Memory: 16.00MB There was 1 failure: --- Expected +++ Actual @@ @@ -Array &0 () +Array &0 ( ‘result’ => [‘success’] ) 3. ࣦഊͨ݁͠Ռ͔Β࣮ࡍͷৼΔ͍Λ֬ೝ͢Δ
༷ԽςετͷਐΊํʢྫʣ $result = $this->testAction( ‘/samples/index’, [‘data’ => $data, ‘method’ =>
‘post’] ); $expected = [ ‘result’ => [‘success’] ]; $this->assertSame($expected, $this->vars); 4. ίʔυ͕࣮ݱ͢ΔৼΔ͍Λظ͢ΔΑ͏ ʹɺςετΛมߋ͢Δ 5. Ҏ্ͷखॱΛ܁Γฦ͢
Ϣχοτςετͷ ʮ՝ʯͱʮରࡦʯ
Ϣχοτςετͷʮ՝ʯ • ςετ͠ʹ͍͘ίʔυ • ςετΛॻ͘ਓɾॻ͔ͳ͍ਓ • ഁ͍͢͠ςετ
՝ ςετ͠ʹ͍͘ίʔυ
ςετ͠ʹ͍͘ίʔυ • ςετ͕ͳ͍ίʔυɺςετ͠ʹ͍͘ ίʔυͰ͋Δ͜ͱ͕ଟ͍ • ֎෦ଓΛؚΉ࣮ͱͷີ݁߹ • ܾࡁγεςϜɾAWS • ͷେ͖͍ϝιου
“ίʔυΛมߋ͢ΔͨΊʹɺςετΛ උ͢Δඞཁ͕͋Δɻଟ͘ͷ߹ɺςε τΛඋ͢ΔͨΊʹɺίʔυΛมߋ͢ Δඞཁ͕͋Δɻ” ʢϨΨγʔίʔυͷδϨϯϚʣ –ʰϨΨγʔίʔυվળΨΠυʱ
ςετ͠ʹ͍͘ίʔυ • ςετ͕͔͚ΔΑ͏ʹॻ͖͑Δ • ີ݁߹ΛMockΛࠩ͠ࠐΊΔஈ֊·Ͱղফ ͢Δ • ςετ࣌ʹMockΛࠩ͠ࠐΉ • ֎෦࿈ܞͳͲΛؚΉςετΛߦ͏ࡍɺ֘
ΫϥεΛMockʹஔ͖͑Δ • ֎෦࿈ܞͷৼΔ͍ΛMock͢Δ
ີ݁߹Λղফ͢Δྫ // Before public function charge($order) { $manager = new
PaymentManager(); $result = $manager->charge($order); // ܾࡁγεςϜʹ௨ } PaymentManagerͱີ݁߹ɺ Mockͷࠩ͠ସ͕͍͑͠ɻ
ີ݁߹Λղফ͢Δྫ // After public function __construct($PaymentManager = null) { $this->manager
= $PaymentManager ?? new PaymentManager(); } public function charge($order) { $result = $this->manager->charge($order); // ܾࡁγεςϜʹ௨ } Constructor Injection ίϯετϥΫλͷҾͰͤΔΑ͏ʹ͢Δ ͜ͱͰɺMockͷࠩ͠ସ͑Λ༰қʹ͢Δɻ
PHPUnitͰͷMock // mock objectΛ࡞Δ $mock = $this->getMockBuilder(Sample::class) ->setMethods(['update']) ->getMock(); //
mock objectͷϝιουͷظͱฦ͢Λఆٛ $mock->expects($this->once()) ->method('update') ->with($this->equalTo(‘param1')) ->will($this->returnValue(true); // Constructor injection͢Δ߹ $target = new Target($mock); IUUQTQIQVOJUEFNBOVBMFOUFTUEPVCMFTIUNM ৄࡉɺʮPHPUnit mockʯͰݕࡧ
ςετ͠ʹ͍͘ίʔυͷน • ςετ͠ʹ͍͘ίʔυͷղফʹ͕͔͔࣌ؒ Δ߹ • ີ݁߹Λղ͘ͷʹେ͖ͳϦϑΝΫλϦϯάΛཁ͢Δ • ґଘ͍ͯ͠ΔΫϥεͷதͰɺ࣮ࡍʹ֎෦௨৴Λߦ͏ίʔ υΛؚΉͱ͍ͬͨ߹ •
ςετ͠ʹ͍͘Օॴʹରͯ͠Ͳ͏खΛೖΕ Δ͔ɻ • runkitΛ׆༻ͯ͠ςετΛॻ͘
runkit • runkit֦ுϞδϡʔϧ • ఆɾϢʔβʔఆٛؔ ͓ΑͼϢʔβʔఆ ٛΫϥεΛมߋ͢ΔػೳΛఏڙ IUUQQIQOFUNBOVBMKBJOUSPSVOLJUQIQ
runkitΛ༻͍ͨςετ // ରؔఆٛΛॻ͖͑Δ $val = <<<_XML__ <response>success</response> __XML__; runkit_function_copy(‘curl_exec’, ‘curl_exec_org’);
runkit_function_redefine(‘curl_exec’, ‘’, $val); // ςετରίʔυΛ࣮ߦ $result = $this->Sample->exec(); // ॻ͖͑ͨؔఆٛΛͱʹ͢ runkit_function_remove(‘curl_exec’); runkit_function_copy(‘curl_exec_org’, ‘curl_exec’); runkit_function_remove(‘curl_exec_org’); ؔఆٛͷόοΫΞοϓΛऔΓɺظ͢ΔϨεϙ ϯε($val)Λฦ͢Α͏ʹ࠶ఆٛ͢Δɻ
runkitΛ༻͍ͨςετ // ରؔఆٛΛॻ͖͑Δ $val = <<<_XML__ <response>success</response> __XML__; runkit_function_copy(‘curl_exec’, ‘curl_exec_org’);
runkit_function_redefine(‘curl_exec’, ‘’, $val); // ςετରίʔυΛ࣮ߦ $result = $this->Sample->exec(); // ॻ͖͑ͨؔఆٛΛͱʹ͢ runkit_function_remove(‘curl_exec’); runkit_function_copy(‘curl_exec_org’, ‘curl_exec’); runkit_function_remove(‘curl_exec_org’); ςετରίʔυΛ࣮ߦ
runkitΛ༻͍ͨςετ // ରؔఆٛΛॻ͖͑Δ $val = <<<_XML__ <response>success</response> __XML__; runkit_function_copy(‘curl_exec’, ‘curl_exec_org’);
runkit_function_redefine(‘curl_exec’, ‘’, $val); // ςετରίʔυΛ࣮ߦ $result = $this->Sample->exec(); // ॻ͖͑ͨؔఆٛΛͱʹ͢ runkit_function_remove(‘curl_exec’); runkit_function_copy(‘curl_exec_org’, ‘curl_exec’); runkit_function_remove(‘curl_exec_org’); όοΫΞοϓΛऔ͍ͬͯͨͱͱͷؔఆٛʹ ࠶ఆٛ͢͠ɻ
ৄ͘͠ɺ@kunit͞ΜͷQiitaهࣄΛࢀর IUUQTRJJUBDPNLVOJUJUFNTDBBEFFDG
՝ ςετΛॻ͘ਓɾॻ͔ͳ͍ਓ
–ΫϦεɾόʔνϟϧஶʰϨΨγʔιϑτΣΞվળΨΠυʱ “ίʔυ͕ϨΨγʔʹʢͱ͍͏ͷɺେ ͬ͟ͺʹݴͬͯɺอक͕ࠔʹʣͳΔʹ ɺଟ͘ͷཧ༝͕͋Γ·͕͢ɺ΄ͱΜͲ ͷݪҼɺٕज़Ͱͳ͘ਓؒʹؔͯ͠ ͍·͢ɻ” https://www.shoeisha.co.jp/book/detail/9784798145143
ςετΛॻ͘ਓɾॻ͔ͳ͍ਓ • ςετΛॻ͘ਓɾॻ͔ͳ͍ਓʹ͕͔Ε ͍ͯ͘ • ςετΛॻ͍ͨ͜ͱ͕ͳ͍ͱɺ࠷ॳͷҰา ͕౿Έग़ͮ͠Β͘ɺτϥϒϧγϡʔςΟϯ άʹ͕͔͔࣌ؒΔɻ • ςετ͕ͳ͍ίʔυ͕૿͍͑ͯ͘
ରࡦɿςετΛॻ͘োนΛԼ͛Δ • Ϣχοτςετʹ͍ͭͯͷݟڞ༗ • ࣾϢχοτςετϋϯζΦϯͷ։࠵ • ςετʹ͍ͭͯฉ͘slack channel • CakePHPࣗମͷBug
Fix • ςετΛॻ͖͍͢ΈΛ࡞Δ
Ϣχοτςετʹ͍ͭͯͷݟڞ༗ ʮࠔͬͨ͜ͱɺղܾͨ͜͠ͱʯΛυΩϡϝϯτͰڞ༗
ࣾϢχοτςετϋϯζΦϯ by @tenkoma
CakePHPࣗମͷBugFix IUUQTEFWCMPHUIFCBTFJOFOUSZ CakePHPຊମͷContribute
ςετΛॻ͖͍͢Έ • શϨϙδτϦ༻ͷςετεΠʔτϓϥάΠϯ • ϑΟΫενϟػߏΛ֦ு • άϩʔόϧมཧ • PHPUnit7.xܥػೳͷόοΫϙʔτ •
ʮassertSameͷdiff͕ݟ͘͢͢ΔʯͳͲ
ৄ͘͠ɺʮBASEɹPHPΧϯϑΝϨϯεԬʯ Ͱݕࡧ IUUQTEFWCMPHUIFCBTFJOFOUSZ
՝ ഁ͍͢͠ςετ
ഁ͍͢͠ςετ • ςετέʔεͷ͕૿͑Δʹ࿈Εͯɺʮ৮ͬ ͍ͯͳ͍Օॴͷςετ͕མͪΔʯέʔεͷ૿ Ճɻ • ମݧͱͯ͠ɺʮςετ͕োʯʹͳΔ
ഁ͍͢͠ςετ • ֎෦ཁҼͷมԽʹӨڹ͞ΕΔςετ • ϥϯμϜʹࣦഊ͢Δςετ • FixtureͷมԽʹහײʹམͪΔςετ • …etc
֎෦ཁҼͷมԽʹӨڹ͞ΕΔςετ // test༻CloudSearchʹଓ͢Δ $search = CloudSearchWrapper::factory(); $search->conditions() ->keyword(‘test’, ‘title’) ->sort(‘list_order
asc’); // test༻CloudSearchʹσʔλొ $search->documentBatch($this->addJson()); // σʔλొ͞ΕΔ·Ͱ͙͢ʹݕࡧͰ͖ͳ͍ͷͰɺͭ sleep(3); // ݕࡧ࣮ߦ $result = $search->search($search->conditions()->query()); ωοτϫʔΫঢ়گʹґଘͯ͠མͪΔ
ϥϯμϜʹࣦഊ͢Δςετ $val = mt_rand(0, 100); $result = $this->Sample->exec($val); $this->assertTrue($result);
“0”͕ग़ͨͱ͖͚ͩམͪΔ
FixtureͷมԽʹහײʹམͪΔςετ $data = [‘name’ => ‘hogehoge’]; $result = $this->Sample->saveSample($data); $expected
= [ ‘id’ => 1, ‘name’ => ‘hogehoge’, ]; $data = ClassRegistry::init(‘Sample’)->find(‘first’, [ ‘conditions’ => [‘name’ => ‘hogehoge’] ]; $this->assertSame($expected, $data); Sample modelʹରԠ͢ΔϑΟΫενϟʹɺ ϨίʔυΛೖΕΔͱɺ ɹsave࣌ͷid͕auto increment͞ΕམͪΔ
ഁ͠ʹ͍͘ςετ • ςετʹର͢Δݟ͕ཷ·͖͍ͬͯͯΔ • ίʔυϨϏϡʔʹͯɺܦݧࡁΈͷʮഁ͠ ͍͢ςετʯ͕ฆΕ͍ͯͳ͍͔Λ֬ೝ͢ Δ
͜Ε͔Βͷ՝
͜Ε͔Βͷ՝ • ༷ԽςετͷϦϑΝΫλϦϯά • ഁ͠ʹ͍͘ςετΛॻ͍͍ͯ͘
༷ԽςετͷϦϑΝΫλϦϯά • ࠓճͷ༷ԽςετͰɺʮطଘͷৼΔ͍ʯΛ͍ ൣғͰอޢͨ͠ • ͍͕Ώ͑ʹɺςετ͕ରΫϥε͔Βԕ͍ॴ͕ݪҼ Ͱམͪͨࡍɺಛఆ͕͍͠ • “ςετ͕ςετର͔ΒΕΕΕΔ΄Ͳɺςετͷࣦഊ͕ԿΛҙ ຯ͢Δ͔ͷஅ͕͘͠ͳΓ·͢ɻ”ʢʰϨΨγʔίʔυվળΨΠ
υʱʣ • ςετϝϯςφϯεରͱͯ͠खΛೖΕଓ͚Δඞཁੑ
ഁ͠ʹ͍͘ςετΛॻ͍͍ͯ ͘ • ςετᴈ໌ظςετ͕গͳ͍࣌ظ • ʮͱʹ͔͘ςετΛॻ͘ʯ͜ͱʹར • ςετέʔε͕૿͖͑ͯͨ • ഁ͠ʹ͍͘ςετΛॻ͍ͯɺϝϯςφϯε
ੑΛ͍͋͛ͯ͘
·ͱΊ
·ͱΊ • ςετͷͳ͍ίʔυʹରͯ͠ςετΛॻ͍ͯ ͍ͬͨ • طଘͷίʔυΛอޢ͢ΔͨΊͷ༷Խςετ Λߦͬͨ • ٻΊΒΕΔςετίʔυ͕ঢ়گʹΑͬͯҟͳ Δɺܧଓతͳϝϯςφϯε͕ඞཁɻ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·͠ ͨɻ BASEגࣜձࣾ ౦ޱᏻ @Khigashiguchi