<p>setCookie</p>
<script>
function setCookie(c_name,value,expiredays){
var path = location.pathname;
var paths = new Array();
paths = path.split("/");
if(paths[paths.length-1] != ""){
paths[paths.length-1] = "";
path = paths.join("/");
}
var extime = new Date().getTime();
var cltime = new Date(extime + (60*60*24*1000*expiredays));
var exdate = cltime.toUTCString();
var s = "";
s += c_name +"="+ escape(value);
s += "; path="+path;
if(expiredays){
s += "; expires=" +exdate+"; ";
} else {
s += "; ";
}
document.cookie = s;
}
window.onload = setCookie('test', 'sample', 7);
</script>
Category: PHP
ページングに合わせたコンテンツ表示
<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["page"])? 1: $_GET["page"];
$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.'">« 前へ</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.'">次へ »</a>';
}
?>


想像してたより、早かった。
次へ前へのページング
<?php
$page = empty($_GET["page"])? 1:$_GET["page"];
function paging($page,$disp=5){
$limit = 10;
$page = empty($_GET["page"])? 1: $_GET["page"];
$next = $page+1;
$prev = $page-1;
if($page != 1){
echo '<a href="?page='.$prev.'">« 前へ</a>';
}
if($page < $limit){
echo ' <a href="?page='.$next.'">次へ »</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は、出来高の多い銘柄です。