カテゴリー: PHP

  • RSIをPHPで計算・算出する方法

    RSIをPHPにて計算・算出します。

    計算式は、

    RSI = n日間の値上がり幅合計 ÷ (n日間の値上がり幅合計 + n日間の値下がり幅合計) × 100

    一般にnには、14日が使われています。松井証券のQUICK情報やヤフーファイナンスでも14日となっています。

    以下がそのスクリプトです。
    global宣言した変数・配列には、関数外で値を設定してください。$stocks_endには、データベースから終値を引っ張る処理を事前にしています。

    //RSI算出  
    function get_rsi($offset) {
        global $rsi_term ; //rsi算出期間  
        global $stocks_end ; //終値配列データ(直近の添え字が0) 
        //開始地点から要素を切り出し     
        $array = array_slice($stocks_end, $offset);
        $plus  = 0 ;
        $minus = 0 ;
        $diff  = 0 ;
        for ($i = $rsi_term ; $i > 0; $i--) {
            $j = $i - 1 ; //jが本日、iが昨日         
            //本日終値から昨日終値を引いて差を求める         
            $diff = $array[$j] - $array[$i] ;
            if ($diff > 0) {
                $plus += $diff ;
            } else {
                $minus += -($diff) ;
            }
        }
        return round($plus / ($plus + $minus) * 100) ;
    }
    
    //RSI取得 
    for ($i=0; $i < 3; $i++) { //3日分取得     
        $rsi[$i] = get_rsi($i) ;
    }
  • 【phpMyAdmin】特定のレコードを部分的にエクスポートする方法

    MySQLを扱う場合に便利なのが、phpMyAdminです。

    ここでは、phpMyAdminで、特定のレコードを部分的にエクスポートする方法について覚書しておきます。

    前提知識として、データベースのエクスポートは、データベースを選択して、エクスポートタブをクリックし、SQLを選択、そして、zip形式、または、gzip形式でエクスポートします。

    テーブルのエクスポートについても、同様に、テーブルを選択して、エクスポートタブをクリックし、SQLを選択、そして、zip形式、または、gzip形式でエクスポートします。

    エクスポートについて

    さて、特定のレコードを部分的にエクスポートする方法ですが、まず、テーブルを選択して、エクスポートしたい特定のレコードをセレクトし表示させます。

    次に、その画面下部にある、すべてチェックするを選択し、「チェックしたものを」の「エクスポートアイコン」をクリックします。×印アイコンの隣が、エクスポートアイコンです。

    すると、エクスポートページが表示されます。ただ、この段階では、まだエクスポートはされていません。

    通常の場合と同様に、SQLを選択し、zip形式、または、gzip形式でエクスポートします。

    この際に、エクスポート形式を、INSERT、UPDATE、REPLACEの3つから選択することができます。

    エクスポートしたデータを、どのように利用するかで選択が分かれます。挿入するならINSERT、更新するならUPDATEを選択します。

    ちなみに、自分の場合では、ローカルに置いたDBを一部更新した後、そのデータを本番サーバーに反映させる目的で使用するので、UPDATEを選択するようにしています。

    このように特定のレコードを部分的にエクスポートすると、DB全体の入れ替えをする必要がないので、使いようによっては便利なものと言えます。

    インポートについて

    最後に、インポートの方法ですが、まず、該当テーブルを選択して、インポートタブをクリックします。

    すると、インポート画面が表示されるので、そこで、ローカルのファイルを選択し、SQLを選択、そして、実行するだけです。

  • 漢数字→アラビア数字変換ツール

    必要にせまられて、PHPで漢数字→アラビア数字変換ミニアプリを作成したので、紹介しておきます。

    漢数字→アラビア数字変換ツール

    数字単体だけでなく、文章中に出てくる漢数字を半角アラビア数字に変換します。

    なお、全角・半角の変換をしたい人には、

    全角半角変換ツール

    を紹介しておきます。

    お約束ですが、ご利用は自己責任でお願いします。

  • 【PDO】bindParamとbindValueの違い【PHP】

    bindParamとbindValueの違いについての覚書です。

    bindValue : 値をパラメータにバインドする
    プリペアドステートメントで使用する SQL 文の中で、対応する名前あるいは疑問符のプレースホルダに値をバインドします。

    bindParam : 指定された変数名にパラメータをバインドする
    準備された SQL ステートメント中で、   対応する名前もしくは疑問符プレースホルダにパラメータをバインドします。   PDOStatement::bindValue() と異なり、   変数は参照としてバインドされ、PDOStatement::execute()がコールされたときのみ評価されます。

    PHPマニュアルの該当箇所には、このような説明があります。

    ただ、これだけでは何のことかイマイチ分かりません。

    この二つで分かりやすいのは、単純な動作のbindValueです。

    基本的な動作は、こちらが素直です。どういうことかというと、bindValueメソッドが実行されると、その時点で、バインドされる値が確定します。下のコードだと、150とredという値が、bindValueされる時点で確定するということです。言い換えると、executeされる前に値が確定するのです。

    $calories = 150;
    $colour = 'red';
    $sth = $dbh->prepare('SELECT name, colour, calories
        FROM fruit
        WHERE calories < :calories AND colour = :colour');
    $sth->bindValue(':calories', $calories, PDO::PARAM_INT);
    $sth->bindValue(':colour', $colour, PDO::PARAM_STR);
    $sth->execute();

    これに対して、bindParamは、値が確定するタイミングが、bindValueよりも遅くなります。どういうことかというと、executeされるまでは、値を参照しているにすぎないのです。つまり、bindParamしても、値は確定していない。言い換えると、参照している変数の中身が変わると、別の値がバインドされる可能性があるということです。

    これは、bindParamをループ内で使用すると不具合となって表れます。

    Vili28-May-2010 12:01
    
    //これは動かない。なぜなら、$valの値が上書きされてしまうから。
    This will fail ($val by value, because bindParam needs &$variable):
    <?php
    foreach ($params as $key => $val) {
        $sth->bindParam($key, $val);
    }
    ?>
    
    //これは上手く動く。なぜなら、参照を渡しているから。
    This works ($val by reference):
    <?php
    foreach ($params as $key => &$val) {
     $sth->bindParam($key, $val);
    }
    ?>
    

    上のように、&をつけて参照にすると上手く動きますが、このような場合には、bindValueして、その時点で値を確定してやると、同様に上手く動くようになります。

    PHPの参考書などでは、理由なくbindParamの方が多用されていますが、単純なバインドをするなら、bindValueで足りると思われます。

    ループ内でbindParamをして不具合が生じているなら、以上の点を確認してみると上手くいくはずです。

  • 【XAMPP】errorディレクトリが403エラーの件

    XAMPPでローカル環境を構築しているのですが、一点、どうしても分からないことがあります。ちなみに、ヴァージョンは、1.7.4です。

    例として、XAMPPで、example.comを運用しているとします。

    その際、エラー関係表示用に、errorディレクトリを作成し利用。

    つまり、http://example.com/error/

    として、運用するわけです。

    このerrorディレクトリが下のように403エラーになり表示されません。

    Access forbidden!
    要求されたディレクトリへのアクセス権限がありません。
    インデックスドキュメントが存在しないか、ディレクトリの読み込みが
    許可されていません。
    サーバーの障害と思われる場合は、ウェブ管理者までご連絡ください。
    Error 403

    他のディレクトは、問題なく表示されるのに。

    色々、検索して調べても原因が不明です。同じ症状の人がいないのかな。

    ためしに、errorディレクトリをerror1とかに少し変えてやると上手く表示できます。

    ちなみに、本番環境のレンタルサーバーでは、errorディレクトリのままで上手くいきます。

    多分、XAMPPのapachの設定がerrorディレクトリを何か特別な意味の有るものとしていると推測されるのですが、詳細が掴めません。

    解決策ができたら、解決法をアップする予定です。それまで。

    以上です。