サーバ側に例えば「test.txt」というファイルがあって
クライアント側からブラウザ経由でそれを削除したい。こんなイメージ。
http://server.com/doDEL.php?DELTARGET=test.txt
削除前の確認confirmをjavascriptで行って
YESだったら削除する。Noだったら削除しない。
しかし失敗した。以下のように実装してみたんだけどNoを押してもファイルが削除されてしまう。なぜだ。
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で発火してしまうのが原因だろうと思う。
今回やりたかったのは
① javascriptとphpを同一ファイル(拡張子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
/////////////////////////////////////////////////////
///// goDELをjavascript(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>';
}
}
?>