PHP・MySQL

  • 例えば以下のような7つの要素を持った配列がある。

    $item_arr = array('A','B','C','D','E','F','G');

    この配列の中身(要素)をすべて表示(出力)したい時

    最も簡単なのは

    PHP

    foreach($item_arr as $item){
        echo $item;
    }
    

    出力結果

    ABCDEFG

    要素の羅列で構わなければこれで良いが、個々の区切りが分からないから、普通は出力時に「、」やカンマ、「/」のような記号を付けて書き出す。

    PHP

    foreach($item_arr as $item){
        echo $item;
        echo ('/');
    }
    

    出力結果

    A/B/C/D/E/F/G/

    個々の区切りは判別しやすくなったが、各要素の出力時に「/」を付加しているため、当然最後の要素(G)の後にも「/」が書き出されている。
    このままではデータとして中途半端な感じが否めない。

    最後の「/」を削除するにはいくつかの方法がある。

    まずは、カンマ区切りのデータで最後のカンマを1つ削りたい時にも使う「rtrim」

    例)

    $str = rtrim($str, ",");
    

    次に、最後の文字を削除する「substr」

    $str = substr($str, 0, -1);
    

    ただしこの場合、区切りに2バイトの文字や記号を使っていると文字化けする。

    区切りに2バイト文字や2バイトの記号を使っている場合は、マルチバイトに対応した「mb_substr」を使う。
    引数に文字コードを正しく指定することがポイント。

    $str = mb_substr($str,0,1,"utf-8");
    

    そして別の方法として、最初から無駄なカンマや記号を出力しない方法もある。

    処理の流れ

    $item_arr = array(‘A’,’B’,’C’,’D’,’E’,’F’,’G’);

    配列の数をカウントする
    $cnt = count($item_arr);

    カウンターの初期化
    $i = 0;

    foreachで各処理を行う
    foreach($item_arr as $item){

    カウンターに1を加算
    $i++;

    要素を出力
    echo $item;

    カウンターが配列の個数と違う場合はカンマや「/」を付加
    if($cnt !=$i){echo(‘ / ‘);}
    }

    出力結果

    A/B/C/D/E/F/G

    解説

    配列の個数は常に「7」
    Aの時 → カウンター「1」 → 「/」を付加
    Bの時 → カウンター「2」 → 「/」を付加
    Cの時 → カウンター「3」 → 「/」を付加
    Dの時 → カウンター「4」 → 「/」を付加
    Eの時 → カウンター「5」 → 「/」を付加
    Fの時 → カウンター「6」 → 「/」を付加
    Gの時 → カウンター「7」

    Gの時、配列の個数「7」とカウンターの数値が一致するから「/」は付加されない。

    実際のスクリプト

    $item_arr = array('A','B','C','D','E','F','G');
    $cnt = count($item_arr);
    $i = 0;
    foreach($item_arr as $item){
        $i++;
        echo $item;
        if($cnt !=$i){echo(' / ');}
    }
    

    サクッと全部に付加して最後に削るか、ちょっと手間をかけて無駄な付加をしないようにするか、目的や状況に合わせて使い分けるといい。

  • 日時データ(2014-05-01 23:59:59)をTwitterなどで使われている「○秒前」「○分後」「○時間前」「○日前」のような表記に変換するには、以下のスクリプトを使う。
    (さらに…)

  • txtSQLは資料が少ないので情報共有として
    (さらに…)

  • txtSQL_01

    安価なサーバーでは、PHPは使えるけれどもDB(データベース)はオプションの場合がある。
    データ件数も少なく、高度な機能を必要としない場合は、txtSQLを使うのもひとつの選択だろう。

    (さらに…)

  • テキストファイルでデータを保存する方法は、データの件数が少ない場合やデータベースの使えないサーバーを利用している場合には簡単で便利なのだが、通常は読み込んだファイルに保存されている順に表示となる。
    (さらに…)

  • JavascriptのみでデータをMySQLのように扱えるJavascriptDBは既存のデータの抽出にも使える。
    (さらに…)

  • JavaScriptのみでデータをMySQLのように使えるjavascriptDBの使い方(その1)で、javascriptDBの簡単な設定方法は説明したが、ページ内に埋め込むことを考え、スタイルシートが使えるように出力されるテーブルにidやclassを設定したり、タグを設定するための方法を説明する。

    設定方法

    jqueryおよびダウンロードしたdb_core.jsを読み込む

    JAVASCRIPT

    <script type="text/javascript" src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
    <script type="text/javascript" src="db_core.js"></script>

    同様にheader内でjavascriptDBの設定
    (別ファイルにしても構わない)

    JAVASCRIPT

    <script>
    var DBTest = new Database ("DBTest");
    DBTest.CreateTable("members",Array("id","login","passwd","tel"));
    
    DBTest.Insert("members",Array(1,"rosibel","clau","934856890"));
    DBTest.Insert("members",Array(2,"joan","palafrugell","934856890"));
    
    var selectArr1 = DBTest.Select('select * from members');
    var selectArr2 = DBTest.Select('select passwd from members where login="joan"');
    
    var selected1 = mView(selectArr1);
    var selected2 = mView(selectArr2);
    
    $(document).ready(function(){
    	$("#output1").html(selected1);
    	$("#output2").html(selected2);
    });
    
    function mView (o){
    	var res = "<table>";
    	for(i = 0; i < o.length; i++){
    		res += "<tr>";
    		for(j = 0; j < o[i].length; j++){res += "<td>"+o[i][j]+"</td>";}
    		res += "</tr>";
    	}
    	res += "</table>";
    	return res;
    }
    </script>

    ボディ内の書き出したい場所にid=”output1″、id=”output2″を設置

    HTML

    <body>
    
    <h2>select * from members</h2>
    <div id="output1"></div>
    
    <h2>select passwd from members where login="joan"</h2>
    <div id="output2"></div>
    
    </body>

    サンプルページ

    上記サンプルにアクセスすると以下のデータが出力される

    <h2>select * from members</h2>
    
    <div id="output1">
    	<table>
    		<tbody>
    		<tr>
    			<td>1</td>
    			<td>rosibel</td>
    			<td>clau</td>
    			<td>934856890</td>
    		</tr>
    		<tr>
    			<td>2</td>
    			<td>joan</td>
    			<td>palafrugell</td>
    			<td>934856890</td>
    		</tr>
    		</tbody>
    	</table>
    </div>
    
    <h2>select passwd from members where login="joan"</h2>
    
    <div id="output2">
    	<table>
    		<tbody>
    		<tr>
    			<td>palafrugell</td>
    		</tr>
    		</tbody>
    	</table>
    </div>

    解説

    1. データベースをセット

    var DBTest = new Database ("DBTest");

    2. テーブル名とカラム名をセット

    DBTest.CreateTable(“members”,Array(“id”,”login”,”passwd”,”tel”));

    3. データを挿入

    DBTest.Insert("members",Array(1,"rosibel","clau","934856890"));
    DBTest.Insert("members",Array(2,"joan","palafrugell","934856890"));

    4-1. セレクト文にて全データを出力(mySQLと同様)

    var selectArr1 = DBTest.Select('select * from members');

    4-2. MySQLと同様にwhereを使って条件抽出も可能

    var selectArr2 = DBTest.Select('select passwd from members where login="joan"');

    5. 各抽出データをテーブルに成形 ※1

    var selected1 = mView(selectArr1);
    var selected2 = mView(selectArr2);

    6. 各データをjqueryを使って書き出し

    $(document).ready(function(){
    	$("#output1").html(selected1);
    	$("#output2").html(selected2);
    });

    ※1 javascriptDBの結果をテーブルに成形するfunction

    function mView (o){
    	var res = "<table id='my-tbl'>";
    	for(i = 0; i < o.length; i++){
    		res += "<tr>";
    		for(j = 0; j < o[i].length; j++){res += "<td>"+o[i][j]+"</td>";}
    		res += "</tr>";
    	}
    	res += "</table>";
    	return res;
    }

    ※1で javascriptDBの結果をテーブルタグで書き出すように設定しているが、サンプルのように<table>にidを設定(<table id=’my-tbl’>)したり、必要に応じて<hd>の代わりに<th>を使ったり<td class=’col-ab’>のようにすることができる。
    あとは書き出したタグに対応したスタイルシートを設定すればいい。

    CSS

    <style>
    h2 {
    	margin-bottom:1px;
    	font-weight:normal;
    	font-size:1em;
    }
    table {
    	border-collapse: collapse;
    }
    table td {
    	padding:2px 8px;
    	text-align:center;
    	border:1px solid #ccc;
    }
    </style>
  • データベース不要、PHP等が使えなくてもHTMLとJavaScriptだけでMySQLのようなselect文が使えるのはもちろん、whereでの条件設定も使えるという便利なjavascriptDBはお手軽なデータベース構築におススメ。

    db_core.jsのダウンロードは以下のURLから

    http://jsdb.sourceforge.net/usarho.html

    設定方法

    jqueryおよびダウンロードしたdb_core.jsを読み込む

    <script type="text/javascript" src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
    <script type="text/javascript" src="db_core.js"></script>

    使い方

    body内でjavascriptDBを設定

    JAVASCRIPT

    <script>
    var DBTest = new Database ("DBTest");
    DBTest.CreateTable("members",Array("id","login","passwd","tel"));
    DBTest.Insert("members",Array(1,"rosibel","clau","934856890"));
    DBTest.Insert("members",Array(2,"joan","palafrugell","934856890"));
    var selectArr2 = DBTest.Select('select passwd from members where login="joan"');
    DBTest.View(selectArr2,document);
    </script>

    サンプルページ

    上記のコードをブラウザで見るとただの文字だが、body内に以下のデータが書き出されている

    <table>
    <tbody>
    <tr>
    <td>palafrugell </td>
    </tr>
    </tbody>
    </table>

    上記サンプルの場合、1単語1件のみのデータだが、内容に関係無くテーブル形式のデータとして出力される

    解説

    1. データベースをセット

    var DBTest = new Database ("DBTest");

    2. テーブル名とカラム名をセット

    DBTest.CreateTable("members",Array("id","login","passwd","tel"));

    3. データを挿入

    DBTest.Insert("members",Array(1,"rosibel","clau","934856890"));
    DBTest.Insert("members",Array(2,"joan","palafrugell","934856890"));

    4. MySQLと同様にwhereを使って条件抽出も可能

    var selectArr2 = DBTest.Select('select passwd from members where login="joan"');

    5. 書き出し

    DBTest.View(selectArr2,document);

    単独で扱うにはこのままでも良いが、ページ内に埋め込むことを考えると出力されるテーブルにidやclassを設定したりテーブル以外のタグで書き出したい時もあるだろう。
    javascriptDBの出力データの成形およびタグの設定については次の記事で掲載する。

    javascriptDBで出力されるタグを変更したい時はこの方法

  • phpThumbはとても便利なライブラリなので、通常のウェブサイトの他、WordPressやMovable Typeと組み合わせて使っている人もいるだろう。
    いままで問題無く表示されていたphpThumbを使ったサムネイルの画像が表示されなくなる原因のひとつがサーバーのPHPがバージョンアップ。
    phpThumbはバージョンによってPHP5.3の環境ではエラーを返すようになる。
    簡単な見分け方は簡単。
    表示されない画像にALTが設定してあれば、画像の代わりにALTの文字が表示されているはず。右クリックで画像のみを表示させると、画像の代わりに下記のようなエラーコードが表示される。

    Deprecated: Function eregi() is deprecated in /phpThumb_x.x.x/phpthumb.functions.php on line …

    PHP 5.3では非推奨のeregi()が使われていることに対する警告

    対応方法だが、選択肢は2種類。

    1.  警告 メッセージのみ消す

    スクリプト先頭の
    error_reporting(E_ALL);
    ini_set(‘display_errors’, ‘1’);
    を変更。

    簡単だが、これはおススメしない。
    2の方法を施すまでの臨時対応にとどめたい。

    2. phpThumb-for-PHP-5.3にする

    以下のURLからphpThumb-for-PHP-5.3をダウンロードして置き換える

    https://github.com/simpson/phpThumb-for-PHP-5.3

    ページ右側にある「Download Zip」ボタンから一式をダウンロード

  • データ自体はかなり細かく保存されているが、欲しいのは大まかなデータで良い時、
    select文で条件をいろいろつけて取り出すのもひとつの方法だが、まずは一気に取得してしまってから、出力する前に間引くというのもひとつの方法。

    例えば、カラムにタイムスタンプがあれば、以下の方法で、同一分は一度だけ出力することができる。

    $output = "";
    while($col = $rst->fetchRow(MDB2_FETCHMODE_ASSOC)){
    $update_jf = date("Hi", $col['time']);
    if($update_jf != $sumi_jf){
    $output .= $col['main'];
    }
    #出力済時分にセット
    $sumi_jf = $update_jf;
    }

    さらに簡単にしたいなら、以下の方法(2分の1に間引き)

    $output = "";
    while($col = $rst->fetchRow(MDB2_FETCHMODE_ASSOC)){
    if($n % 2 == 0){
    $output .= $col['main'];
    }
    $n++;
    }

    3分の1に間引きたければ以下の方法

    $output = "";
    while($col = $rst->fetchRow(MDB2_FETCHMODE_ASSOC)){
    if($n % 3 == 0){
    $output .= $col['main'];
    }
    $n++;
    }