>백엔드 개발 >PHP 튜토리얼 >pdo에서 매개변수화된 쿼리 SQL을 사용한 매개변수화된 설계

pdo에서 매개변수화된 쿼리 SQL을 사용한 매개변수화된 설계

WBOY
WBOY원래의
2016-07-29 08:46:28929검색

BindParam() 및 BindValue() 메서드는 매우 유사합니다.
유일한 차이점은 전자는 PHP 변수를 사용하여 매개변수를 바인딩하는 반면 후자는 값을 사용한다는 것입니다.
그래서 BindParam을 사용할 때 두 번째 매개변수는 변수 값이 아닌 변수 이름만 사용할 수 있고, BindValue는 특정 값만 사용할 수 있습니다.

코드 복사 코드는 다음과 같습니다.


$stm = $pdo->prepare("select * from users where user = :user");
$user = "jack";
//올바름
$stm->bindParam(":user",$user);
//틀림
🎜>/ /$stm->bindParam(":user","jack")
//수정됨
$stm->bindValue(":user",$user)
/ /Correct
$stm->bindValue(":user","jack");


또한 저장 프로시저에서 binParam을 입력/출력 변수에 바인딩할 수 있습니다.

코드 복사 코드는 다음과 같습니다.


$stm = $pdo->prepare(" call func(:param1)");
$param1 = "abcd";
$stm->bindParam(":param1",$param1); //올바른
$stm->실행 ();


저장 프로시저 실행 후의 결과를 변수에 직접 반영할 수 있습니다.
메모리에 있는 대규모 데이터 블록 매개변수의 경우 성능상의 이유로 전자를 먼저 사용해야 합니다.
---------------------------------- -- ---
http://zh.wikipedia.org/wiki/Parameterized Query
Parameterized Query
Parameterized Query(매개변수화된 쿼리 또는 매개변수화된 문)는 설계를 데이터베이스와 연결하고 해당 디자인에 액세스하는 것을 말합니다. 데이터를 입력해야 할 경우, 매개변수를 이용해 값을 제공하는 방식이 현재 SQL 인젝션 공격(SQL 인젝션)을 방지하는 가장 효과적인 방어 방법으로 꼽힌다. 일부 개발자는 매개변수화된 쿼리를 사용하면 프로그램을 유지하기가 더 어려워지거나 일부 기능을 구현하는 것이 매우 불편해질 것이라고 생각할 수 있습니다[소스 요청]. 그러나 매개변수화된 쿼리를 사용하면 발생하는 추가 개발 비용은 일반적으로 훨씬 적습니다. SQL 인젝션 공격 취약점 발견으로 인한 공격으로 인한 손실이 크다.
보안 요소 외에도 매개변수화된 쿼리는 문자열을 연결하는 SQL 문에 비해 성능 이점이 있는 경우가 많습니다. 매개변수화된 쿼리를 사용하면 매개변수를 통해 다양한 데이터가 데이터베이스에 도달할 수 있으므로 동일한 SQL 문을 공유할 수 있습니다. 대부분의 데이터베이스는 반복적인 구문 분석으로 인한 오버헤드를 절약하기 위해 SQL 문을 해석하여 생성된 바이트코드를 캐시합니다. 문자열을 연결하는 SQL 문을 채택하면 연산 데이터가 매개 변수의 일부가 아닌 SQL 문의 일부이기 때문에 많은 수의 SQL 문을 반복적으로 해석하여 불필요한 오버헤드가 발생하게 됩니다.
목차
* 1 원칙
* 2 SQL 명령어 작성 방법
o 2.1 Microsoft SQL Server
o 2.2 Microsoft Access
o 2.3 MySQL
o 2.4 PostgreSQL/ SQLite
* 3 클라이언트 프로그램 작성 방법
o 3.1 ADO.NET
o 3.2 PDO
o 3.3 JDBC
o 3.4 Cold Fusion
[편집] 원리
매개변수화된 쿼리 사용 이 경우 데이터베이스 서버는 매개변수의 내용을 SQL 명령의 일부로 처리하지 않고 데이터베이스가 SQL 명령 컴파일을 완료한 후에 매개변수를 적용합니다. 데이터베이스에서는 실행되지 않습니다.
[편집] SQL 명령어 작성 방법
SQL 명령어를 작성할 때 매개변수를 사용하여 입력해야 하는 값을 나타냅니다. 예:
[편집] Microsoft SQL Server
Microsoft SQL Server의 매개변수 형식은 매개변수 이름에 "@" 문자를 추가하여 구성됩니다. SQL Server도 익명 매개변수 "?"를 지원합니다.
SELECT * FROM myTable WHERE myID = @myID
INSERT INTO myTable(c1, c2, c3, c4) VALUES(@c1, @c2, @c3, @c4)
[편집] Microsoft Access
Microsoft Access는 명명된 매개변수를 지원하지 않으며 익명 매개변수 "?"만 지원합니다.
UPDATE myTable SET c1 = ?, c2 = ?, c3 = ? WHERE c4 = ?
[편집] MySQL
MySQL의 매개변수 형식은 "?" 문자와 매개변수 이름으로 구성됩니다.
UPDATE myTable SET c1 = ?c1, c2 = ?c2, c3 = ?c3 WHERE c4 = ?c4
[편집] PostgreSQL/SQLite
PostgreSQL 및 SQLite의 매개변수 형식 앞에는 ":"이 붙습니다. 매개변수 이름. 물론 Access와 유사한 익명 매개변수도 지원됩니다.
UPDATE "myTable" SET "c1" = :c1, "c2" = :c2, "c3" = :c3 WHERE "c4" = :c4
[편집] Write의 클라이언트 프로그램 작성 방법
클라이언트 코드의 매개변수를 사용하는 코드입니다. 예를 들면 다음과 같습니다.
[편집] ADO.NET
ADO.NET은 ASP.NET 내에서 사용됩니다.
SqlCommand sqlcmd = new SqlCommand("INSERT INTO myTable(c1, c2, c3, c4) VALUES(@c1, @c2, @c3, @c4)", sqlconn)
sqlcmd.Parameters.AddWithValue( "@c1", 1) // @c1 매개변수의 값을 설정합니다.
sqlcmd.Parameters.AddWithValue("@c2", 2) // @c2 매개변수의 값을 설정합니다.
sqlcmd.Parameters.AddWithValue("@c3", 3) // @c3 매개변수의 값을 설정합니다.
sqlcmd.Parameters.AddWithValue("@c4", 4) // @c4 매개변수의 값을 설정합니다.
sqlconn.Open();
sqlcmd.ExecuteNonQuery();
sqlconn.Close();
[편집] PDO
PDO는 PHP 내에서 사용됩니다. PDO 드라이버 사용시 매개변수 쿼리를 사용하는 방법은 일반적으로

코드 복사 코드는 다음과 같습니다.


// 데이터 추상화 계층 객체 인스턴스화
$db = new PDO('pgsql:host=127.0.0.1;port=5432;dbname=testdb')
// SQL 문의 경우 prepare를 실행하고 PDOStatement 객체를 가져옵니다.
$stmt = $db->prepare('SELECT * FROM "myTable" WHERE "id" = :id AND "is_valid" = :is_valid')// Binding Parameter
$stmt->bindValue(':id', $id)
$stmt->bindValue(':is_valid', true)
// 쿼리
$stmt- >execute();//데이터 가져오기
foreach($stmt as $row) {
var_dump($row);
}
[code]
MySQL 전용 드라이버는 다음과 같이 사용할 수도 있습니다:
$db = new mysqli("localhost", "user", "pass", "database")
$stmt = $mysqli -> FROM testUsers WHERE 사용자 이름=? AND 비밀번호=?");
$stmt -> bind_param("ss", $user, $pass);
$stmt -> 실행();
가치 다음 방법은 (mysql_real_escape_string 함수의 이스케이프 덕분에) SQL 주입을 효과적으로 방지할 수 있지만 실제 매개변수화된 쿼리는 아닙니다. 그 본질은 여전히 ​​문자열을 연결하는 SQL 문입니다.
[코드]
$query = sprintf("SELECT * FROM Users where UserName='%s' and Password='%s'",
mysql_real_escape_string($Username),
mysql_real_escape_string($ 비밀번호));
mysql_query($query);


[편집] JDBC

JDBC는 Java에서 사용됩니다.
java.sql.PreparedStatement prep = 연결.prepareStatement(
"SELECT * FROM `users` WHERE USERNAME = ? AND PASSWORD = ?")
prep.setString(1, 사용자 이름)
prep.setString(2, 비밀번호);
prep.executeQuery();
[편집] Cold Fusion
🎜>댓글에서
COMMENT_ID =
위 내용은 매개변수화된 디자인의 내용을 포함하여 매개변수화된 디자인 pdo에서 매개변수화된 쿼리 SQL의 사용을 소개합니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.