2009-08-10 4 views
2
$columns = "name, address, city, state, zip"; 
$values = "'$name', '$address', '$city', '$state', '$zip'"; 
$query = "insert into customer values ($values)"; 
$statement = $dbh->prepare($query); 
$statement->execute(); 

저는 완전히 새로운 편입니다. 유치원 사례와 아기 이야기는 불쾌하지 않습니다! :)PDO 명세서는 아무 것도하지 않습니까?

양식이 결과없이 오류없이 실행됩니다.

답변

3

우선, 당신은 완전히 잘못 이해 한 진술을했습니다. 여기에 :)

는 그것을 할 방법 : 당신은 의심의 여지가 자신을 볼 수있는 귀하의 예제에서, 당신도 당신의 $columns 변수를 사용하지 않았다

$query = "insert into customer (name, address, city, state, zip) values (?, ?, ?, ?, ?)"; 
$statement = $dbh->prepare($query); 
$statement->execute(array($name, $address, $city, $state, $zip)); 

. 그것은 쿼리의 일부가되어야합니다.

두 번째 실수는 데이터 변수를 문자열로 직접 보간하려고했기 때문입니다. 준비된 진술의 전체 요점은 그것을 피하는 것입니다. 대신 자리 표시자를 사용합니다 (이 경우? 문자). PDO는 실제 변수에 대한 자리 표시자를 동일한 순서로 대체 할 때이를 제공합니다. 이것은 배열을 사용하여 execute-statement에 대한 매개 변수로서 PDO에 보내어 수행됩니다.

이것은 모든 보안 위험을 제거하므로 전체 쿼리를 문자열로 작성하는 기존 방법보다 훨씬 월등합니다. 당신이했던 방식대로 쿼리를 작성함으로써 생기는 취약점은 매우 실제적이며 아마도 인터넷에서 가장 보편적 인 보안 구멍 일 것입니다. 더 많은 것을 알고 싶다면 "SQL injection"을 검색하십시오.

오류가 발생하지 않는 이유는 오류보고 메커니즘을 설정하지 않았기 때문일 수 있습니다. 연결 후 다음을 추가하십시오.

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
+0

굉장합니다. 도와 주셔서 감사합니다! 2008 년 9 월호의 책과 Lynda.com이 pdo 정보에 대해 완전히 광택을내는 것을 놀라워합니다. 마지막 줄을 $ statement-> execute ($ values)로 변경할 수도 있습니까? ? 함수로 설정하는 것이 너무 가깝습니다. –

+0

아니요, $ 값은 문자열이므로 작동하지 않습니다. execute 매개 변수는 배열이어야합니다. 배열을 변수에 저장 한 후 execute()로 보내지 않을 이유가 없습니다. –

4

시도해보십시오. (여러 가지 방법이 있습니다)

$sql = "INSERT INTO customer (name,address,city,state,zip) VALUES (:name,:address,:city:,state,:zip)"; 

$sth = $dbh->prepare($sql); 
$sth->execute(array(
    ':name' => $name, 
    ':address' => $address, 
    ':city' => $city, 
    ':state' => $state, 
    ':zip' => $zip 
)); 
관련 문제