DBにページ対応のテーブルを自動生成

課題として、MySQLのDBと連動し、コメント欄を作った。ソースが使いまわしできる。ページにアクセスすると、 自動的にページ名を獲得し、それをnameとして自動的DBにtableを登録することができる。それにより、ページで メッセージをDBに登録し、またDBからメッセージを取り出して、ページのコメント欄に表示することができる。 ソースは以下のように:
<?php
$sv      = '****';  //MySQLホスト名
$dbname  = '****';  //DB名
$user    = '****';  //DB連続ID
$pass    = '****';  //DB連続PW
$item = array();

//pdoによりDBアクセス
try {
    $pdo = new PDO("mysql:dbname=$dbname;host=$sv","$user","$pass",
        array(
            PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET `utf8`"
        )
    );
} catch (PDOException $e) {
    die($e->getMessage());
}


$pgnow = $_SERVER["REQUEST_URI"];
$tbhoge = basename($_SERVER["PHP_SELF"]);
$tb_name1 = str_replace(".","",$tbhoge);//testテーブルがあるか確認したい場合

//ここからテーブル存在チェック関数を作成(MySQL用)

function table_check1($tb_name,$pdo){
    $rs =$pdo->query("SHOW TABLES"); // SHOWはMySQLでしか使えません
    $table = $rs->fetchAll(PDO::FETCH_COLUMN);
    if(in_array($tb_name,$table)){
        return true;
    }
    return false;
}

//ここからがテーブルの存在確認
if(!table_check1($tb_name1,$pdo)){ // testテーブルがなければ・・・

$sql =<<< END
CREATE TABLE {$tb_name1} (
`id` INT( 10 ) NOT NULL AUTO_INCREMENT ,
`uid` INT( 10 ) NOT NULL DEFAULT '0' ,
`name` VARCHAR( 255 ) NOT NULL ,
`comment` TEXT NULL ,
`created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
`modified` TIMESTAMP NOT NULL ,
PRIMARY KEY ( `id` ) ,
UNIQUE (
`name`
)
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
END;

$st=$pdo->query($sql);//テーブルがなければ新たに作成
$message .= "新規に『{$tb_name1}』テーブルを作成しました
"; }else{ $message .= "『{$tb_name1}』テーブルはすでに存在しているため、作成しませんでした
"; } //echo $message; $pdo=null; try { // MySQLサーバへ接続 $pdo = new PDO("mysql:host=$sv; dbname=".$dbname."", $user, $pass); $pdo->beginTransaction(); if($_POST['comment']) { $stmt = $pdo->prepare("INSERT INTO $tb_name1 (uid, name, comment) VALUES (?, ?, ?)"); $stmt->bindValue(1, 1, 1); $stmt->bindValue(2, $_POST['name']); $stmt->bindValue(3, $_POST['comment']); $stmt->execute(); $stmt = null; } $stmt = $pdo->prepare("SELECT * FROM $tb_name1 ORDER BY id DESC"); $stmt->execute(); //$stmt = null; $pdo->commit(); } catch(PDOException $e){ var_dump($e->getMessage()); $pdo->rollBack(); } while($item[] = $stmt->fetch(PDO::FETCH_ASSOC)):endwhile; // 切断 $pdo = null; ?>

コメント欄

Name:

Comment:

id name comment created

TOP