0

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

1 回答 1

2

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

例如,代替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

于 2012-11-18T01:26:16.770 回答