MW211 EXIT

devlog
PHP/月末を求める書式
2022年10月11日
「t」は月数なので月末日にも使える。
┌──────────────────────────────────────┐
│echo date('Y/m/t', mktime(0, 0, 0, 10, 1, 2022));                           │
│//→2022/10/31                                                              │
├──────────────────────────────────────┤
│$newTime = new DateTime();                                                  │
│$newTime->setDate(2022, 10, 1);                                             │
│echo $newTime->format('Y/m/t');                                             │
│//→2022/10/31                                                              │
└──────────────────────────────────────┘
ということで上記のようにも使える。(なお、上記の「1」は~31ならなんでもよい)
分類:PHP
PHP/キーブレイク(グループ数)
2022年09月09日
tableタグでrowspanしたい場合、先頭行にて以降で結合する行を
あらかじめ把握しておく必要がある。

これをPHP上であらかじめ算出しておく方法。
┌──────────────────────────────────────┐
│$添字 = 0;                                                                  │
│while ($添字 < count($配列)) {                                              │
│    $old添字1 = $添字;                                                      │
│    $配列[$old添字1]['行数1'] = 0;                                          │
│    do {                                                                    │
│        $old添字2 = $添字;                                                  │
│        $配列[$old添字2]['行数2'] = 0;                                      │
│        do {                                                                │
│            $配列[$添字]['行数1'] = 0;                                      │
│            $配列[$添字]['行数2'] = 0;                                      │
│            $配列[$old添字1]['行数1']++;                                    │
│            $配列[$old添字2]['行数2']++;                                    │
│            $添字++;                                                        │
│        } while (($添字 < count($配列))                                     │
│              && ($配列[$添字]['キー1'] == $配列[$old添字1]['キー1'])       │
│              && ($配列[$添字]['キー2'] == $配列[$old添字2]['キー2']));     │
│    } while (($添字 < count($配列))                                         │
│          && ($配列[$添字]['キー1'] == $配列[$old添字1]['キー1']));         │
│}                                                                           │
└──────────────────────────────────────┘

これを元にSmartyでは以下のように出力する。
┌──────────────────────────────────────┐
│<table>                                                                     │
│{foreach from=$配列 key=no item=i}                                          │
│  <tr>                                                                      │
│{if $i['行数1'] > 0}                                                        │
│    <td rowspan="{$i['行数1']|escape}">{$i['キー1']|escape}</td>            │
│{/if}                                                                       │
│{if $i['行数2'] > 0}                                                        │
│    <td rowspan="{$i['行数2']|escape}">{$i['キー2']|escape}</td>            │
│{/if}                                                                       │
│    <td>{$i['バリュー']|escape}</td>                                        │
│  </tr>                                                                     │
│{/foreach}                                                                  │
│</table>                                                                    │
└──────────────────────────────────────┘
分類:PHP
PHP/自前のgetCsv()
2022年05月14日
┌──────────────────────────────────────┐
│function getCsv($rows) {                                                    │
│    if (count($rows) == 0) {                                                │
│        return NULL;                                                        │
│    }                                                                       │
│    $return = [];                                                           │
│    $i = 0;                                                                 │
│    $return[] = implode(',', array_keys($rows[$i]));                        │
│    // 二件目以降読込                                                       │
│    do {                                                                    │
│        // CSV補正                                                          │
│        foreach ($rows[$i] as &$column) {                                   │
│            // 「"」を「""」に変換                                          │
│            if (preg_match('/"/', $column)) {                               │
│                $column = preg_replace('/"/', '""', $column);               │
│            }                                                               │
│            // 「"~"」で囲う                                               │
│            if ((preg_match('/"/' , $column))                               │
│             || (preg_match('/,/' , $column))                               │
│             || (preg_match('/\n/', $column)))                              │
│            {                                                               │
│                $column = '"' . $column . '"';                              │
│            }                                                               │
│        }                                                                   │
│        unset($column);                                                     │
│        //                                                                  │
│        $return[] = implode(',', $rows[$i]);                                │
│        $i++;                                                               │
│    } while ($i < count($rows));                                            │
│    return implode("\r\n", $return) . "\r\n";                               │
│}                                                                           │
└──────────────────────────────────────┘
分類:PHP
PHP/MSSQLの#ローカル一時テーブル
2021年10月23日
PHPの(MSSQLのPDOの)既定では、MSSQLの#ローカル一時テーブルが使えない。

「PDO::SQLSRV_ATTR_DIRECT_QUERY」の設定を変えればつかえるようになる。
┌──────────────────────────────────────┐
│$conn = new PDO(~);                                                        │
│$conn->setAttribute(constant('PDO::SQLSRV_ATTR_DIRECT_QUERY'), TRUE);       │
└──────────────────────────────────────┘
どのような副作用があるのかよくわからない(けど目立った影響は見当たらない)。
分類:PHP
PHP/起動時にtrack_errorsのエラー
2021年10月19日
┌──────────────────────────────────────┐
│Directive 'track_errors' is deprecated in Unknown on line 0                 │
└──────────────────────────────────────┘
PHP起動時に以下のエラーが出る場合…
PHP7.2以降では「track_errors」機能が非推奨となったためとのことで
┌──────────────────────────────────────┐
│track_errors = Off                                                          │
└──────────────────────────────────────┘
「php.ini」の指定で上記を「On」から「Off」にすれば解決する。

なお、「track_errors」機能の代わりに「error_get_last()」関数が
使えるようになったとのこと。
分類:PHP
PHP/SQLiteのDLLでエラー
2021年10月18日
┌──────────────────────────────────────┐
│extension=php_pdo_sqlite.dll                                                │
│extension=php_sqlite3.dll                                                   │
└──────────────────────────────────────┘
「PHP.ini」で上記を指定していて、実体もあるのに
起動時に以下のPHPエラー(警告)が出る場合…
┌──────────────────────────────────────┐
│PHP Startup: Unable to load dynamic library 'php_pdo_sqlite.dll' (tried: ~ │
│PHP Startup: Unable to load dynamic library 'php_sqlite3.dll' (tried: ~    │
└──────────────────────────────────────┘
Apacheの「httpd.conf」に以下(~は各自のパス)を追加したら解決した。
┌──────────────────────────────────────┐
│LoadFile "~\libsqlite3.dll"                                                │
└──────────────────────────────────────┘
「php_pdo_sqlite.dll」と「php_sqlite3.dll」の一部が
「libsqlite3.dll」になったらしく、こちらもインクスルードする必要があるらしい。
分類:PHP
PHP/RESTAPI的なことをしてみよう
2020年09月26日
jQuery側(JavaScript)の処理(抜粋)。
┌──┬───────────────────────────────────┐
│参照│$.ajax({                                                              │
│    │    url         :'http://xxxx/api',                                   │
│    │    type        :'GET',                                               │
│    │    data        :JSONデータ,                                          │
├──┼───────────────────────────────────┤
│追加│$.ajax({                                                              │
│    │    url         :'http://xxxx/api',                                   │
│    │    type        :'POST',                                              │
│    │    data        :JSONデータ,                                          │
├──┼───────────────────────────────────┤
│変更│$.ajax({                                                              │
│    │    url         :'http://xxxx/api',                                   │
│    │    type        :'PUT',                                               │
│    │    data        :JSONデータ,                                          │
├──┼───────────────────────────────────┤
│削除│$.ajax({                                                              │
│    │    url         :'http://xxxx/api',                                   │
│    │    type        :'DELETE',                                            │
│    │    data        :JSONデータ,                                          │
└──┴───────────────────────────────────┘

PHP側の処理例。
┌──────────────────────────────────────┐
│switch ($_SERVER['REQUEST_METHOD']) {                                       │
│    case 'GET':                                                             │
│        $data = $_GET;                                                      │
│        echo $this->select($data);                                          │
│        break                                                               │
│    case 'POST':                                                            │
│        $data = $_POST;                                                     │
│        $this->insert($data);                                               │
│        break                                                               │
│    case 'PUT':                                                             │
│        parse_str(urldecode(file_get_contents('php://input')), $data);      │
│        $this->update($data);                                               │
│        break                                                               │
│    case 'DELETE':                                                          │
│        parse_str(urldecode(file_get_contents('php://input')), $data);      │
│        $this->delete($data);                                               │
│        break                                                               │
│}                                                                           │
└──────────────────────────────────────┘
PUTメソッドとDELETEメソッドについては専用のシステム定数がないので
「php://input」からひっぱてくる形となる。
分類:PHP
PHP/APIクライアントテスト用サーバ
2019年07月02日
クライアント側からPOSTした内容をそのまま返すサーバ。
┌──────────────────────────────────────┐
│echo print_r(json_decode(file_get_contents('php://input'), TRUE), TRUE);    │
└──────────────────────────────────────┘
分類:PHP
PHP/同名項目のPOST
2018年09月27日
同名項目(name属性が同じ)をPOSTしたらどうなるか?
┌──────────────────────────────────────┐
│<form method="post" action="test.php">                                      │
│  <div>                                                                     │
│    <input type="hidden" name="abc" value="a">                              │
│    <input type="hidden" name="abc" value="b">                              │
│    <input type="hidden" name="abc" value="c">                              │
│    <input type="submit" value="送信">                                      │
│  </div>                                                                    │
│</form>               ┌────────┐                                  │
├───────────│array(1) {      │─────────────────┤
│<?php                 │  ["abc"]=>     │                                  │
│var_dump($_POST); //→│  string(1) "c" │                                  │
└───────────│}               │─────────────────┘
                        └────────┘
最後の項目の値が有効になるようだ。
分類:PHP
PHP/画像ファイル名のハッシュ化
2018年09月12日
画像ファイルの中身からハッシュ値(SHA1(40文字))を変換して
(コピーして)それをファイル名にするPHPプログラム。
┌──────────────────────────────────────┐
│$input = 'C:\…\ファイル.jpg';                                              │
│$path_parts = pathinfo($input);                                             │
│$output = $path_parts['dirname']                                            │
│        . '\\' . hash_file('sha1', $input)                                  │
│        . '.'  . $path_parts['extension'];                                  │
│if (!copy($input, $output)) {                                               │
│    echo 'コピー失敗(' . $input . ')';                                      │
│}                                                                           │
└──────────────────────────────────────┘
中身が同じであれば同じファイル名となるため、名寄せができる。

ディレクトリ内のすべてのファイルを対象とする場合は以下のような感じ。
┌──────────────────────────────────────┐
│$dir = 'C:\…\ディレクトリ名';                                              │
│main($dir);                                                                 │
│exit();                                                                     │
├──────────────────────────────────────┤
│function main($dir) {                                                       │
│    foreach (glob($dir . '\\*') as $value) {                                │
│        $path_parts = pathinfo($value);                                     │
│        $output = $path_parts['dirname']                                    │
│                . '\\' . hash_file('sha1', $value)                          │
│                . '.'  . $path_parts['extension'];                          │
│        $utf8 = mb_convert_encoding($path_parts['filename'], 'utf-8', 'sjis');
│        if ($output === $value) {                                           │
│            echo 'スキップ(' . $utf8 . ')' . "\n";                          │
│        } else {                                                            │
│            if (copy($value, $output)) {                                    │
│                echo '成功(' . $utf8 . ')' . "\n";                          │
│            } else {                                                        │
│                echo '失敗(' . $utf8 . ')' . "\n";                          │
│            }                                                               │
│        }                                                                   │
│    }                                                                       │
│}                                                                           │
└──────────────────────────────────────┘
分類:PHP
前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 … 18 次へ