日本史特別講座 ②8/21(水)10:30~12:00 平城京・奈良とはなにか
学習院大学講師 遠山 美都男
初の本格的都城たる大和国の平城京天皇の都としての奈良はお手本とすることで新たな秩序の統合に寄与します。
<?php
add_action('admin_menu', 'add_billmaster_upload_submenu_page');
function add_billmaster_upload_submenu_page()
{
add_submenu_page('users.php', '支払人マスタCSVアップロード', '支払人マスタアップロード', 'manage_options', 'billmaster_csv_upload', 'add_billmaster_upload_menu_page', 5);
}
function add_billmaster_upload_menu_page()
{
if(!current_user_can( 'manage_options' )){
exit;
}
/* HTML特殊文字をエスケープする関数 */
function he($str) {
return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
}
// パラメータを正しい構造で受け取った時のみ実行
if (isset($_FILES['upfile']['error']) && is_int($_FILES['upfile']['error'])) {
try {
/* ファイルアップロードエラーチェック */
switch ($_FILES['upfile']['error']) {
case UPLOAD_ERR_OK:
// エラー無し
break;
case UPLOAD_ERR_NO_FILE:
// ファイル未選択
throw new RuntimeException('File is not selected');
case UPLOAD_ERR_INI_SIZE:
case UPLOAD_ERR_FORM_SIZE:
// 許可サイズを超過
throw new RuntimeException('File is too large');
default:
throw new RuntimeException('Unknown error');
}
$tmp_name = $_FILES['upfile']['tmp_name'];
$detect_order = 'ASCII,JIS,UTF-8,CP51932,SJIS-win';
setlocale(LC_ALL, 'ja_JP.UTF-8');
/* 文字コードを変換してファイルを置換 */
$buffer = file_get_contents($tmp_name);
if (!$encoding = mb_detect_encoding($buffer, $detect_order, true)) {
// 文字コードの自動判定に失敗
unset($buffer);
throw new RuntimeException('Character set detection failed');
}
file_put_contents($tmp_name, mb_convert_encoding($buffer, 'UTF-8', $encoding));
unset($buffer);
/* データベースに接続 */
global $wpdb;
// トランザクションを開始
// $wpdb->query("START TRANSACTION"); // BEGINでもOK
// 処理対象のテーブルをロック
// $wpdb->query("LOCK TABLES wp_em_bookings WRITE");
//プリペアードステートメント
//$stmt = $wpdb->prepare("UPDATE wp_em_bookings SET booking_status = %d WHERE booking_id = %d");
$count_row = 0;
$data=array();
//ファイルを開く
$fp = fopen($tmp_name, 'r');
while ($row = fgetcsv($fp)) {
$count_row++;
if ($row === array(null)) {
// 空行はスキップ
continue;
}
if ($count_row === 1) {
// 1行目はスキップ
continue;
}
if (count($row) <2) {
// カラム数が異なる無効なフォーマット
throw new RuntimeException('Invalid column detected');
}
//0列が受講生番号
//CSVから受講生番号とステータスを取得
$user_number = $row[0];
$user_login = 'W'.substr($user_number, -7, 7);
//受講生番号からユーザIDを取得
$user_data = get_user_by( 'login', $user_login );
$user_id = $user_data->ID;
$bill_status = 0;
//更新実行:請求先ステータスをBに変更
$result = $wpdb->update(
'wp_usermeta',
array( 'meta_value' => 'B'),
array( 'user_id' => $user_id,'meta_key' => 'bill' ),
array( '%s' ),
array( '%d','%s' )
);
//更新実行:請求ステータスを0に変更
$result = $wpdb->update(
'wp_usermeta',
array( 'meta_value' => $bill_status),
array( 'user_id' => $user_id,'meta_key' => 'billcode' ),
array( '%d' ),
array( '%d','%s' )
);
}
if (!feof($fp)) {
// ファイルポインタが終端に達していなければエラー
throw new RuntimeException('CSV parsing error');
}
//ファイルを閉じる
fclose($fp);
// エラー起こしてないか確認
// if( is_wp_error( $result ) ){
// $wpdb->query('ROLLBACK'); // Rollback
// 必要があればエラー処理
// return;
// }
// $wpdb->query('COMMIT'); // Commit
/* 結果メッセージをセット */
if (isset($result)) {
// 1回以上実行された
$msg = array('green', '正常にインポートされました');
} else {
// 1回も実行されなかった
$msg = array('black', 'インポートされませんでした');
}
}catch( Exception $e ){
// $wpdb->query('ROLLBACK'); // Rollback
/* エラーメッセージをセット */
// $msg = array('red', $e->getMessage());
}finally{
// テーブルのロックを解除
// $wpdb->query('UNLOCK TABLES');
}
}
?>
<h2>支払人マスタアップロードページ</h2>
<?php if (isset($msg)): ?>
<div class="upl">
<fieldset>
<legend>結果</legend>
<span style="color:<?=he($msg[0])?>;"><?=he($msg[1])?></span>
</fieldset>
</div>
<?php endif; ?>
<div class="upl">
<form enctype="multipart/form-data" method="post" action="">
<fieldset>
<legend>ファイル選択</legend>
<p> </p>
ファイル名(CSVファイルのみ): <input type="file" name="upfile" /><br />
<p> </p>
<input type="submit" value="アップロード" />
<p> </p>
</fieldset>
</form>
</div>
<?php
}