--- id: sql-prepared-statements title: "SQL Prepared Statements" category: "Database" status: "draft" verification_status: "conceptual" canonical_id: "" aliases: ["Prepared Statements", "SQL μ€€λΉ„λœ λ¬Έ"] duplicate_of: "" source_trust_level: "B" confidence_score: 0.87 created_at: 2026-07-04 updated_at: 2026-07-04 review_reason: "" merge_history: [] tags: ["sql", "database", "w3schools", "security", "prepared-statements", "php", "mysql"] raw_sources: ["https://www.w3schools.com/sql/sql_prepared_statements.asp"] applied_in: [] github_commit: "" --- # [[SQL Prepared Statements]] ## 🎯 ν•œ 쀄 톡찰 (One-line insight) Prepared statements separate a query's structure (compiled once, sent as a placeholder template) from its data (bound and sent later, possibly many times) β€” gaining security, performance, and bandwidth savings in one mechanism. [S1] ## 🧠 핡심 κ°œλ… (Core concepts) - **Prepared statement** β€” separates the query structure (the SQL) from the actual data (user input). [S1] - **Two-phase lifecycle** β€” Prepare (send a placeholder template like `INSERT INTO MyGuests VALUES(?, ?, ?)`, parsed/compiled/optimized without executing) then Execute (bind values, run β€” repeatable with different values). [S1] - **Four advantages** β€” reduced parsing time (prepared once, executed many times), minimized bandwidth (only parameters sent per call, not the whole query), security (bound values need not be escaped and can't alter the SQL structure), cleaner code (data separated from SQL). [S1] - **Type-tagged binding (MySQL)** β€” `bind_param("sss", ...)` declares each parameter's type (`i`=integer, `d`=double, `s`=string, `b`=binary), which minimizes injection risk by telling MySQL exactly what type to expect. [S1] ## 🧩 μΆ”μΆœλœ νŒ¨ν„΄ (Extracted patterns) - **Prepare-once, execute-many** β€” a single prepared statement can be executed repeatedly with different bound values (three inserts in the example, same statement object). [S1] - **Sanitize inputs from external sources anyway** β€” the source notes that even with prepared statements, data from user input should still be sanitized/validated β€” prepared statements prevent structural injection, not all bad input. [S1] ## πŸ“– μ„ΈλΆ€ λ‚΄μš© (Details) - MySQL prepared statement (PHP), templated insert with three placeholders: [S1] ```php $sql = "INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)"; if($stmt = $conn->prepare($sql)) { $stmt->bind_param("sss", $firstname, $lastname, $email); $firstname = "John"; $lastname = "Doe"; $email = "john@example.com"; $stmt->execute(); // ... repeat with different values, same $stmt } ``` - Type characters for `bind_param`: `i` integer, `d` double, `s` string, `b` binary. [S1] ## βš–οΈ λͺ¨μˆœ 및 μ—…λ°μ΄νŠΈ (Contradictions & updates) μ†ŒμŠ€μ—μ„œ λͺ¨μˆœλ˜λŠ” μ •λ³΄λŠ” λ°œκ²¬λ˜μ§€ μ•ŠμŒ. ## πŸ› οΈ 적용 사둀 (Applied in summary) ν˜„μž¬ 발견된 μ‹€μ œ 적용 사둀가 μ—†μŠ΅λ‹ˆλ‹€ β€” SQL Parameters(λ‹¨μˆœ 바인딩)와 ν•¨κ»˜ SQL Injection λ°©μ–΄μ˜ μ–‘λŒ€ 좕을 이룬닀. [S1] ## πŸ’» μ½”λ“œ νŒ¨ν„΄ (Code patterns) Prepared statement, prepare once execute many (PHP/MySQL): ```php $sql = "INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)"; $stmt = $conn->prepare($sql); $stmt->bind_param("sss", $firstname, $lastname, $email); $stmt->execute(); ``` ## βœ… 검증 μƒνƒœ 및 신뒰도 - **μƒνƒœ:** draft - **검증 단계:** conceptual - **좜처 신뒰도:** B (W3Schools β€” widely used educational reference, not a primary standards body) - **μ‹ λ’° 점수:** 0.87 - **쀑볡 검사 κ²°κ³Ό:** μ‹ κ·œ 생성 (New discovery) ## πŸ”— 지식 κ·Έλž˜ν”„ (Knowledge Graph) - **μƒμœ„/루트:** [[SQL Tutorial]] - **κ΄€λ ¨ κ°œλ…:** [[SQL Injection]], [[SQL Parameters]], [[SQL Stored Procedures]] - **μ°Έμ‘° λ§₯락:** SQL Injection 방어와 반볡 μ‹€ν–‰ μ„±λŠ₯ μ΅œμ ν™”λ₯Ό λ™μ‹œμ— λ‹¬μ„±ν•˜λŠ” ν‘œμ€€ 기법. ## πŸ“š 좜처 (Sources) - [S1] W3Schools β€” SQL Prepared Statements β€” https://www.w3schools.com/sql/sql_prepared_statements.asp ## πŸ“ λ³€κ²½ 이λ ₯ (Change history) - 2026-07-04: Initial draft synthesized from the W3Schools "SQL Prepared Statements" page (Astra wiki-curation, P-Reinforce v3.1 format).