2012-09-17 3 views
1

나는 mysql_ * 코드를 PDO 코드로 변환하는 과정을 밟았다. 나는 그것을 달리고 그것이 작동하는 것을 확인합니다. 난 그냥 stackoverflow의 검토, 내가 제대로 연결을 죽이고 있는지 확인하기 위해, 나는 다른 방법 (예 : 트랜잭션)을 사용해야하며 방대한 보안 결함이 없는지 확인해야한다. 코드는 다음과 같습니다.mysql에 PHP PDO 액세스

<?php 
try { 
    $link = new PDO('mysql:****;dbname=****;charset=UTF-8','****','****'); 
    $link->exec("INSERT INTO Registration (`First Name`, `Last Name`) VALUES ('$_POST[fname]', '$_POST[lname]')"); 
} catch(PDOException $e) { 
    print "Error!: " . $e->getMessage() . "<br/>"; 
    die(); 
} 
?> 

내가 말한 것처럼 작동하지만 100 명이 동시에 등록 할 때 안전하고 효과적 이길 원합니다. 모든게 괜찮아 보이니?

+0

- 당신은 단지 사용자가 제공 한 입력에 추가하는 경우에는 보안 이득이 사용하는 전혀 없다 PDO. – andrewsi

+0

내 간단한 단일 파일 [PDO 라이브러리] (https://github.com/Xeoncross/DByte)를 사용할 수 있으므로 SQL 인젝션이나 전역 변수'$ link'를 페이지 주위로 전달할 필요가 없습니다 . 지금은 쿼리 문자열에 변수를 직접 삽입하므로 안전하지 않습니다. – Xeoncross

+0

쿼리에서 직접 사용자의 위생되지 않은 데이터를 사용하지 마십시오. 또한 배열 변수를 사용할 때 키 주위에 작은 따옴표 나 큰 따옴표를 넣으십시오. – AdamGold

답변

5

아니요. mysql_을 PDO 1 : 1로 변환 중입니다. 이 방법으로, mysql_의 문제는 또한 PDO에서 문제가 될 것입니다.

준비된 쿼리와 매개 변수 바인딩을 확인해야합니다. 여기

무슨 뜻인지의 예는 다음과 같습니다

$dbh = new PDO('mysql:****;dbname=****;charset=UTF-8','****','****'); 

$first = 'John'; 
$last = 'Doe'; 

$stmt = $dbh->prepare(
    "INSERT INTO Registration (firstname, lastname) VALUES (:first, :last)"); 
$stmt->bindParam(':first', $first); 
$stmt->bindParam(':last', $last); 

$stmt->execute(); 

// insert another row with different values 
$first = 'John'; 
$last = 'Smith'; 
$stmt->execute(); 
당신은 당신의 SQL을 생성하는 바인딩 매개 변수를 사용한다
+1

이것을 for-loop에 넣을 수 있습니까? 왜냐하면 내가 삽입하고 싶은 사람이 21 명이라면, $ _POST를 반복하여 모든 사람을 추가 할 수 있습니까? – Richard

+1

가능합니다. dbh를 작성하고 조회를 한 x 준비하십시오. 그런 다음 루프를 반복하고 모든 루프에서 매개 변수를 변경하고 실행합니다. mysql_escape_stuff를 수행 할 필요가 없습니다! – JvdBerg

+0

알았습니다. 그래서 bindParam 함수가 무엇인지 모르겠습니다. 나는 그것에 대한 문서를 읽으려고했지만 그 목적을 완전히 이해하지 못하고있다. $ 변수가 SQL 문에 바인드된다는 것을 이해합니다. 그러나 그 점이 나를 위해 무엇을합니까? – Richard