配列でPOSTされたデータをSQL文使ってMysqlにデータを登録

前回http://q.hatena.ne.jp/1281429669からDBに登録する方法が分かりません。
, 区切りで複数登録できることは知ってます。

確認画面 登録部分は前回質問にて
<?php $dateArray = array( date("Y-m-j"), date("Y-m-d",strtotime("+1 day")), date("Y-m-d",strtotime("+2 day")), date("Y-m-d",strtotime("+3 day")), date("Y-m-d",strtotime("+4 day")), date("Y-m-d",strtotime("+5 day")), date("Y-m-d",strtotime("+6 day")));
?>
<form action="syuxtukin_fix.php" method="POST">
<table border="1">
<tr>
<td>ID</td>
<td>名前</td>
<?php foreach( $dateArray as $d ) {?>
<td><?php echo $d ?></td>
<?php } ?>
</tr>
<?php foreach( $_POST['name'] as $k1 => $v1 ) {?>
<tr>
<td><?php echo $k1 ?></td><td><?php echo $v1 ?></td>
<?php foreach( $dateArray as $d ) {?>
<td>
<?php if(isset($_POST['data'][$k1][$d])){echo "出勤";}?>
<?php $_SESSION["data"] = $_POST['data'] ;?>
</td>
<?php
} ?>
<?php } ?>
</tr>
<tr>
<td>
<input type="submit" value="登録" />
<input type="button" value="戻る" onClick="history.back();" />
</td>
</tr>
</table>

完了画面(syuxtukin_fix.html)こちらにSQL文を書きたい
<?php
session_start();
?>
<?php
$data = $_SESSION["data"];
print_r($data);
session_unset();
?>
PEAR:DB使ってます
テーブルはひとつのIDでその日が出勤するかどうかをひとつのデータとしています。

回答の条件
  • URL必須
  • 1人3回まで
  • 13歳以上
  • 登録:2010/08/11 12:14:39
  • 終了:2010/08/11 15:05:24

ベストアンサー

id:windofjuly No.1

うぃんど回答回数2625ベストアンサー獲得回数11492010/08/11 14:43:31

ポイント80pt

PEAR-DB環境は現在利用していないのでテストはしておりません。参考URL先を参照しつつ下記の順序で利用してください

【1】接続

require_once 'DB.php';
$dsn = 'mysql://ユーザー名:パスワード@ホスト名/データベース名';
$db = DB::connect($dsn);
if (PEAR::isError($db)) {
    die($db->getMessage());
}

【2】クエリ実行

データベースの作業手順は、該当する日付範囲をデリートして、新たにインサートするという手順になります

どちらかの作業が失敗した場合はロールバック(データベース操作開始前の状態に戻す)して作業を終えます

ロールバックを利用するためMySQLのデータベースエンジンは InnoDB が必須となります

$s1 = "DELETE FROM テーブル名 WHERE 日付 BETWEEN '" . date("Y-m-j") . "' AND '" . date("Y-m-d",strtotime("+6 day")) . "'";
$db->autoCommit( false ); 
$res = $db->query($s1);
if( DB :: isError( $res ) ){ 
      $db->rollback();
      die( $res->getMessage() ); 
}
if ( count( $data ) > 0 ) {
    $dataArray = array();
    foreach( $data as $k1 => $v1 ) {
        foreach( $data[$k1] as $k2 => $v2 ) {
            $dataArray[] = sprintf("(%s,'%s',%s)", $k1, $k2, $v2 );
        }
    }
    $s2 = 'INSERT INTO テーブル名(日付,ID,出勤) VALUES ' . implode( ',', $dataArray );
    $res = $db->query($s2);
    if( DB :: isError( $res ) ){ 
          $db->rollback();
          die( $res->getMessage() ); 
    }
}
$db->commit();

MyISAMのようにロールバックできないデータベースエンジン利用の場合は失敗した場合に不整合が発生する覚悟で次のようになります

$s1 = "DELETE FROM テーブル名 WHERE 日付 BETWEEN '" . date("Y-m-j") . "' AND '" . date("Y-m-d",strtotime("+6 day")) . "'";
$res = $db->query($s1);
if( DB :: isError( $res ) ){ 
      die( $res->getMessage() ); 
}
if ( count( $data ) > 0 ) {
    $dataArray = array();
    foreach( $data as $k1 => $v1 ) {
        foreach( $data[$k1] as $k2 => $v2 ) {
            $dataArray[] = sprintf("(%s,'%s',%s)", $k1, $k2, $v2 );
        }
    }
    $s2 = 'INSERT INTO テーブル名(日付,ID,出勤) VALUES ' . implode( ',', $dataArray );
    $res = $db->query($s2);
    if( DB :: isError( $res ) ){ 
          die( $res->getMessage() ); 
    }
}

【3】開放

$db->disconnect();

参考URL

http://pear.php.net/manual/ja/package.database.db.php

id:goodbabies

す、すごいです・・・感激しました。実は別の方法で登録事態はできたのですが、なにせソースが汚いものでして・・・

windofjulyさんのやり方をまねしたいと思います!ありがとうございます!

2010/08/11 15:04:01

その他の回答(1件)

id:windofjuly No.1

うぃんど回答回数2625ベストアンサー獲得回数11492010/08/11 14:43:31ここでベストアンサー

ポイント80pt

PEAR-DB環境は現在利用していないのでテストはしておりません。参考URL先を参照しつつ下記の順序で利用してください

【1】接続

require_once 'DB.php';
$dsn = 'mysql://ユーザー名:パスワード@ホスト名/データベース名';
$db = DB::connect($dsn);
if (PEAR::isError($db)) {
    die($db->getMessage());
}

【2】クエリ実行

データベースの作業手順は、該当する日付範囲をデリートして、新たにインサートするという手順になります

どちらかの作業が失敗した場合はロールバック(データベース操作開始前の状態に戻す)して作業を終えます

ロールバックを利用するためMySQLのデータベースエンジンは InnoDB が必須となります

$s1 = "DELETE FROM テーブル名 WHERE 日付 BETWEEN '" . date("Y-m-j") . "' AND '" . date("Y-m-d",strtotime("+6 day")) . "'";
$db->autoCommit( false ); 
$res = $db->query($s1);
if( DB :: isError( $res ) ){ 
      $db->rollback();
      die( $res->getMessage() ); 
}
if ( count( $data ) > 0 ) {
    $dataArray = array();
    foreach( $data as $k1 => $v1 ) {
        foreach( $data[$k1] as $k2 => $v2 ) {
            $dataArray[] = sprintf("(%s,'%s',%s)", $k1, $k2, $v2 );
        }
    }
    $s2 = 'INSERT INTO テーブル名(日付,ID,出勤) VALUES ' . implode( ',', $dataArray );
    $res = $db->query($s2);
    if( DB :: isError( $res ) ){ 
          $db->rollback();
          die( $res->getMessage() ); 
    }
}
$db->commit();

MyISAMのようにロールバックできないデータベースエンジン利用の場合は失敗した場合に不整合が発生する覚悟で次のようになります

$s1 = "DELETE FROM テーブル名 WHERE 日付 BETWEEN '" . date("Y-m-j") . "' AND '" . date("Y-m-d",strtotime("+6 day")) . "'";
$res = $db->query($s1);
if( DB :: isError( $res ) ){ 
      die( $res->getMessage() ); 
}
if ( count( $data ) > 0 ) {
    $dataArray = array();
    foreach( $data as $k1 => $v1 ) {
        foreach( $data[$k1] as $k2 => $v2 ) {
            $dataArray[] = sprintf("(%s,'%s',%s)", $k1, $k2, $v2 );
        }
    }
    $s2 = 'INSERT INTO テーブル名(日付,ID,出勤) VALUES ' . implode( ',', $dataArray );
    $res = $db->query($s2);
    if( DB :: isError( $res ) ){ 
          die( $res->getMessage() ); 
    }
}

【3】開放

$db->disconnect();

参考URL

http://pear.php.net/manual/ja/package.database.db.php

id:goodbabies

す、すごいです・・・感激しました。実は別の方法で登録事態はできたのですが、なにせソースが汚いものでして・・・

windofjulyさんのやり方をまねしたいと思います!ありがとうございます!

2010/08/11 15:04:01
id:yamaneroom No.2

yamaneroom回答回数1040ベストアンサー獲得回数612010/08/11 15:01:09

SQLのINSERT文を使う。


DB構造が分からないので具体的な回答はできない。

詳細は下記参照。

http://www.phpbook.jp/pear/pear_db/index9.html

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません