2012-11-18 46 views
0

我對PHP很陌生,我正在嘗試一些示例。出於某種原因,當我單擊窗體上的提交時,數據不會插入到我的SQL數據庫中。有沒有理由不會?數據不會提交到SQL數據庫

<!DOCTYPE HTML> 

<?php 

$server = 'x'; 
$user = 'x'; 
$pass = 'x'; 
$db = 'x'; 

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

?> 

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

<?php 

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

$firstname = $_POST['firstname']; 
$lastname = $_POST['lastname']; 
$q = "INSERT INTO names(fname,lname) VALUES(:firstname,:lastname)"; 
$query = $con->prepare($q); 
$result = $query->execute(array(
    ":firstname" => $firstname, 
    ":lastname" => $lastname 
    )); 
} 

$con = null; 
?> 

回答

2

您應該始終檢查數據庫連接的返回狀態或準備或執行語句。這樣你可以得到更多的信息,爲什麼它失敗了。你正在捕捉連接中可能出現的異常,這很好。但是我注意到,如果發生連接錯誤,您的代碼只會輸出錯誤消息,然後繼續,就好像連接成功了一樣。換句話說,即使你沒有有效的連接,你也會嘗試準備一個INSERT。如果失敗,你應該停止執行,並且不要對db連接做任何事情。

例如,而不是echo,請使用die()。這會在打印錯誤時停止腳本。隨着您更熟練地使用PHP,您可以在錯誤附近添加HTML,因此看起來更好,並且可以讓用戶鏈接轉到其他頁面以再次嘗試。

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

同樣的SQL語句可能會失敗,如果你有在表上沒有特權,或者如果表不存在,或者您構成SQL語法錯誤,或任何其他原因準備。如果您提供的值非法,或者如果磁盤已滿或其他原因導致插入操作失敗,SQL語句也可能會在執行時失敗。

一般而言,如果出現問題,返回值爲false。下面是檢查他們的例子:

$q = "INSERT INTO names(fname,lname) VALUES(:firstname,:lastname)"; 
$query = $con->prepare($q); 
if ($query === false) { 
    die(print_r($query->errorInfo()), true)); 
} 

$result = $query->execute(array(
    ":firstname" => $firstname, 
    ":lastname" => $lastname 
    )); 
} 
if ($result === false) { 
    die(print_r($query->errorInfo()), true)); 
} 

如果你得到任何錯誤,看看他們在MySQL手冊:http://dev.mysql.com/doc/refman/5.5/en/error-handling.html

+0

原來,我不得不設置爲INT而不是文本表的名稱。謝謝你提醒我回去檢查一下,因爲如果不先研究它,我可能從來沒有發現過。我也接受了關於die()命令的建議。謝謝! – flye190