2012-11-17 3 views
0

저는 PHP에 매우 익숙하며 mysqli 대신 PDO를 사용해 보았습니다. 그러나 제출을 클릭하면 firstname 및 lastname 값을 SQL 데이터베이스로 가져올 수 없습니다. 내가 뭘 놓치고 있니?데이터가 PDO에서 제출되지 않음

<!DOCTYPE HTML> 

<?php 

$server = 'localhost'; 
$user = 'xxxx'; 
$pass = 'xxxxx'; 
$db = 'xxxxxx'; 

try { 
    $con = new PDO("mysql:host=$server;dbname=$db",$user,$pass); 
} 
catch(PDOException $e) { 
    echo $e->getMessage(); 
} 

?> 

<html> 
<form name="Contact form" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST"> 
First name: <input type="text" name="firstname"><br /> 
Last name: <input type="text" name="lastname"><br /> 
<input type="submit" value="Submit this!" name="submit"> 
</form> 
</html> 

<?php 

if(isset($_POST['submit'])) { 

$sql = $con->query("INSERT INTO names (fname,lname) VALUES (:$_POST[firstname],:$_POST[lastname])"); 

} 

?> 

<?php $con = null; ?> 
+1

PHP를 올바르게 읽고 있다고 가정합니다. 매개 변수화 된 값을 사용하지 않으므로 SQL은 주입 공격에 취약합니다. – Daedalus

+0

': $ _ POST [firstname]'이 이상하게 보입니다. 콜론이 ... 거기에 있다고 가정합니다. 나는 항상 나의 가치를 매개 변수화한다. – Kubee

+1

@ 쿠위 : 아니, 거기에 있어야하지 않아. "올바른"(보안 관점에서 볼 때 끔찍한) 방법은 콜론을 생략하는 것입니다. –

답변

2

문제는이 라인에 :

$sql = $con->query("INSERT INTO names (fname,lname) VALUES (:$_POST[firstname],:$_POST[lastname])"); 

콜론이 안와 삽입 된 값은 인용되어야한다. 달성 할 수있는 가장 쉬운 방법은 준비된 쿼리를 사용하는 것입니다.

$statement = $con->prepare(
    'INSERT INTO names (fname,lname) 
    VALUES (:firstname,:lastname)'); 
$result = $statement->exec(array(
    'firstname' => $_POST['firstname'], 
    'lastname' => $_POST['lastname'])); 

또한 SQL 주입에 대해 더 자세히 읽어보십시오. 원본 코드에는 보안 결함이 있습니다. 당신이 다음 ->query() 당신이 다양한에 $con->quote()를 사용할 필요가 사용할 경우

$st = $con->prepare("INSERT INTO names (fname,lname) VALUES (:first, :last)"); 
$result = $st->execute(array("first"=>$_POST["firstname"], "last"=>$_POST["lastname"])); 

: 당신은한다고 http://php.net/manual/en/security.database.sql-injection.php

0

실제로 준비된 문/바인딩 매개 변수를 사용하는 ->prepare->execute 전화로 ->query()에게 그것을 분할보기 문자열 변수를 쿼리에 연결하기 전에

관련 문제