[PHP] 10 homeディレクトリの取得

[M1 Mac, Big Sur 11.7.2, PHP 8.2.1, MySQL 8.0.31, noFW]

プログラムからクライアント側のローカルファイルを読み込むことは当然厳禁ですが、ファイル出力は可能です。

MySQLの検索結果CSVファイルをhomeディレクトリに出力させてみました。UTF-8であればPythonに比べてCSVファイルの作成は簡単です。

今更ですがPHPでは文字列をピリオドで結合するんですね。当たり前のようにプラスでつないで気付くまでエラーに見舞われていました。この結合方式はPerl由来なのでしょうか。

$db2 = $_COOKIE["db"];
$field2 = $_COOKIE["field"];
$key2 = $_COOKIE["key"];

# MySQLにログイン
$conn = new mysqli('localhost', 'root', 'root');
if (!$conn){
    die("MySQL接続に失敗しました");
} else {
    // print 'MySQL接続に成功しました';
}

# データベース選択
$select_db = sprintf("use %s", $db2);
$select = $conn->query($select_db);

# 全テーブル取得
$tbls_query = $conn->query('show tables;');
$tbls = $tbls_query->fetch_all(MYSQLI_ASSOC);

$tbls_count = count($tbls);

# homeディレクトリ取得
ob_start();
echo posix_getpwuid(posix_geteuid())['dir'];
$home_dir = ob_get_clean();
$home_dir = strtolower($home_dir);

# csvファイルパス作成
$suffix_csv = '/MySQL/test.csv';
$file_csv = $home_dir.$suffix_csv;

# csvファイル作成
$fp_csv = fopen($file_csv, 'a');

$tbls_num = 1;
$counts = 0;
foreach ($tbls as $tbl) {
    $query = sprintf("SELECT * FROM `%s` WHERE `%s` LIKE '%%%s%%'", implode($tbl), $field2, $key2);
    $result = $conn->query($query);
    $rows = $result->fetch_all(MYSQLI_ASSOC);

    # 件数カウント
    $count = count($rows);
    $counts = $counts + $count;

    # csv化(1000件以下)
    if ($counts <= 1000){
        for($i = 0, $size = count($rows); $i < $size; ++$i){
            $row_str = $rows[$i];
            fputcsv($fp_csv, $row_str);
        }
    }
    
    $tbls_num = $tbls_num + 1;
}
fclose($fp_csv);

$conn->close();
exec('mysql.server stop');

[PHP] 09 POSTリクエストでsubmitしたformの内容を取得する cookie

[M1 Mac, Big Sur 11.7.2, PHP 8.2.1, MySQL 8.0.31]

submitしたformの内容を次ページに表示させても数秒で消えてしまいます。

そこでfilter_inputメソッドで取得した変数をcookieに一旦格納してから、使用時にこれを取り出しました。ただcookieに入れてしまうとfilter_inputメソッドで取得した際の変数名($dbなど)も問題なく使えるようになります。

なぜこのようなことになるのかよく分かりません。ガベージコレクション絡みでしょうか。

$db = filter_input(INPUT_POST, 'db');
$field = filter_input(INPUT_POST, 'field');
$key = filter_input(INPUT_POST, 'key');

setcookie('db', $db);
setcookie('field', $field);
setcookie('key', $key);

if(isset($_POST['button2'])){
    $db2 = $_COOKIE["db"];
    $field2 = $_COOKIE["field"];
    $key2 = $_COOKIE["key"];

    # MySQLにログイン
    $conn = new mysqli('localhost', 'root', 'root');
    if (!$conn){
        die("MySQL接続に失敗しました");
    } else {
        // print 'MySQL接続に成功しました';
    }

    <変数はクエリで使用>

<中略>

<table id="search_table" border="2">
        <tr>
            <td>データベース</td>
            <td id="input1-2" width="180" name="db2"><?php echo $db; ?></td>
        </tr>
        <tr>
            <td>フィールド</td>
            <td id="input2-2" width="180" name="field2"><?php echo $field; ?></td>
        </tr>
        <tr>
            <td>検索語</td>
            <td id="input3.2" width="180" name="key2"><?php echo $key; ?></td>
        </tr>
</table>

[JavaScript] 12 submitボタンに動作を追加する

[M1 Mac, Big Sur 11.7.2]

検索ボタンを押すとMySQLへログインして検索するよう設定していますが、同時にストップウォッチが動作するようにしました。

<form method="post" name="formSearch">
    <input id="button2" type="submit" name="button2" value="検索"
    style="color:blue; width:80px; height:40px; font-size:18px; background-color:RGB(211,203,198);
    border:solid; border-color:RGB(30,144,255);">
</form>
<br>

<script language="javascript" type="text/javascript">
    const button2 = document.getElementById('button2');

    button2.addEventListener('click',(e) => {
        startWatch();
        document.cookie="watch=1;";
    });
</script>

<中略>

<span id="elapsedTime"></span>
<br>

<script language="javascript" type="text/javascript">
    function getCookieValue(key) {
        const cookies = document.cookie.split(';');
        for (let cookie of cookies) {
            var cookiesArray = cookie.split('='); 
            if (cookiesArray[0].trim() == key.trim()) { 
                return cookiesArray[1];
            }
        }
        return '';
    }

    function showElapsedTime(time) {
        var now = new Date();
        const eTime = Math.floor((now - time)/1000);
        document.cookie="time=" + eTime + ";";

        var eTimeShow = "検索時間(秒) " + eTime;
        document.getElementById("elapsedTime").innerHTML = eTimeShow;

        return eTimeShow;
    }

    function startWatch(){
        var startTime = new Date();

        setInterval(
            function()
            {showElapsedTime(startTime);}
            ,1000 ) ;
    }

    var watchBool = getCookieValue("watch");
    if (watchBool == 1){
        let time = getCookieValue("time");
        var eTimeShow = "検索時間(秒) " + time;
        console.log(eTimeShow);
        document.getElementById("elapsedTime").innerHTML = eTimeShow;
    }
</script>