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 を準備しようとします。実行を停止し、失敗した場合は 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

于 2012-11-18T01:26:16.770 に答える