#みんなで見ることができるようにしたい
スタート地点はここでした。
##自己紹介
はじめまして。
私はとある大学の経済学部を卒業して、零細企業でネットワークやってる人です。(無資格ですが、CCNA取得に向けて勉強中)
プログラミングやらWEBデザイン等の経験はゼロです。
先週、なぜか友人の課題の手伝いで2時間だけJavaに触れたぐらいです。
System.out.println("Hello world!");とforをつかってHello world!を5回表示と配列の課題をやらされました。
それ以外はプログラミングらしいプログラミングはしたことがないです。
訳の分からない状態なので、変なこと言ってたらご容赦ください。。。
##何があったのか
- チーム(とあるゲームの集まり)のみんな画像で提出してくるゲームのスコアを一覧にしたエクセルファイルがある。
- 元々はリーダーが手書きで書いてそろばん(電卓かもしれない)で計算して手書きで集計していたのを自分がエクセルかなんかでデジタル化することに。
- これ自分のところにあってもみんなでみれないよね。
- せや、WEBページにすればみんなで見れるし、中間結果とか出して煽れるよね。
という思考に至る。
##方法の模索
- HTMLとの格闘
そういえばHTMLでtableすればできるよね
80行を全て手打ち+Excelでの集計結果を全て手打ち→できたはいいけどめっちゃメンテ性悪い。 - 集計結果だけとりあえず出しておけばいいんじゃね?
集計結果だけ出すと本当にその結果があっているのかわからない。
- jqueryかJavascriptかなんかで良いの無いの?
CSVをそのまま表示するやつがありました。
jquery.csv2table.jsで指定したCSVをそのまま表示してくれる。しかもソートもできるすごいやつ。
色々調べてjquery.csv2table.jsとjquery.min.jsをjsディレクトリに突っ込んで指定してあげればいけるらしい
<script src="js/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript" src="js/jquery.csv2table-0.02-b-4.8.js"></script>
<script>
$(function(){
$('#table_disp').csv2table('book01.csv');
});
</script>
<div id="table_disp"></div>
- 一応これで表示はできた。
けどやっぱりメンテナンス性が悪い(計算や結果の表示の仕方が未知)
せや、MYSQLでなんかできんかね。
- MYSQLとPHPとHTMLでのみつどもえの戦い
(´・ω・`)もはやわたしにはなにをやっているのかがわからない。
MYSQLはさくらのレンタルサーバーでPHPMyadminをつかってCSVをインポートしたら一度目はエラーになりましたが、テーブルとカラムを手動で用意してあげるとすんなりいきました。
そもそも、MYSQLをPHPで操作できるということを初めて知りました。
とりあえず片っ端から調べてやってみて、DBに接続して・・・とやっていくとうまくいかず、紆余曲折があって(その辺のコードは消してしまいました。)最終的に以下のコードになりました。
<?php
//データベース接続
$server = "mysqlxxx.db.sakura.ne.jp";
$userName = "hogehoge";
$password = "fugafuga";
$dbName = "hogehoge_result";
$mysqli = new mysqli($server, $userName, $password,$dbName);
if ($mysqli->connect_error){
echo $mysqli->connect_error;
exit();
}else{
$mysqli->set_charset("utf-8");
}
$sql = "SELECT * FROM score";
$result = $mysqli -> query($sql);
//クエリー失敗
if(!$result) {
echo $mysqli->error;
exit();
}
//レコード件数
$row_count = $result->num_rows;
//連想配列で取得
while($row = $result->fetch_array(MYSQLI_ASSOC)){
$rows[] = $row;
}
//結果セットを解放
$result->free();
// データベース切断
$mysqli->close();
?>
<!DOCTYPE html>
<html>
<head>
<title>第四回チーム内スコアアタック結果</title>
<meta charset="utf-8">
</head>
<body>
<h1>第四回チーム内スコアアタック結果</h1>
<p>2018年4月17日更新</p>
レコード件数:<?php echo $row_count; ?>
<table border='1'>
<tr>
<th>チーム名</th>
<th>名前</th>
<th>ハンドルネーム</th>
<th>曲名1</th>
<th>曲名2</th>
<th>曲名3</th>
<th>合計</th>
<th>備考</th>
</tr>
<?php
foreach($rows as $row){
?>
<tr>
<td><?php echo $row['team']; ?></td>
<td><?php echo $row['name']; ?></td>
<td><?php echo $row['name2']; ?></td>
<td><?php echo $row['kekka1']; ?></td>
<td><?php echo $row['kekka2']; ?></td>
<td><?php echo $row['kekka3']; ?></td>
<td><?php echo $row['kekka1'] + $row['kekka2'] + $row['kekka3']; ?></td>
<td><?php echo $row['remarks']; ?></td>
</tr>
<?php
}
?>
</table>
</body>
</html>
参考サイト様 ウェブの葉 ( http://noumenon-th.net/programming/2016/01/19/mysql/ )
最初は片っ端からなにやらかんやらサンプルコードやら見ては1個ずつ書いて消してを繰り返してましたが、MYSQLが繋がりませんでした。
ウェブの葉さんのコードでようやくデータベースにつながりました。
合計の列はPHPは四則演算ができるらしいということでそのままDBから引っ張って計算すればいけんじゃね?っていう浅はかな考えが意外といけました。
最初はmysql_connectをしていましたが、心が折れたあたりでどうやらmysqliでないといけないということに気づきました。PHPのバージョンが7だとだめなのね・・・。
##備忘録
接続にはmysqlとPDOとmysqliがあるらしい・・・。
<?php
// mysqli
$mysqli = new mysqli("example.com", "user", "password", "database");
$result = $mysqli->query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
$row = $result->fetch_assoc();
echo htmlentities($row['_message']);
// PDO
$pdo = new PDO('mysql:host=example.com;dbname=database', 'user', 'password');
$statement = $pdo->query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
$row = $statement->fetch(PDO::FETCH_ASSOC);
echo htmlentities($row['_message']);
// mysql
$c = mysql_connect("example.com", "user", "password");
mysql_select_db("database");
$result = mysql_query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
$row = mysql_fetch_assoc($result);
echo htmlentities($row['_message']);
?>
- mysqlはPHP7で削除
- mysqliは5から実装
- PODは5.1から実装
らしい。
PDOとmysqliの違いとしては、前者は完全にオブジェクト指向だが、後者は手続き型もイケる。と
これからはPDOってことでしょうか。
参考 PHPマニュアル http://php.net/manual/ja/mysqlinfo.api.choosing.php
- MySQLの表の更新例:さとうさんのkekka1を1000に更新する。
UPDATEhogehoge_result
SETkekka1
= 1000 WHEREname
= "さとう";
##実際にやってみて
全く未知の世界でしたが、できてみるとちょっと楽しそうな感じではありました。
もうちょっと勉強していきたいと思います。
色々書いたけど、結局ほぼコピペでやってしまったのはちょっとアレですが、中身を分解して読み解いて自分でも書けるようになりたいです。
こんなものがそらで書けるプログラマーの方々はきっと人間でなく、猫なのだろうと思いました。
私も猫になれるよう精進してまいります。
以上、ありがとうございました。