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を使った動的なチャート生成 関連記事
4、 Pythonを使ったMySQLへのアクセスとクエリ設定
コメント