ページングに合わせたコンテンツ表示

<style>
 .current{
	font-weight: bold;
 }
</style>
<?php

$logdata = array("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z");
$count = count($logdata);
$max = 5;
$limit = ceil($count/$max);

$page = empty($_GET&#91;"page"&#93;)? 1: $_GET&#91;"page"&#93;;

$pstart = ($page == 1)? 0: ($page-1)* $max;
$pend = ($page * $max);


print"<p>";

for($i=$pstart;$i<$pend;$i++){
	if($i >= $count){break;}

	print $logdata[$i]." ";
}

print "</p>";

$page = empty($_GET["page"])? 1:$_GET["page"];
$disp=3;

$next = $page+1;
$prev = $page-1;

$start = ($page-floor($disp / 2) > 0) ? ($page-floor($disp/2)) : 1;
$end = ($start > 1) ? ($page+floor($disp/2)) : $disp; //55
$start = ($limit < $end) ? $start-($end-$limit):$start;

if($page != 1 ) {
         print '<a href="?page='.$prev.'">&laquo; 前へ</a> ';
 }

if(($page - $disp) > 0 | $page == $disp){
	if($start >= floor($disp/2)){
        print '<a href="?page=1">1</a>';
        if($start > floor($disp/2) and $page != $disp){
        	print "..."; 
        }
        if($page == $disp){
        	print " ";
        } 
  }
}
for($i=$start; $i <= $end ; $i++){
        $class = ($page == $i) ? ' class="current"':"";
        if($i <= $limit && $i > 0 )
            print '<a href="?page='.$i.'"'.$class.'>'.$i.'</a> ';
    }

if($limit > $end){
	if($limit - 1 > $end) print "...";
	print '<a href="?page='.$limit.'">'.$limit.'</a>';
}
if($page < $limit){
        print ' <a href="?page='.$next.'">次へ &raquo;</a>';
}
?>

想像してたより、早かった。

次へ前へのページング

<?php

$page = empty($_GET&#91;"page"&#93;)? 1:$_GET&#91;"page"&#93;;
function paging($page,$disp=5){
    $limit = 10;
	$page = empty($_GET&#91;"page"&#93;)? 1: $_GET&#91;"page"&#93;;

	$next = $page+1;
	$prev = $page-1;

	if($page != 1){
		echo '<a href="?page='.$prev.'">&laquo; 前へ</a>';
	}
	if($page < $limit){
		echo ' <a href="?page='.$next.'">次へ &raquo;</a>';
	}

	// print "current:".$page."<br>";
 //    print "next:".$next."<br>";
 //    print "prev:".$prev."<br>";
}

echo paging();

?>

GETパラメーターで複数ページを表示

例えば、60個のデータを1ページ20個まで表示すると考えた場合、
$_GET[“param”]で、パラメーターの値を取得して、条件分岐で表示できる。

<?php

$data = 60;
$per_show = 20;

$page_count = (int)(($data -1) / $per_show) +1;
// echo $page_count;

echo $page_count . "ページまであります。<br>";

$param = (int)$_GET["page"];
if($param){
	if($page_count >= $param){
	echo $param . "ページ目です。";
 }
}
?>

なるほど、こういうことか。

ページングを足してみます。

<?php

$data = 70;
$per_show = 20;

$page_count = (int)(($data -1) / $per_show) +1;
// echo $page_count;

echo $page_count . "ページまであります。<br>";

$param = (int)$_GET["page"];
if($param){
	if($page_count >= $param){
	echo $param . "ページ目です。<br>";
 }
}

echo "<br>";

for($i=0; $i< $page_count; $i++){
   $page = $i + 1;
   echo "<a href=\"?page=".$page."\">".$page."</a> ";
}
?>

うひょー

php5以上でCall to undefined function domxml_new_doc()

domxml_new_docがundefinedと出てしまった。

[vagrant@localhost map]$ php -v
PHP 5.6.27 (cli) (built: Oct 14 2016 14:06:54)

phpのversionは、5.6

php4.0からサポートされているのに何で?と思ったが、以下のようにphp5以上はDOM extensionを使えとのこと。
It will, however, never be released with PHP 5, and will only be distributed with PHP 4. If you need DOM XML support with PHP 5 you can use the DOM extension. This domxml extension is not compatible with the DOM extension.

こちらのDom Object Model
http://us3.php.net/manual/ja/book.dom.php

new DOMDocument(), createElement, appendChild, setAttribute, saveXMLに修正したら問題なく表示されました。

<?php
require("phpsqlajax_dbinfo.php");

$doc = new DOMDocument("1.0");

$node = $doc->createElement("makers");
$parnode = $doc->appendChild($node);

$connection =mysql_connect('localhost', $username, $password);
if (!$connection){
	die('Not connected : ' . mysql_error());
}

$db_selected = mysql_select_db($database, $connection);
if (!$db_selected){
	die ('Can\'t use db:' . mysql_error());
}

$query = "SELECT * FROM markers WHERE 1";
$result = mysql_query($query);
if(!$result){
	die('Invalid query:' . mysql_error());
}

header("Content-type: text/xml");

while ($row = @mysql_fetch_assoc($result)){
	$node = $doc->createElement("marker");
	$newnode = $parnode->appendChild($node);
	$newnode->setAttribute("name", $row['address']);
	$newnode->setAttribute("lat", $row['lat']);
	$newnode->setAttribute("lng", $row['lng']);
	$newnode->setAttribute("type", $row['type']);
}

$xmlfile = $doc->saveXML();
echo $xmlfile;
?>
<makers>
<marker name="580 Darling Street, Rozelle, NSW" lat="-33.861034" lng="151.171936" type="restaurant"/>
<marker name="76 Wilford Street, Newtown, NSW" lat="-33.898113" lng="151.174469" type="bar"/>
<marker name="Greenwood Plaza, 36 Blue St, North Sydney NSW" lat="-33.840282" lng="151.207474" type="bar"/>
<marker name="7A, 2 Huntley Street, Alexandria, NSW" lat="-33.910751" lng="151.194168" type="bar"/>
<marker name="16 Foster Street, Surry Hills, NSW" lat="-33.879917" lng="151.210449" type="bar"/>
<marker name="43 Macpherson Street, Bronte, NSW" lat="-33.906357" lng="151.263763" type="restaurant"/>
<marker name="60-64 Reservoir Street, Surry Hills, NSW" lat="-33.881123" lng="151.209656" type="restaurant"/>
<marker name="60 Riley Street, Darlinghurst, NSW" lat="-33.874737" lng="151.215530" type="restaurant"/>
</makers>

foreach, endforeach

foreach文は、{}を:、endforeachに変更できる。
連想配列のforeach入れ子でも同じですね。

<?php

$investment = array(
		'us' => array('ADARA','BIRDEYE','ClearMotion'),
		'japan' => array('ombie', 'caster', 'Cloud Ace', 'GHELIA')
);

foreach($investment as $contry => $company) :
  foreach ($company as $value) :
  		echo $contry .' : '. $value. '<br>';

 endforeach;
 endforeach;
?>

us : ADARA
us : BIRDEYE
us : ClearMotion
japan : ombie
japan : caster
japan : Cloud Ace
japan : GHELIA

以下のように、endforeach;が1回だとエラーになります。

<?php

$investment = array(
		'us' => array('ADARA','BIRDEYE','ClearMotion'),
		'japan' => array('ombie', 'caster', 'Cloud Ace', 'GHELIA')
);

foreach($investment as $contry => $company) :
  foreach ($company as $value) :
  		echo $contry .' : '. $value. '<br>';

 endforeach;

echo 'endforeachを1回';

hash_hmac

HMAC方式を使用して、ハッシュ値を生成

string hash_hmac($algo, $data, $key)

$algo:アルゴリズムの名前 “md5″、”sha256″、”haval160,4” など…
$key;HMAC 方式でのメッセージダイジェストを生成するために使用する 共有の秘密鍵。

サンプル

<?php

$str = "パスワード";

echo hash_hmac('md5', $str, 'secret') . "<br>";
echo hash_hmac('sha256', $str, 'secret') . "<br>";
echo hash_hmac('haval160,4', $str, 'secret') . "<br>";
?>

さくらのphp-mecabをインストールする際に嵌ってしまった

mecabはphp7.0とphp5.*では、クラスの書き方が異なります。
例:MeCab_Tagger
例:\MeCab\Tagger

その為、git-cloneもしくはwgetでファイルを取得して展開した後に、以下のようにコンパイルするかと思いますが、./configureで、phpのバージョンを指定する必要があります。

phpize
./configure
make
make install

configureでphp-configとmecab-configを指定しますが、さくらの場合、php-configをphpのバージョンごとにディレクトリを分けて管理されている為、利用しているバージョンのディレクトリを指定して、configureしなければなりません。

./configure --with-php-config=/usr/local/php/5.6/bin/php-config --with-mecab=/usr/local/bin/mecab-config

上記は5.6ですが、phpinfoで確認できます。

これを解決するのに、5時間ぐらい調べて何度も試していました。馬鹿ですね。

local storage にkey valueを保存

<script type="text/javascript">
if(typeof localStorage == 'undefined'){
 document.write("<p>お使いのブラウザではお気に入り機能が使えません。</p>");
} else {
	var storage = localStorage;

	function setlocalStorage(){
		var key = document.getElementById("textkey").value;
		var value = document.getElementById("textdata").value;
		if (key && value){
			storage.setItem(key, value);
		}
		key = "";
		value = "";
		viewStorage();
	}

	function removeStorage(){
		var key = document.getElementById("textkey").value;
		storage.removeItem(key);
		key = "";
		viewStorage();
	}

	function removeallStorage(){
		storage.clear();
		viewStorage();
	}

	function viewStorage() {
		var list = document.getElementById("list")
		while(list.firstChild)list.removeChild(list.firstChild);
		for (var i=0; i < storage.length; i++){
			var _key = storage.key(i);
			var tr = document.createElement("tr");
			var td1 = document.createElement("td");
			var td2 = document.createElement("td");
			list.appendChild(tr);
			tr.appendChild(td1);
			tr.appendChild(td2);
			td1.innerHTML = _key;
			td2.innerHTML = storage.getItem(_key);
		}
	}

	function load(){
		var list = document.getElementById("list")
		while (list.firstChild) list.removeChild(list.firstChild);
		for (var i =0; i < localStorage.length; i++){
			var _key = localStorage.key(i);
			var tr = document.createElement("tr");
			var td1 = document.createElement("td");
			var td2 = document.createElement("td");
			list.appendChild(tr);
			tr.appendChild(td1);
			tr.appendChild(td2);
			td1.innerHTML = _key;
			td2.innerHTML = localStorage.getItem(_key);
		}
	}
}
</script>

<h4>お気に入り銘柄入力フィールド</h4>
<p> code : <input id="textkey" type="text"/> 銘柄名:<input id="textdata" type="text"/></p>
<p align="right"><button id="button" onclick="setlocalStorage()">保存</button>
<button id="button" onclick="removeStorage()">削除</button>
<button id="button" onclick="removeallStorage()">全て削除</button></p>

<h4>入力結果</h4>
<table class="tagForList2">
	<tr>
		<th>コード</th><th>銘柄名</th>
	</tr>
	<tbody id="list">
	</tbody>
</table>

グローバルスコープとローカルスコープ

globalでロカールスコープの変数をグローバルでも使えるようにします。

<?php

function sell($name){
	$code = "8411";
	echo $name."さんは" .$code."を空売りしています。";

}

sell('Barclays Bank');
echo $code. "は、出来高の多い銘柄です。"
?>

Barclays Bankさんは8411を空売りしています。は、出来高の多い銘柄です。

globalで宣言します。

<?php

function sell($name){
	global $code;
	$code = "8411";
	echo $name."さんは" .$code."を空売りしています。";

}

sell('Barclays Bank');
echo $code. "は、出来高の多い銘柄です。"
?>

Barclays Bankさんは8411を空売りしています。8411は、出来高の多い銘柄です。

多次元配列の定義

下層をつくるには、更にarray()でくくってあげればOKですね。

<?php

$stock= array(
	'0' => array
			(
				'code' => '4578',
				'name' => 'ラクオリア創薬',
				'price' => '5550',
				'pts' => array
						(
						 'pprice' => '5550',
						 'volume' => '100',
						)

			),
	'1' => array
			(
				'code' => '3825',
				'name' => 'リミックスポイント',
				'price' => '892',
				'pts' => array
						(
						'pprice' => '911',
						'volume' => '40400'
						)
			)

	);

var_dump($stock);
?>

array(2) { [0]=> array(4) { [“code”]=> string(4) “4578” [“name”]=> string(21) “ラクオリア創薬” [“price”]=> string(4) “5550” [“pts”]=> array(2) { [“pprice”]=> string(4) “5550” [“volume”]=> string(3) “100” } } [1]=> array(4) { [“code”]=> string(4) “3825” [“name”]=> string(27) “リミックスポイント” [“price”]=> string(3) “892” [“pts”]=> array(2) { [“pprice”]=> string(3) “911” [“volume”]=> string(5) “40400” } } }