MySQLのテーブルにPHPでデータを挿入

いちじく君。
今日はPHPでテーブルに新しい行を挿入するぞ。

はい!くるり先生!

(今日は何だか変なノリで始めてるわね。。。)

では、改めて。。。
挿入させるテーブルはあらかじめ作っておきましょう。

「itijiku_db001」の中にテーブル「tbl_itijiku003」を作ったよ
構成は以下のとおり

はい、それではテーブルにデータを挿入するPHPコードを作ってみましょう。
<form method="POST" action="">
<p>項番:</p>
<INPUT type="text" size="60" maxlength="200" name="入力_項番" value=""><BR>
<p>ページ名:</p>
<INPUT type="text" size="60" maxlength="200" name="入力_ページ名" value=""><BR>
<p>URL:</p>
<INPUT type="text" size="60" maxlength="200" name="入力_URL" value=""><BR>
<INPUT type="hidden" name="送った" value="見て">
<input type="submit" name="btn" value="そ~しん">
</form>
<?php
//データベースに接続するための各情報を変数に入れる。
//データベースサーバ名を変数に入れる。 $dbsv = 'mysql***.db.sakura.ne.jp'; //データベース名を変数に入れる。 $dbnm = 'itijiku_db001'; //データベース ユーザ名を変数に入れる。 $dbid = 'itijiku'; //データベース接続用パスワードを変数に入れる。 $pass = 'itijikunopass';
//PDOによりデータベースに接続する。
$pdo_obj = new PDO('mysql:host='.$dbsv.'; dbname='.$dbnm, $dbid, $pass);
$pdo_obj->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo_obj->exec('SET NAMES utf8');
//テーブルの全データを抽出するSQLを変数に格納する。
if(isset($_POST['送った']) && $_POST['送った'] == '見て'){
try {
$pdo_obj->beginTransaction();
$sql = "INSERT INTO tbl_itijiku003(項番,ページ名,URL)
VALUES (:kouban,:pagemei,:url)";
$stmt = $pdo_obj->prepare($sql);
$stmt->bindValue(':kouban',$_POST['入力_項番'], PDO::PARAM_INT);
$stmt->bindValue(':pagemei',$_POST['入力_ページ名'],PDO::PARAM_STR );
$stmt->bindValue(':url',$_POST['入力_URL'], PDO::PARAM_STR);
$stmt->execute();
$pdo_obj->commit();
echo "処理完了しました。";
} catch (PDOException $Exception) {
$pdo_obj->rollBack();
print "エラー:" . $Exception->getMessage();
}
}
?>

書き込めた

はい、よくできました。
けど、このコードだと一つ問題があって、ページを更新すると、前回と同じ書込処理を行ってしまいます。

これは、一つのページに送信処理、受信処理を書いているために起こることで、この二重送信を防ぐためには処理後に違うページに遷移する必要があります。

根本的な解決方法は、送信処理と受信処理を別々のページに書いてしまえばよいのですが、一つのページで完結させたいので、あれば一工夫が必要ですね。

下のは一案です。
JavaScriptで転送用のページに飛ばしてから、転送先で転送元のURLを調べ、送り返しています。
こうすれば、とりあえずはページを更新しても二重送信はおこりません。
<form method="POST" action="">
<p>項番:</p>
<INPUT type="text" size="60" maxlength="200" name="入力_項番" value=""><BR>
<p>ページ名:</p>
<INPUT type="text" size="60" maxlength="200" name="入力_ページ名" value=""><BR>
<p>URL:</p>
<INPUT type="text" size="60" maxlength="200" name="入力_URL" value=""><BR>
<INPUT type="hidden" name="送った" value="見て">
<input type="submit" name="btn" value="そ~しん">
</form>
<?php
//データベースに接続するための各情報を変数に入れる。
//データベースサーバ名を変数に入れる。
$dbsv = 'mysql***.db.sakura.ne.jp'; //データベース名を変数に入れる。 $dbnm = 'itijiku_db001'; //データベース ユーザ名を変数に入れる。 $dbid = 'itijiku'; //データベース接続用パスワードを変数に入れる。 $pass = 'itijikunopass';
//PDOによりデータベースに接続する。
$pdo_obj = new PDO('mysql:host='.$dbsv.'; dbname='.$dbnm, $dbid, $pass);
$pdo_obj->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo_obj->exec('SET NAMES utf8');
//テーブルの全データを抽出するSQLを変数に格納する。
if(isset($_POST['送った']) && $_POST['送った'] == '見て'){
try {
$pdo_obj->beginTransaction();
$sql = "INSERT INTO tbl_itijiku003(項番,ページ名,URL)
VALUES (:kouban,:pagemei,:url)";
$stmt = $pdo_obj->prepare($sql);
$stmt->bindValue(':kouban',$_POST['入力_項番'], PDO::PARAM_INT);
$stmt->bindValue(':pagemei',$_POST['入力_ページ名'],PDO::PARAM_STR );
$stmt->bindValue(':url',$_POST['入力_URL'], PDO::PARAM_STR);
$stmt->execute();
$pdo_obj->commit();
echo "処理完了しました。";
echo <<<EOF
<script>
location.href='tensou.php';
</script>
'EOFの左側はインデントやスペースを入れない。
EOF;
} catch (PDOException $Exception) {
$pdo_obj->rollBack();
print "エラー:" . $Exception->getMessage();
}
}
?>
【tensou.php】
<?php
$motourl = $_SERVER['HTTP_REFERER'];
header("Location: ".$motourl);
?>

結構、むりやりな感じはするけど、考えれば何通りかの対処方法はありそうだね

プログラミングの書き方は、絶対の正解はないので、楽しんでいろいろやって、よりよい処理方法を模索していきましょう。
お名前