なずブログ

インフラSE、Java開発、リモートワークエンジニアな人のメモ帳

Mysqlの代わりにjsonで管理しようとしたらinner joinがないからGINQ使ってみようとした

f:id:nazuna_0124:20170319171727p:plain

さてさて、おねーさま依頼のツールは絶賛作成中。

デザインはお願いする関係でファイルが行ったり来たりしてます。


そーすると、どうしてもデータベースは環境合わせるのがめんどくさい。

コピペですむjsonでデータ管理をしてみることにしました。


読み書きはともかく、ネックは条件での抽出と、ファイルを複数使ってjoinです。


SQLなら1文ですむのにひたすらループするしかない


そこで登場のライブラリ。GINQさんです。


LINQPHPで再現したライブラリです!という説明で意味不明でした。まずLINQがなに…


よーするに配列をテーブルに見立てて、SQLっぽくかけるしろもの。


メソッドを続けて書いていく感じは、フレームワークのORMと同様の感じじゃないでしょうか。 ←言葉の意味がよくわかってないのに言ってます。


書いてて気づきました。VBA時代に死ぬほど欲しかったライブラリです…

誰か作ってくれてたりしないのかな。


導入に結構手間取ったので、以下ただのメモです。


  • GINQをzipで解答して放り込めば使えるって見たけど無理だった
  • Netbenasにコンポーザを導入してみた。
  • composer.jsonは手動で作って問題なし。
  • composer.jsonにインストールしたいginqの記述をする
  • 依存性の追加とか言う、謎の言葉でインストール
  • 呼び出すファイルは 'vendor/autoload.php'


インストール時点でvendorフォルダが作成されて中にginqもあります。


中のGinq.phpをrequireしてもエラーでます

コードによっては動くあたりが更に注意


後から考えたらコンポーザ導入したんだから、そうしろって結果なだけなんですが。

よくわからずインストールしました!


とりあえず、動いたのでよしとします。

さて、これの使い方おぼえないと!

職業訓練の授業52日目~Twitter風アイコン付き掲示板の作成~

f:id:nazuna_0124:20170309204724p:plain

何かできないとき、目標に届かなかったとき。

自分の努力が足りなかったとはよくいいます。


努力とゆー言葉からそこはかとなく伝わる根性、精神論的な香りが苦手です


さて、では努力とはなんでしょう。


自分なりの定義。努力とは目的のために費やした時間とお金である


こう定義しておくと、自分の努力が足りなかった=使った時間(お金)が少なかったとなり


逃げ場がなくなってとっても素敵。

まだまだわからないことだらけです。ずんどこ時間を使っていこうと思います!


というわけで、自分いじめのネタにはことかかない自己肯定感の低い皆様こんばんは。

たまには自分に良いこともみつけてあげてね!


本日は、表題の課題がほぼ終了しました。


簡単にいえば見た目がTwitterなだけのの掲示板ですね。←新規投稿あってもリロードされない的な意味で


教室内がLANが組まれていて、開発環境のLinuxは他の人にもすぐにアクセスできます。


書き込み確認をみんなでしててとても楽しそう


XAMPPで作ってる私のとこには当然誰も書き込めないわけですが


授業パターンとしては終始先生が先行してコードを記入する画面を見せてくれます。

テキストにも回答がのってます。


先生が順次ソースを公開するので最悪コピペすれば動きます。


ここ最近の授業ではわたしは終始不機嫌


なんでしょう。ネットの動画とか見ると、へー! そう書くのね!ってなるんですが、

授業だと、えー…そうかくのー… とブツクサ。


こうしたらどうかなーと悩んでる好きに授業が進んでゆく。

よくわからない理由でついていくのがギリギリになってます。


みんなも遠回りはほどほどにね!

職業訓練の授業51日目~会員登録画面の作成~

f:id:nazuna_0124:20170310221050p:plain

htmlspecialcharsの連続はイヤーーーーーー!!!


大変失礼いたしました。当然のように進むので言うに言えず

ブログで叫んでしまいました


昨日ご紹介の通り、本日からtwitterもどきの作成です。


授業としては会員情報の登録、sessionとmysqlの登録まで進みました。


そんなことはどうでもよくて


テキスト準拠ではあるのですが、どーにも書き方が解せませぬ。


かといって自分の書き方に自信がない


というわけで、それぞれのコードの紹介です。

実際の作成ではなくて、書き方をあわせたものになります。

まずこちら。

<?php

//noticeのエラーを非表示に
error_reporting(E_ALL & ~E_NOTICE);

if(!empty($_POST)){
    $errMsg=[];
    
    //未入力チェック。
    if($_POST['name']==''){
        $errMsg['name'] = 'blank';
    }
    
    if($_POST['email']==''){
        $errMsg['email'] = 'blank';
    }
    
    if($_POST['password']==''){
        $errMsg['password'] = 'blank';
    }
    
    //登録処理
    if(empty($errMsg)){
        echo '<h1>登録するよ!</h1>';
        
        //header('Location : check.php');
    }
    
}
echo 'ポストの中身' . var_dump($_POST) . "<br>";

?>
<!DOCTYPE html>
<html>
    <head>
        <title>登録テスト</title>
        <meta charset="UTF-8">
        <style>
            .err{
                color:red;
            }
        </style>
        
    </head>
    <body>
        <div>会員登録</div>
        
        <form action="" method="post">
            Name:<input type="text" name="name" placeholder="name" 
            value="<?php echo htmlspecialchars($_POST['name'],ENT_QUOTES,'UTF-8'); ?>"><br>
            <?php if($errMsg['name']=='blank'): ?>
                <p class="err">*名前を入力してください。</p>
            <?php endif; ?>
            
            
            Email:<input type="text" name="email" placeholder="email" 
            value="<?php echo htmlspecialchars($_POST['email'],ENT_QUOTES,'UTF-8'); ?>"><br> 
            
            
            <?php if($errMsg['email']=='blank'): ?>
                <p class="err">*メールアドレスを入力してください。</p>
            <?php endif; ?>
            
 
            password:<input type="text" name="password" placeholder="password"  
            value="<?php echo htmlspecialchars($_POST['password'],ENT_QUOTES,'UTF-8'); ?>"><br> 
            
            <?php if($errMsg['password']=='blank'): ?>
                <p class="err">*パスワードを入力してください。</p>
            <?php endif; ?>
            
            <br>
            <input type="submit" value="登録">
  
        </form>
    </body>
</html>


実行結果です。

f:id:nazuna_0124:20170322203018p:plain


フォーム部品がたった3つしかないのにめちゃくちゃゴチャゴチャしてます


3回もhtmlspecialcharsと書くあたりは流石に疑問に思ってもよいと思います。


それでわたしなりに変更したのがこっち。

<?php

//こっちはnotice非表示ひつようなし。
//error_reporting(E_ALL & ~E_NOTICE);

function h($s){
        return htmlspecialchars($s,ENT_QUOTES,"UTF-8");
   
}
function ev($s){
    echo var_dump($s).'<br>';
}

//入力項目を定義
$req =['name','email','password'];

//エラーメッセージを初期化
foreach ($req as $val){
    $errMsg[$val] = '';
}        


//ポストが存在すれば格納、なければblank
foreach ($req as $val){
    if(!isset($_POST[$val])){
        $p[$val] = '';
    }else{
        $p[$val] =h($_POST[$val]);
    }
}        


if($_SERVER['REQUEST_METHOD']=='POST'){
    
    //未入力チェック。
    if($p['name']==''){
        $errMsg['name'] = sprintf('<p class=err>%s</p>',"*名前を入力してください。");
    }
    
    if($p['email']==''){
        $errMsg['email'] = sprintf('<p class=err>%s</p>',"*メールを入力してください。");
    }
    
    if($p['password']==''){
        $errMsg['password'] = sprintf('<p class=err>%s</p>',"*パスワードを入力してください。");
    }
    
    //エラーチェック
    $isErr = false;
    foreach($errMsg as $key => $val){
        if($val!=""){
            $isErr=true;
        }
    }
    
    //登録処理
    if(!$isErr){
        echo '<h1>登録するよ!</h1>';
        
        //header('Location : check.php');
    }
    
}

echo 'ポストの中身';
ev($_POST);


?>
<!DOCTYPE html>
<html>
    <head>
        <title>登録テスト</title>
        <meta charset="UTF-8">
        <style>
            .err{
                color:red;
            }
        </style>
        
    </head>
    <body>
        <div>会員登録</div>
        
        <form action="" method="post">
            Name:<input type="text" name="name" placeholder="name" value="<?= $p['name'] ?>"><br>
            <?= $errMsg['name'] ?>
               
       
            Email:<input type="text" name="email" placeholder="email" value="<?= $p['email'] ?>"><br> 
             <?= $errMsg['email'] ?>
 
            password:<input type="text" name="password" placeholder="password"  value="<?= $p['password'] ?>"><br> 
            <?= $errMsg['password'] ?>
            
            <br>
            <input type="submit" value="登録">
  
        </form>
    </body>
</html>

関数があるので行数は増えるものの、html部分がとてもすっきり!


以下が変更箇所です。それはよくないとゆーとこがあったら教えてください!

定番のh関数

これはさすがに・・・

var_dumpもめんどい

ev()という謎関数を作成

$_POSTって書くのがいや

アンダーバー+大文字は打つの大変なんです。しかもほっとくと頻出。

$pに一旦全部うけてしまってます。

$reqで登録予定のフォームをあらかじめ定義

個人的に空白だと$_POSTの部品ごと送られてこないことに納得がいきません。

最初からblankつっこんじゃいます。



テキスト通りだと似たようなフォーム作るたびに血を吐きます。


こうしておけばいくらか楽だと思うのですが……いかがでしょう?

職業訓練の授業50日目~mysqlへの接続、CRUD~

f:id:nazuna_0124:20170309204724p:plain

いつぞやmysql接続にはPDOを使うと言いました。

ごめんなさい。あれは嘘でした


とりあえず動けばいいものを作るなら、mysqliのほうが使いやすかったです。


ただ問題は、どっちにしてもVBAのADO接続より使いにくい!


特にinsertなのですが、突っ込み方は2種類です。

文字列としてSQLを生成するか、プレースホルダーを使うか。


後者はセキュリティ的な意味もあるようです。


わたしがこう書けたらいいな!というのがこんなかんじ。

$db = getDb();
$rst = $db->open('TableName');

$rst->addNew;
$rst->Fields('id') = 1;
$rst->Fields('name')='なずな';
$rst->update;

ado接続したことある方にならきっと伝わるはず!


これがmysqliでぐぐってみると。

$db=getDb()
$stmt = $db->prepare("insert into TableName(id,name) value(?,?);
$stmt ->bind_param($id,$name);

$id = 1;
$name = 'nazuna';

$stmt->execute();

こんなかんじ。※動くかどうかはチェックしてません


1見すると行数おんなじだし、変わらなさそーに見えるんですが2点どーしても気に入りません。


SQL文の文字列の中にテーブル名が含まれちゃってる

これのせいでテーブル名を変数で持たせるのがめんどいです。


カラム名の記述回数が多い。ついでに変数名になってる

idと$idで合計3回書いてます。これが長いカラム名だったらカラム数自体たくさんなると

マウス投げたくなります


自分でクラス作ってなんとかするしかないんでしょーか…。


というわけで、のっけから文句を始めるタイプの皆様こんにちわ。


本日はCRUDというお話です。

データベースに接続できたなら、登録して、読めて、変更して、削除するのが基本だよね!という用語です。


これを作ると、Excelのオートフィルタの偉大さがよくわかります。


基本ではあるものの、これだけあっても驚くほど使いみちがありません。


CRUDのRの部分。Readが問題なのですよね。


そのまま読んでもほとんど意味がなくて、大抵条件付けが入ります。


直近1ヶ月のデータがみたいとか固定ならよいのですが、

ユーザーに選ばせようとすると突然難易度があがります


だけれど、これが出来ると驚きの汎用性!

オートフィルタつけたExcelデータベースっぽい表がいろいろ活躍できるのは御存知の通り!


でもでも、Excelはセルを書き換えるだけで更新できるよですって?


そんな感じで更新するのはものすごく大変で考えたくないです…。


あ でもcakePHPで焼くとそんな感じのコマンド一発で出来た気もしました。


さてさて、最近はすっかり周りを見る余裕がありません。

明日から今回の授業を活かして、twitter風の投稿システム作成が課題です。


随分劣ると思うのでr<s<t と戻っていって、awitterなんて名前にでもしようと思います。

VBAとクラスモジュールとオブジェクト指向と

f:id:nazuna_0124:20170312082946p:plain

わーい、晴れてる!→お部屋が気持ちいいからプログラム書こう。

ありゃー、雨降ってる!→お部屋で出来るからプログラム買こう。

今日はなんだか気分がいー!→捗るからプログラム書こう。

今日はなんかやる気でなーい→少し疲れてるくらいが、むしろ丁度いいからプログラム書こう。


というわけで、状況に左右されないプログラミングって素敵ですね。


でも何事も根を詰めるのはよくないので、息抜きがてら

頭でまとまってないことを、とりあえず出力してみるの日。


オブジェクト指向のやってることはわかるけど、説明してる人の何が言いたいのかはわからん

とゆーおはなし。クラスモジュールで挫折したので、JAVAに入る前に戦々恐々しているのです。

疑問が2つ。


どーにも確認とれないのが、

一人で作ってて、小規模な案件なら、むしろ書く量が増えて面倒だったりしません?


なので、そうしないほうがいいこともある?というのが一つ。


でも、オブジェクト指向って歴史の流れ的な意味でも発明(?)されたじゃないですか。


いわゆるスパゲッティコードどころか、VBAのgoto文に生理的嫌悪感があります。



なので、慣れた人たちにとってはオブジェクト指向じゃないコードもそんな感じなのかなーとも思ったり。


腕が上がるとor効率化を図るといつの間にかオブジェクト指向になってるとか?が2つ目。



……。頭がぐらぐらしてるときに記事を書くとろくなことにならないという良い見本でした…。


さって、作業に戻ります!

連想配列とJSONとオブジェクトがぐちゃぐちゃになってる~フォームに値をプラスしてPOST送信~

f:id:nazuna_0124:20170319171727p:plain

やばいです。作ってるものが全くすすみません!

あっちでゴチン。こっちでゴチンとやって遅々として進まず。


今回のはまりパターンはajaxでフォームにプラスを付けてPOST送信


フォームの値そのものはserializeArray()でまとめて引っ張れます。


これに他の値も足そうとしたら大苦戦


方法は一応2つです。

  1. hiddenでフォームの部品をこっそりつっこむ
  2. 取ってきたのは配列なんだから普通に足しちゃう


1で紹介されてるところもあります。これやると送信後に作った部品を削除する処理がはいるので断念


んで、2なわけなんですが。これがわけわかんない。

結論から書きます。

(他の方のブログ参照したんですがURL行方不明に…。ごめんなさい、見つかったらリンクはります)

postSuruyo.push({name: 'honya', value: 'honyanya'});


これ以外の普通の書き方は全部だめでした


それに気がつくのに1時間。さらに

この書き方ってこれでPHPでいうところの

$postSuruyo =['honya'=>'honyanya']

と同じなのです。nameとvalueはいわゆるkeyとvalueじゃないのです……。

一種の命令(?)なのですね。


そこに気がつくのにまた1時間


いつになったら前に進むの・・・


そのあとつまったのは

ajaxのdataType

これは受取形式で送信形式じゃないよ!

が、まずひとつ。


んで、書いてる自分もよくわからないのがdataType指定しないと

DOMに直接突っ込むと配列の中身が表示されます。

でもキーからデータ引っ張れません


dataType:‘json'を指定すると、キーから引っ張れますが

直接DOMに埋め込めません


こ、この違いは一体・・・

きっと何か根本的なところの理解が出来てないからだと思います。



でも望むように動いたからいいや


というわけで、いつも通りプログラムは書いたようにしか動いてくれないなぁという1日でした。

PHPで自分自身にPOSTする処理を全部ajaxにしたい症候群

f:id:nazuna_0124:20170312082946p:plain

<form action ="" method="POST"> 

から始まったときの

<input type ="text" name="honya" value="<?php ***htmlspecialchars($_POST['honya'])***?>" >


みたいなindex.phpにページにブチ切れそうになる全国の300人くらいのPHP初心者の皆様こんばんわ。


  • ページの上で$_POSTをチェック。
  • 何かしらの処理
  • 処理を受けつつPHPでループしてhtml生成

この一連の流れが控えめに言って大嫌いです。


動的なフォームから送信するのが特に苦手で、フォームを増やすためにPOSTすると

当然入力が全部消えるのでいちいち入力してあげないといけないという。


これがjsさんに任せるとポコスカオブジェクトを作って、データをぶん投げる。

ぶん投げられ先のphpで中身を確認して適切な中身を投げ返す


こんな感じで、何も意識してないのに役割分担が綺麗にはまるのです。


なんかもういっそ全てajaxで読み込んでbodyごと書き換えたら楽なんじゃとか思い始めました。


ExcelAccessも動的フォームなとても苦手なので尚更ですね。

特にExcelの行のhiddenで擬似的に作った人はあんまりいないと信じたい・・・


とりあえず、jqueryの要素の一番最後にアクセスがとても素直で良い子という1日でした。


訓練内容によってはあまり触れてくれないので、PHPを習得予定の皆様は

この辺は自主学習しておくのがおすすめです!