min117の日記

初期desireもち。趣味Mac,メインFedora,仕事xp。

PHP サーバにあるファイルを削除する機能を実装する(javascriptからphpの関数を呼び出す)→ 失敗

f:id:min117:20200829101633p:plain

 

サーバ側に例えば「test.txt」というファイルがあって

f:id:min117:20200829074900p:plain

 

クライアント側からブラウザ経由でそれを削除したい。こんなイメージ。

http://server.com/doDEL.php?DELTARGET=test.txt

f:id:min117:20200829074718p:plain

 

削除前の確認confirmをjavascriptで行って

f:id:min117:20200829074748p:plain

 

YESだったら削除する。Noだったら削除しない

f:id:min117:20200829075121p:plain

 

しかし失敗した。以下のように実装してみたんだけどNoを押してもファイルが削除されてしまう。なぜだ。

$ vim doDEL.php

f:id:min117:20200829080837p:plain
105行目 javascriptにより「本当に**を削除しますか?」というメッセージを出す

107行目 もしYESだったら

109行目 削除する(ためのPHP関数goDEL(confirm) を呼び出す)

123行目 phpにより、削除する関数goDEL(confirm) を記述する

126行目 confirmがもしYESだったら

137行目 削除を実行する

 

if文を2つも使って誤削除を防止しているはずなのに doDEL.phpが読み込まれた瞬間にtest.txtが削除されてしまう。なぜだ。

 

おそらくだけど、109行目で goDEL('YES') が解釈された時点 123行目の$CONFIRMがYESで発火してしまうのが原因だろうと思う。

 

今回やりたかったのは

 ① javascriptphpを同一ファイル(拡張子php)内に書いて

 ② javascriptで削除確認メッセージを出し、YESだった場合に

 ③ phpにより(ファイル削除を)実行する

だったわけだが、①のファイルが呼び出された時点③のphpが呼び出されてしまうので②の(javascriptによる)if文が意味を為さないということが分かった。

 

やむをえない。違う方法を取る。②の部分(削除確認confirm)は別ファイルに実装して、YESだった場合に①(と③)を呼び出すように変更する。次回に続く。

 

参考)

失敗したソース

<div style="z-index: 1500; position: fixed; top: 0px; right: 0px;">

<fieldset>

<?php

//参考ソース

//VLC Extensionsからサーバのrecpt1を起動、停止させる ref:

//https://gist.github.com/mkit0031/c72f54adf69bc2bc8379

 

//エラーをhtml上に吐く

ini_set( 'display_errors', 1);

//記述上のエンコードを指定

mb_internal_encoding("UTF-8");

//表示上のエンコード指定header

header("Content-Type: text/html; charset=UTF-8");

 

// 後で呼ぶ関数の中で使う変数を定義

$DATE = date("Ymd_His");

print 'アクセス日時:' . $DATE;

 

// サーバIPアドレス把握

$srv_ip    = $_SERVER["SERVER_ADDR"];

$srv_octet = substr("$srv_ip", 10, 2);

print "<p>サーバIPアドレス$srv_ip<br>";

print "<b><font color=\"red\">サーバIP の末尾:$srv_octet</font></b></p>";

 

// クライアントIPアドレス把握

$user_ip   = $_SERVER["REMOTE_ADDR"];

echo "<p>アクセス者:$user_ip<br>";

$firstoctet = substr("$user_ip", 0, 3);

echo "第1オクテット:$firstoctet </p>";

// $myDELTARGET 対象動画名をセット

if(isset($_GET['DELTARGET'])){

    $myDELTARGET = $_GET['DELTARGET'];

} else {

    $myDELTARGET = "myDELTARGET_NOSET";

}

// YELLOWではない markにする

print '<b><mark>$myDELTARGET:' . "$myDELTARGET" . '</mark></b>';

print '<br>';

 

// CHDIR

if(isset($_GET['CHDIR'])){

    $myCHDIR = $_GET['CHDIR'];

    ///// print 'CHDIR 指定あり<br>';

    //$myBASENAME = $_GET['TARGETDIR'];

    $myBASENAME = $_GET['CHDIR'];

//    $myNOW_STATUS= "$myNOW_STATUS" . '&CHDIR=' . "$myBASENAME" . "'";

//    print '$myNOW_STATUS:' . "$myNOW_STATUS";

} else {

    ///// print 'CHDIR 指定なし(PT3をセット)<br>';

    $myCHDIR = 'PT3';

    $myBASENAME = 'PT3';

}

 

/// SORTを取得(DSCか)

// if(isset($_GET['SORT'])){

// $mySORT = $_GET['SORT'];

// } else {

// $mySORT = "mySORT_NOSET";

// }

// /// DSCをmark表示

// if("$mySORT" == "DSC") {

//     print '<mark>DSC降順</mark>';

//     print '<br>';

// }

 

// jecho "PHPファイル名:" . basename(__FILE__, ".php"); 

// echo '<mark>' . basename(__FILE__, ".php") . '</mark>';

echo basename(__FILE__, ".php");

 

// galmov03 bootstrap

// echo basename($_SERVER['PHP_SELF']);

// print basename(__FILE__, ".php"); 

define('SCRIPT_DIR', dirname($_SERVER['SCRIPT_FILENAME']));

define('IMAGES_DIR', SCRIPT_DIR . '/thumb_movie_images');

//print 'SCRIPT_DIR:' . SCRIPT_DIR . '<br>';

//print 'IMAGES_DIR:' . IMAGES_DIR . '<br>';

?>

</fieldset>

</div>

 

 

<!DOCTYPE html>

<html lang="ja">

<head>

    <meta charset="utf-8">

    <title>ファイル削除doDEL.php</title>

    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">

 

    <script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>

    <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>

    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>

 

    <meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">

 

    <link rel="stylesheet" type="text/css" href="./inputDesign.css">

 

 

    <style> </style>

    <script></script>

</head>

 

<body>

    <?php // $jsmsg='<mark>' . "$myDELTARGET . '</mark>を本当に削除しますか?" ?>

    <?php $jsmsg="$myDELTARGET を本当に削除しますか?" ?>

    <?php // print "本当に削除しますか?" ?>

 

    <!-- body要素終了の直前にjavascriptを書く -->

    <script>

        // $jsmsg2="$piDOM" . ' にリダイレクトします';

        <!-- JavaScript未対応ブラウザ対策

        // 実際には入力チェックなどするでしょ

        // var today = new Date();

        // var month = today.getMonth() + 1;

        // var day = today.getDate();

        // document.write("html部分からの出力です<br>");

        // document.write("今日は" + month + "月"+ day + "日です。");

        // javaScript未対応ブラウザ対策 -->

        // このファイルをalertで検索

        // alert("<?php print $jsmsg; ?>")

        // window.confirm("<?php print $jsmsg; ?>")

        var rtnCONF = window.confirm("<?php print $jsmsg; ?>");

        // alert(rtnCOMF);

        if(rtnCONF) {

            alert('YESが押されました');

            // 削除対象はここでセットする

            // ファイルの頭でやっちゃうと、YES/NOを待たずに

            // このPHPを読んだ瞬間にファイルが削除されてしまうから

 

            // document.write('<?php goLS('YES') ?>');

            // document.write('<hr>');

            // CONFIRM

 

 

            ////// @@@

            ////// ここでgoDEL()を記述してる時点で、confirmのYES/NOに関わらずgoDEL()は実行されてし>まうので

            ////// このファイル(doDEL.php)を読み込んだ瞬間にファイルが消えてしまう

            ////// 同一ファイル(doDEL.php)内にjavascript(による確認confirm)と、php(による削除>実行goDEL())を書くこと自体に無理がある。

            ////// このファイル(doDEL.php)を呼び出す元でjs確認を終えて、削除OKだったらこのファイ>ルを呼ぶようにすべし

            document.write('<?php goDEL('YES') ?>');

            // document.write('<hr>');

            // document.write('<?php goLS('YES') ?>');

 

        } else {

            document.write('<?php $myDELTARGET = "myDELTARGET_NOSET"; ?>');

            alert('NO が押されました\n削除しません');

            document.write('<?php goLS('YES') ?>');

        }

 

        // <button onclick="return confirm("<?php print $jsmsg?>")"</button>

 

    </script>

</body>

</html>

 

<?php

 

/////////////////////////////////////////////////////

///// goDELjavascript(rtnCONF)により上に書くと

///// このphp(doDEL.php)が読み込まれた瞬間にgoDEL()が走ってしまい

///// 削除がNOでも強制的にファイル削除されてしまうので注意!

///// ↑ いやそんなこと無かった

///// ↑ goDEL()を文末に書いてもやはり強制的に実行されてしまった@@@

/////////////////////////////////////////////////////

// PHP関数化しておき

// JavaScriptのcomfirmでYESのときだけその関数を呼ぶ

// 引数はファイル名$myDELTARGETではなく$CONFIRM

function goDEL($CONFIRM) {

    // chdir();

    print 'CONFIRMの値:' . "$CONFIRM";

    if ("$CONFIRM" == 'YES') {

        global $myDELTARGET;

        print '<hr>';

        print 'PHP関数内 削除対象:<b><mark>' . "$myDELTARGET" . '</mark></b>';

        print '<br>';

 

        // PHPによるファイル削除はunlink() 

        // if(is_file("$myDELTARGET" && "$CONFIRM" == 'YES')) {

        if(is_file("$myDELTARGET")) {

            // print '対象のファイルがありました/削除します';

            print "$myDELTARGET" . 'がありました→削除します';

            unlink("$myDELTARGET");

        } else {

            print "$myDELTARGET" . 'なんてファイルはありません';

        }

    } else {

        print 'javascriptの$CONFIRMがNOです';

    }

}

 

 

 

 

    /// bashでrmを書くと、このPHPが読み込まれた瞬間に(YES/NO判定関係なく)消されてしまうので

    /// PHPのunlink() による削除で実装する 20200823

    /// 

    // $commandDEL = 'echo "削除対象:' . "$fileTODEL" . '" 2>&1 &';

    // $commandDEL = 'echo "削除対象:' . "$fileTODEL" . '"; sudo rm -rf ' . "$fileTODEL" . ' 2>&1 &';

    // $commandDEL = 'echo "bash内 削除対象:' . "$fileTODEL" . '"; ls -shalrt | grep ' . "$fileTODEL" . ' && echo "削除OK" 2>&1 &';

    // $commandDEL = 'ls -shalrt | grep ' . "$fileTODEL" . ' 2>&1 &';

    // $commandDEL = 'echo "削除対象:' . "$fileTODEL" . '"; sudo rm -rf ' . "$fileTODEL" . ' 2>&1 &';

    // $commandDEL = 'echo "bash内 削除対象:' . "$fileTODEL" . '"; ls -shalrt | grep ' . "$fileTODEL" . ' && echo "削除OK" 2>&1 &';

    // $commandDEL = 'ls -shalrt | grep ' . "$fileTODEL" . ' 2>&1 &';

    // 

    // if ($CONFIRMED == 'DEL_OK') {

    //     $commandDEL = 'rm -rf "' . "$fileTODEL" . '" 2>&1 &';

    //     print '<br>';

 

    //     print '<b>bash commandDEL</b><br>';

    //     // print "<b>$commandDEL</b>";

    //     print "<b><mark>$commandDEL</mark></b>";

 

    //     // print "$commandDEL";

    //     exec("$commandDEL" , $outputDEL);

    //     foreach($outputDEL as $iDEL){

    //         // if (preg_match('/.*title.*|.*start_time.*|.*PID.*|.*202[0-9]_/', $iDEL)) {

    //         if (preg_match('/.*削除.*|.*DEL.*/', $iDEL)) {

    //             // print '<b><font color="blue">' . "$iDEL" . '</font></b>';

    //             print '<font color="red"><mark>' . "$iDEL" . '</mark></font>';

    //             print '<mark>' . "$iDEL" . '</mark>';

    //         } else {

    //             print '<font color="red>' . "$iDEL" . '</font>';

    //             print '<mark>' . "$iDEL" . '</mark>';

    //         }

    //     }

    //     print 'DEL_OK<mark>削除しました</mark>';

    // } else {

    //     print 'DEL_NG<mark>削除しませんでした</mark>';

    // }

 

function goLS($fileTOLS) {

    print 'PHP関数内 LS対象:<b><mark>' . "$fileTOLS" . '</mark></b>';

    print '<br>';

 

    $commandLS = 'ls -shalrt | grep ' . "$fileTOLS" . ' 2>&1 &';

 

    print '<b>bash commandLS</b><br>';

    // print "<b>$commandLS</b>";

    print "<mark>$commandLS</mark>";

 

 

    // print "$commandLS";

    exec("$commandLS" , $outputLS);

    print '<br>';

    foreach($outputLS as $iLS){

        // if (preg_match('/.*title.*|.*start_time.*|.*PID.*|.*202[0-9]_/', $iLS)) {

        if (preg_match('/.*削除.*|.*LS.*/', $iLS)) {

            // print '<b><font color="blue">' . "$iLS" . '</font></b>';

            print '<b><mark>' . "$iLS" . '</mark></b>';

        } else {

            print "$iLS";

        }

        print '<br>';

    }

}

 

?>