2012-11-18 48 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