【php】同ページ$_POST使用時の再送信対策

formをPOSTで送信後、ページをリロードするとform再送信の確認メッセージがでる問題。
メッセージを出さないため&再送信を防ぐための方法を考える。

formを送信

POSTを受け取ったら$_SESSIONに格納。同ページに移動。

$_SESSIONを使って処理。処理後に破棄する。

という方法をとる。

<?php
session_start(); //セッション開始
if(!empty($_POST)){//ポストが空でなければ
$keys = array_keys($_POST);//ポストのキーを取得

        foreach($keys as $key){//$_POSTの要素を全て$_SESSIONに移す
            $_SESSION[$key] = $_POST[$key];
        }
        $_SESSION["array_post_keys"] = $keys;//キー配列も格納

        http_response_code(301);
        header("Location: ".(empty($_SERVER["HTTPS"]) ? "http://" : "https://").$_SERVER["HTTP_HOST"].$_SERVER["PHP_SELF"]);
        exit;//処理を中止する
    }
?>

 

これを<html>前に設置して、後は処理していく。

VBSの配列

宣言

Dim ary()

 

素数は1以上の整数でのみ指定可能。変数などはエラーになる。

〇Dim ary(10)

×Dim ary(num)

 

動的配列

一度宣言した配列を宣言し直す.

ReDim aryString(20)

こうすると配列の要素は全て空になる.

ReDim Preserve aryString(20)

Preserveを付けると元の要素は保持される.

 

配列内検索

Filter(aryString, str, , )

・aryString ⇒ 対象の配列

・str ⇒ 検索文字

・⇒ 検索文字を含むものが対象ならTrue, 含まないものが対象ならFlase. デフォはTrue

・⇒比較方法.バイナリなら0, テキストなら1. デフォは0

fetchに関する覚書

fetchを使って分かったこと。

・thenメソッド内でグローバル関数に代入してもブロック外からスコープ出来ない。

・ブロック外のfunctionへの引数にも指定できない。

・fetchで取得した自体をグローバル関数に代入することは可能。

 

基本は

fetch(filePath)

でPromiseという形式のオブジェクトを取得する。

そのまま " .then(res => res.json()) "と続ければファイルのテキストをjsonとしてオブジェクトを取得できる。

.json()を.text()にすればテキストとして返してくれる。

thenメソッドはfetchでファイル取得後実行される。ただし取得成功かは問わない。

catchメソッドはエラーが起きたら実行される。ネットワークエラーのみ?

 

参考:

JavaScriptのFetch APIを利用してリクエストを送信する(https://sbfl.net/blog/2017/01/29/fetch-api/)

 

ファイルを開く、開いているファイルを取得する

●ファイルを開く

Option Explicit

Dim objExcel, bk

Set objExcel = CreateObject("Excel.Application")
Set bk = objExcel.Workbooks.Open("ファイルパス")

 

●すでに開いているファイルを取得する

Option Explicit

Dim objExcel, bk

Set objExcel = GetObject(,"Excel.Application")
Set bk = objExcel.Workbooks("ブック名")

 

CSVファイルを変換出力する(Worksheetを介さない)

Sub CSVconvert()
'//////////////////////////////
'csvをworksheetを介さず変換する
'VBSで十分できる
'//////////////////////////////

Dim fso As Object, inf, outf, aLine, field, wk

'取り込むファイルをダイアログで選択、キャンセルで中断
FileN = Application.GetOpenFilename("CSVファイル,*.csv")
If FileN = False Then Exit Sub

FilecnvName = Left(Dir(FileN), Len(Dir(FileN)) - 4) & "cnv.csv"

Set fso = CreateObject("Scripting.FileSystemObject")
Set inf = fso.OpenTextFile(FileN, 1)
Set outf = fso.OpenTextFile(ThisWorkbook.Path & "\" & FilecnvName, 2, True)

Do Until inf.AtEndOfStream
    aLine = inf.ReadLine
    
'        'セグメント内改行対策箇所
'        Do Until EOF(1)
'            If (Len(strBuf) - Len(Replace(strBuf, """", ""))) Mod 2 = 0 Then Exit Do
'            Line Input #1, strBuf1
'            strBuf = strBuf & strBuf1
'        Loop
'
    '引用符削除
    aLine = Replace(aLine, """,", ",")
    aLine = Replace(aLine, ",""", ",")
    aLine = Replace(aLine, """""", """")
    If Left(aLine, 1) = """" Then aLine = Right(aLine, Len(aLine) - 1)
    If Right(aLine, 1) = """" Then aLine = Left(aLine, Len(aLine) - 1)
        
    'カンマで分割
    field = Split(aLine, ",")
    
'////////////////////////////// 
'処理エリア
'↓並び替えの例
'wk = field(0)
'field(0) = field(1)
'field(1) = field(2)
'field(2) = wk
'//////////////////////////////
headed: '配列をカンマを挟んで結合 aLine = Join(field, ",") 'outfに書き込み outf.WriteLine (aLine) continue: Loop 'ファイルを閉じる inf.Close outf.Close End Sub

Scripting.FileSystemObjectでファイルAをファイルBに変換して出力する。

https://oshiete.goo.ne.jp/qa/1751147.html ←VBS版

【WScript.Arguments】ドラッグ&ドロップしたtxtファイルの中身を配列に格納する


Dim GetPath
Set GetPath = WScript.Arguments

'ドラッグ&ドロップされていなければ中断
If GetPath.Count = 0 Then
MsgBox "ファイルをドラッグ&ドロップしてください。",,"警告"
Wscript.Quit
ElseIf GetPath.Count > 1 Then
MsgBox "2つ以上のファイルがドラッグ&ドロップされています。",,"警告"
Wscript.Quit
End If

Dim lineStr()
Call TXTEXtract(GetPath(0),lineStr)

'●●●TXTファイル内の文字列を配列に格納
Sub TXTExtract(FilePath,lineStr())
'テキストファイルを配列に格納
Dim inputFile
Set inputFile = FSO.OpenTextFile(FilePath,1,False)
Dim Con
Con = 0
ReDim Preserve lineStr(Con)
DO Until inputFile.AtEndOfStream
lineStr(Con) = inputFile.ReadLine
Con = Con + 1
ReDim Preserve lineStr(Con)
Loop
'ファイルを閉じる
inputFile.Close
Set inputFile = Nothing
End Sub

前半はドラッグ&ドロップしたファイルのフルパスを取得する。
後半のTXTExtractプロシャージャは引数1で指定したファイル内の文字列を引数2の配列に格納する。

ドラッグ&ドロップしたファイルが0か2つ以上あればダイアログを出して中断する。