Php 数据不会提交到SQL数据库中

Php 数据不会提交到SQL数据库中,php,sql,pdo,Php,Sql,Pdo,我对PHP非常陌生,正在尝试一些示例。由于某种原因,当我在表单上单击submit时,数据不会插入到我的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 $

我对PHP非常陌生,正在尝试一些示例。由于某种原因,当我在表单上单击submit时,数据不会插入到我的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;
?>


您应该始终检查数据库连接或准备或执行语句的返回状态。这样,您就可以获得更多有关它失败原因的信息。您正在从连接中捕获可能的异常,这很好。但是我注意到,如果确实发生了连接错误,那么代码只会打印错误消息,然后就好像连接成功一样继续运行。换句话说,您将尝试准备插入,即使您没有有效的连接。您应该停止执行,如果db连接失败,就不要对它做任何进一步的操作

例如,使用
die()
而不是
echo
。这会在打印错误时停止脚本。随着您对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手册中查找:

结果是我将表名设置为INT而不是TEXT。谢谢你提醒我回去检查一下,因为如果不先研究一下,我可能永远也不会发现。我也采纳了你关于die()命令的建议。谢谢