ホームページをリニューアルしました。旧HPはこちら
MySQL ソフト・ハードウェア PHP

PHP・MySQL・canvasJSを使った動的なチャート生成(その5)

5、フォーム処理

Webサイトをインターフェースとして、PHPおよびMySQLとやり取りする主な方法は、HTMLフォームを使う方法である。気象データの期間検索をして、そのデータを取得するフォームを作成した。

・フォームからの送信データ取得と表示

// csv-final.php
<html lnag="ja">
   <head>
   <meta charset = 'utf-8'>
   <title>期間入力Test</title>
   </head>
<body>
   <pre>
   データ取得期間を入力し送信ボタンを押してください。
       <form method="post" action="calender-final.php">
       開始日:
       <input type="date" name="startdate" value="">
      終了日:
     <input type="date" name="enddate" value="">
  <input type="submit" name="push" value="送信">
     </form>
 </pre>
</body>
</html>

POSTメソッドで検索取得期間を入力し、送信ボタンを押すことで、フォームデータの送信先である"calender-final.php"に送信される

このプログラムをWebブラウザで開くと以下のようになる。

さらに送信ボタンを押すと、検索データのcsvファイルのダウンロードメニューが出る。

フォームのPOSTデータを受けて、MySQLからデータを取得し、csvファイルを出力するプログラムは以下の通り。

<?php
// "calender-final.php"
//初期設定
$startdate=$enddate="";

// login情報ファイル読み込み
require_once 'login-PDO.php';

// データベースに接続する。//////////////
try
{
    $pdo = new PDO($attr, $user, $pass, $opts);
    //echo "データベース接続OK\n";
}

catch (\PDOException $e) //PDOException:PDOが発するエラーを表します
{
    //例外を知らせることを例外を投げるという(throw)。
    throw new \PDOException($e->getMessage(), (int)$e->getCode());
}

// form data 処理
// isset 関数 – 変数がセットされていること、nullではないことを検査する
// POSTデータがあれば、データをサニタイズして $startdate=$_POST 
if (isset($_POST['startdate'])) $startdate= sanitizeString($_POST['startdate']);
if (isset($_POST['enddate'])) $enddate= sanitizeString($_POST['enddate']);
if (strtotime($startdate) > strtotime($enddate)) {
    echo "入力エラー。もう一度入力してください。 ";
    echo '<a href="' . $_SERVER['HTTP_REFERER'] . '">前に戻る</a>';
    exit();
}else {
    // POSTデータが問題なければSQLを実行
    $timestamp =strtotime('+1 day'.$enddate); //入力された集計終了日+24時間
    $enddate=date('Y-m-d',$timestamp);
    $yymm1 = $startdate;
    $yymm2 = $enddate;
    
    // SQL文  prepare statementで引数を受け渡す。SQLインジェクション攻撃の対策
    $export_sql = "SELECT * FROM iida_agri_sensor WHERE date BETWEEN :date1 AND :date2 LIMIT 5";    
    //prepareでSQL文をセット
    $stmt = $pdo -> prepare($export_sql);
    //bindValueで値をセット :date1,:date2を値に置き換える
    $stmt ->  bindValue(':date1', $yymm1);
    $stmt ->  bindValue(':date2', $yymm2);
    $stmt->execute();
    
    $csvstr = array();
    while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
        $csvstr .= $row['date'].",";
        $csvstr .= $row['temp'].",";
        $csvstr .= $row['humid']."\n";
    }
   
    // 検索結果のCSV出力 https://www.sejuku.net/blog/25648
    //https://php.programmer-reference.com/php-mysql-csv-download/
    // HTTP規格でデータを送る
    $fileNm = $startdate."_".$enddate.".csv";
    header('Content-Type: text/csv');
    header('Content-Disposition: attachment; filename='.$fileNm);
    echo($csvstr);
    
    // データベース接続の切断
    $pdo = null;
}

 //////////////////////////////////////////////////////////
// isset関数の結果を受けて、POSTで入力された文字のサニタイズ処理 
 function sanitizeString($var)
 {
     if (get_magic_quotes_gpc())
         $var = stripslashes($var);
         $var = htmlentities($var);
         $var = strip_tags($var);
         return $var;
 }
?>

参考:上記プログラムの作成に参考としたサンプルプログラム
温度を摂氏、華氏間で換算するプログラム(出典「初めてのPHP,MySQL,JavaScrits & CSS」)

・フォーム処理によるファイル書き込みについて

フォームからPOSTやGETメソッドでデータを送信し、そのデータを受けたPHPプログラムがデータをローカルディスク(クライアントディスク)に保存するような場合は、保存ファイル(データが書き込まれるファイル)をあらかじめ作成しアクセス権を設定しておく。これは、PHP CLIユーザとWebのApacheユーザが異なるため。

Apacheのデフォルトの設定では、PHPはモジュールモードとして動作していて、PHPのソースコードをApacheが読み込み、PHPモジュールとして実行するので、読み込み権限のみ与えておけばよい。しかし、 プログラムから書き込まれる必要があるファイルには、書き込み権限を与える必要がある。ただしファイルパーミションは666とか777になるので外部からのアクセスにたいして危険。

参考:フォーム入力データをファイルに書き込む例

<?php
// file: file_write.php
// note:書き込みファイルは事前に作成し、apacheにアクセス権を与えておく(666)
touch('/home/miyasan/public_html/eclipse-workspace/php-PDO/write-test.csv');

if (isset($_POST['startdate'])) $startdate= ($_POST['startdate']);
if (isset($_POST['enddate'])) $enddate= ($_POST['enddate']);
$comment = $startdate."=".$enddate;

if(isset($_POST["push"])){
$fp = fopen("/home/miyasan/public_html/eclipse-workspace/php-PDO/write-test.csv",'w');
if(flock($fp,LOCK_EX))
{
    fseek($fp,0,SEEK_END);
    fwrite($fp, "testtesttest:".$comment);
    flock($fp,LOCK_UN);
}
fclose($fp);

}   
?>
/////  この後にHTMLでFORMを記述 ////
/////  FORM処理 ////
<html>
<head>
<meta charset = 'utf-8'>
<title>期間入力Test</title>
</head>

<body>
<pre>
   データ取得期間を入力し送信ボタンを押してください。
<form method="post" action="file_write.php">
開始日:
<input type="date" name="startdate" >
終了日:
<input type="date" name="enddate" >

<input type="submit" name="push" value="送信">
</form>

取得開始日:$startdate
取得終了日:$enddate

</pre>
</body>
</html>

 

PHP・MySQL・canvasJSを使った動的なチャート生成 関連記事

1、 ローカルサーバの開発環境の設定

2、 MySQLに気象観測データベースを作成

3、 PHPを使ったMySQLへのアクセスとクエリ設定

4、 Pythonを使ったMySQLへのアクセスとクエリ設定

5、 フォームからの送信データ取得と表示・ファイル保存

6、 MySQLデータを用いcanvasによるチャート作成

 

コメント

タイトルとURLをコピーしました