2012-11-17 75 views
0

我對PHP很陌生,嘗試使用PDO而不是mysqli。但是,當我單擊「提交」時,我無法將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

@Kubee:不,它不應該在那裏。 「正確的」(但從安全的角度來看,可怕的)寫作方式是省略冒號。 –

回答

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注入的更多信息。您的原始代碼存在安全漏洞。見http://php.net/manual/en/security.database.sql-injection.php

0

你應該把它分割​​成->prepare->execute調用實際利用準備好的語句/必然會參數:

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

如果你想使用​​那麼你需要在不同的使用$con->quote()字符串變量,然後將其連接到查詢中。