현재 위치: > 최신 기사 목록> pdostatement :: bindValue를 올바르게 사용하여 SQL 문에서 매개 변수를 바인드하는 방법은 무엇입니까?

pdostatement :: bindValue를 올바르게 사용하여 SQL 문에서 매개 변수를 바인드하는 방법은 무엇입니까?

gitbox 2025-06-27

pdostatement :: bindValue를 올바르게 사용하여 SQL 문에서 매개 변수를 바인드하는 방법은 무엇입니까?

PHP에서 PDO (PHP 데이터 객체)는 데이터베이스에 액세스하는 가벼운 방법입니다. MySQL, PostgreSQL, SQLite 등과 같은 여러 데이터베이스 유형을 지원합니다 . 이는 SQL 주입 문제를 피할뿐만 아니라 코드의 유지 관리 가능성과 가독성을 향상시킵니다. 이 기사에서는 BindValue를 올바르게 사용하여 바인드를 올바르게 사용하는 방법을 자세히 설명합니다.

pdostatement :: bindvalue 란 무엇입니까?

pdostatement :: bindvalue는 값을 SQL 문에 바인딩하기 위해 PDO에서 사용되는 지정된 매개 변수입니다. 이 메소드는 값을 매개 변수에 바인딩하고 SQL 문을 실행할 때 SQL 문의 자리 표시자를 자동으로 교체 할 수 있습니다. 이 작업을 수행하는 데 두 가지 이점이 있습니다.

  1. SQL 주입 공격 방지 : 자리 표시자를 바인딩 값으로 교체하면 들어오는 값이 SQL 쿼리에 악의적으로 주입되지 않도록 할 수 있습니다.

  2. 코드는 명확하고 유지하기가 쉽습니다 . 자리 표시 자 및 바인딩 매개 변수의 사용으로 인해 SQL 문은 데이터 자체와 명확하고 분리되어 나중에 수정하기가 더 쉽습니다.

BindValue 방법의 기본 사용

BindValue 메소드의 기본 구문은 다음과 같습니다.

 <span><span><span class="hljs-title class_">PDOStatement</span></span><span>::</span><span><span class="hljs-title function_ invoke__">bindValue</span></span><span>(</span><span><span class="hljs-variable">$parameter</span></span><span>, </span><span><span class="hljs-variable">$value</span></span><span>, </span><span><span class="hljs-variable">$data_type</span></span><span> = PDO::</span><span><span class="hljs-variable constant_">PARAM_STR</span></span><span>);
</span></span>
  • $ PARAMETER : 이것은 SQL 문의 자리 표시 자이며, 이는 이름의 자리 표시 자 (예 : 사용자 이름 ) 또는 물음표 자리 표시 자 ( ? ) 일 수 있습니다.

  • $ value : 바인딩 해야하는 값.

  • $ data_type (선택 사항) : 바운드 값의 유형. 일반적으로 pdo :: param_str (기본값), pdo :: param_int , pdo :: param_bool 및 기타 유형을 선택할 수 있습니다.

예 : 지명 된 자리 표시 자 사용

사용자의 사용자 이름을 기반으로 사용자의 자세한 정보를 얻고 쿼리를 얻기 위해 쿼리를 실행하려고한다고 가정합니다.

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// 만들다 PDO 예</span></span><span>
</span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-string">'mysql:host=localhost;dbname=test'</span></span><span>, </span><span><span class="hljs-string">'root'</span></span><span>, </span><span><span class="hljs-string">''</span></span><span>);

</span><span><span class="hljs-comment">// 준비하다 SQL 성명,지명 된 자리 표시자를 사용합니다</span></span><span>
</span><span><span class="hljs-variable">$sql</span></span><span> = </span><span><span class="hljs-string">"SELECT * FROM users WHERE username = :username"</span></span><span>;

</span><span><span class="hljs-comment">// 전처리 SQL 성명</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-variable">$sql</span></span><span>);

</span><span><span class="hljs-comment">// 사용 bindValue 바인딩 매개 변수</span></span><span>
</span><span><span class="hljs-variable">$username</span></span><span> = </span><span><span class="hljs-string">'john_doe'</span></span><span>;
</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">bindValue</span></span><span>(</span><span><span class="hljs-string">':username'</span></span><span>, </span><span><span class="hljs-variable">$username</span></span><span>, PDO::</span><span><span class="hljs-variable constant_">PARAM_STR</span></span><span>);

</span><span><span class="hljs-comment">// 쿼리를 실행하십시오</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();

</span><span><span class="hljs-comment">// 결과를 얻으십시오</span></span><span>
</span><span><span class="hljs-variable">$user</span></span><span> = </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">fetch</span></span><span>(PDO::</span><span><span class="hljs-variable constant_">FETCH_ASSOC</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$user</span></span><span>);
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

위의 코드에서 : 사용자 이름은 SQL 문에서 명명 된 자리 표시 자이며, BindValue 메소드는 실제 사용자 이름 John_doe를 해당 자리 표시 자에게 바인딩합니다. SQL이 실행되면 : 사용자 이름은 John_doe 로 대체됩니다.

예 : 물음표 자리 표시자를 사용하십시오

자리 표시 자의 이름을 지정하는 것 외에도 자리 표시 자로 물음표 ( ? )를 사용할 수도 있습니다. 다음은 물음표 자리 표시자를 사용하는 예입니다.

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// 만들다 PDO 예</span></span><span>
</span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-string">'mysql:host=localhost;dbname=test'</span></span><span>, </span><span><span class="hljs-string">'root'</span></span><span>, </span><span><span class="hljs-string">''</span></span><span>);

</span><span><span class="hljs-comment">// 준비하다 SQL 성명,사용问号占位符</span></span><span>
</span><span><span class="hljs-variable">$sql</span></span><span> = </span><span><span class="hljs-string">"SELECT * FROM users WHERE username = ?"</span></span><span>;

</span><span><span class="hljs-comment">// 전처리 SQL 성명</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-variable">$sql</span></span><span>);

</span><span><span class="hljs-comment">// 사용 bindValue 바인딩 매개 변수</span></span><span>
</span><span><span class="hljs-variable">$username</span></span><span> = </span><span><span class="hljs-string">'jane_doe'</span></span><span>;
</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">bindValue</span></span><span>(</span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-variable">$username</span></span><span>, PDO::</span><span><span class="hljs-variable constant_">PARAM_STR</span></span><span>);  </span><span><span class="hljs-comment">// 첫 번째 물음표 자리 표시자를 묶습니다</span></span><span>

</span><span><span class="hljs-comment">// 쿼리를 실행하십시오</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();

</span><span><span class="hljs-comment">// 결과를 얻으십시오</span></span><span>
</span><span><span class="hljs-variable">$user</span></span><span> = </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">fetch</span></span><span>(PDO::</span><span><span class="hljs-variable constant_">FETCH_ASSOC</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$user</span></span><span>);
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

이 예에서는 BindValue 메소드의 첫 번째 매개 변수 1 에 의해 첫 번째 물음표 자리 표시기를 바인딩합니다. 물음표 자리 소지자의 순서는 0이 아닌 1에서 시작합니다.

BindValue와 Bindparam의 차이

BindValueBindparam은 모두 SQL 매개 변수 결합에 사용되지만, 그들 사이에는 몇 가지 미묘한 차이가 있습니다.

  • BindValue는 즉시 자리 표시 자에게 값을 바인딩하며, 후속 실행에 관계없이 바인딩 값은 항상 초기에 전달 된 값입니다.

  • Bindparam은 변수에 대한 참조를 바인딩합니다. 즉, SQL 문을 실행하기 전에이 변수의 값이 수정되면 바운드 매개 변수도 변경됩니다.

예를 들어:

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-string">'mysql:host=localhost;dbname=test'</span></span><span>, </span><span><span class="hljs-string">'root'</span></span><span>, </span><span><span class="hljs-string">''</span></span><span>);

</span><span><span class="hljs-comment">// 사용 bindValue</span></span><span>
</span><span><span class="hljs-variable">$sql</span></span><span> = </span><span><span class="hljs-string">"SELECT * FROM users WHERE username = :username"</span></span><span>;
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-variable">$sql</span></span><span>);
</span><span><span class="hljs-variable">$username</span></span><span> = </span><span><span class="hljs-string">'john_doe'</span></span><span>;
</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">bindValue</span></span><span>(</span><span><span class="hljs-string">':username'</span></span><span>, </span><span><span class="hljs-variable">$username</span></span><span>);
</span><span><span class="hljs-variable">$username</span></span><span> = </span><span><span class="hljs-string">'jane_doe'</span></span><span>;  </span><span><span class="hljs-comment">// 수정 된 변수 값</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();  </span><span><span class="hljs-comment">// 查询会사용 john_doe</span></span><span>

</span><span><span class="hljs-comment">// 사용 bindParam</span></span><span>
</span><span><span class="hljs-variable">$sql</span></span><span> = </span><span><span class="hljs-string">"SELECT * FROM users WHERE username = :username"</span></span><span>;
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-variable">$sql</span></span><span>);
</span><span><span class="hljs-variable">$username</span></span><span> = </span><span><span class="hljs-string">'john_doe'</span></span><span>;
</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">bindParam</span></span><span>(</span><span><span class="hljs-string">':username'</span></span><span>, </span><span><span class="hljs-variable">$username</span></span><span>);
</span><span><span class="hljs-variable">$username</span></span><span> = </span><span><span class="hljs-string">'jane_doe'</span></span><span>;  </span><span><span class="hljs-comment">// 수정 된 변수 값</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();  </span><span><span class="hljs-comment">// 查询会사용 jane_doe</span></span><span>
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

위에서 볼 수 있듯이 BindValue는 전달 된 초기 값을 사용하는 반면 Bindparam은 수정 된 값을 사용합니다.

BindValue의 일반적인 응용 시나리오

  1. SQL 주입 방지 : 자리 표시 자 및 결합 매개 변수를 통해 SQL 주입 공격을 효과적으로 피할 수 있습니다.

  2. 동일한 쿼리를 여러 번 실행하십시오 . BindValue를 사용하여 매번 다른 매개 변수 만 동일한 쿼리를 여러 번 실행 해야하는 경우, 성능을 향상시키고 코드를 깔끔하게 유지할 수 있습니다.

  3. 가독성 및 유지 관리 : 자리 표시 자 및 매개 변수 바인딩을 사용하면 SQL 문을 더 명확하고 읽기 쉽고 이해하기 쉽고 특히 복잡한 쿼리에서 쉽게 읽을 수 있습니다.

요약

pdostatement :: bindvalue는 코드의 보안 및 가독성을 향상시키면서 파라미터를 바인딩하여 SQL 문의 실행을 단순화하는 매우 유용한 도구입니다. 이를 올바르게 사용하면 개발자가 SQL 주입을 피하고 데이터베이스 쿼리의 신뢰성을 보장 할 수 있습니다. 복잡한 데이터베이스 상호 작용을 처리 할 때 PDO 사용을 마스터하는 것은 모든 PHP 개발자에게 필수 기술입니다.