PHP Vue.js MySQLから取得(JSON)+更新

PHP復習のため、
・PHPでのログイン+ログアウト
・Vue.jp→PHP→MySQLでの取得(JSON)+更新
を作成してみた。

config.php

index.php

json.php

login.php

logout.php

 

PHP ログイン処理

PHPほぼ忘れてしまったので勉強中。

 

PHP session メモ

セッションはクッキーと違いサーバーで値を管理し、識別用のPHPSESSIDのみクライアントに渡す。

***

・データがある場所

(1)ファイル(/var/lib/php/session)

session.gc_maxlifetimeを過ぎたあと、PHPにリクエストがあった場合、
(session.gc_probability / session.gc_divisor)の確率でGCが削除。

共有しているため違うアプリでGCが動くこともある。
必要なら、session.save_pathから個別に設定する。

(2)グローバル変数($_SESSION)

スクリプト終了時、ファイルに保存される。

(3)ブラウザクッキー(PHPSESSID)

ブラウザ閉じるまで保存される。

・session_start()

session_start()すると、
(3)がなければ割り当てる。既に存在する場合は再開する。
(1)のデータを(2)に格納。

スクリプトが終了すると、
(2)のデータを(1)に格納

(1)はスクリプトが終了されるまでロックされる。
必要なら、session_write_close()

・グローバル変数

session_start()しなくても(2)を変数としては使えるが、(1)には保存されない。

test1php

test2.php

エラーにはならない。この場合session_start()
しても結果は同じなので分かりづらい。

test2.php

この場合Noticeがでる。

・データ破棄

$_SESSION = array();
(2)を削除

session_destroy()にて
(1)を削除。(session_start()していないと削除できない)

・session_regenerate_id()

(1)の古いファイルは残したまま、新しいファイルが作成される。
(2)そのまま使える。
(3)は新しくなる。

PHP MySQLデータをJSONで書き出し

PHP久しいので近いうち復習する。

 

PHP セキュリティメモ

最低限の部分

・PHP.ini

今回は、さくらのレンタルサーバーで利用している。
設置場所は、ドキュメントルートで、
echo phpinfo();
Loaded Configuration File
に反映される。

php.iniのパーミッションは600

追加内容は、
display_errors = Off
expose_php = Off

session.name = “hoge”
session.use_strict_mode=On
session.cookie_httponly=On
; HTTPSの場合
session.cookie_secure=On

allow_url_fopen = Off
file_uploads = Off

; post_max_sizeより大きくする
memory_limit = 20M
; upload_max_filesizeより大きくする
post_max_size = 20M
upload_max_filesize = 20M

・通常ファイル、ディレクトリのパーミッション

ファイル
604(もしくは644)

ディレクトリ
705(もしくは755)

・プログラム

リクエストにはワンタイムトークンを付加。
入力された値はサニタイジング。

 

PHP お問い合わせフォーム

 

PHP+JavaScript(Vue.js) メモプログラム

何かメモを取る場合、テキストファイルにパッと書くことが多いので、ブラウザに書けたらどうだろうと思い作成してみた。

普段からブラウザは開いているし、レンサバに設置すれば外でも見れるので、テキストファイルより便利になりそうと思っていたが、しばらく使ってみて、やっぱりテキストファイルに戻ってしまった。

Windows上にサーバー作成 Nginx/PHP/MariaDB/WordPress

以前は必要になるとXamppを使ってたけど、今回はNginx環境を手動で作ってみる。

Nginx

Windows用のzipファイルをダウンロードし解凍する。設定ファイルはもともとのコメント部を消して、とりあえずこんな感じ。

nginx-1.19.2/conf/nginx.conf

Nginxフォルダのパスに日本語があると起動しない場合があるので注意。

PHP

ダウンロードして解凍したら、phpというフォルダでnginxの中に入れる。
(nginx-1.19.2/php)

php.ini-development
をコピーしてphp.iniにし、
extension_dir=”ext”
extension=php_mysqli.dll
を追記する。

MariaDB

ダウンロードして解凍したら、mariadbというフォルダでnginxの中に入れる。
(nginx-1.19.2/mariadb)

nginx-1.19.2/mariadb/bin
の中にある、mysql_install_db.exeを実行すると、
nginx-1.19.2/mariadb/data
が作成され、my.iniも入っている。
(Nginxフォルダを移動したらmy.iniを修正しないと起動しない)

手動でDB作成等に使う場合、まずbinの中のmysqld.exeを起動。次にコマンドプロンプトからmysql -u root のような感じでログインできる。

・設定
nginx-1.19.2/mariadb/bin
に移動しmysqldを起動後、
mysql -u root
とするとログインできる。

mysql> set password = password(“1234”);

・データベース作成
mysql> create database wpd character set utf8;
(utf8を指定しないとWPのインストールでエラー)

起動・終了バッチ

start.bat

my.iniを自動で書き換える場合このような感じ

stop.bat

あるいは全て強制終了
(こうしないとプロセスが残る場合あり)

mysql.bat

mysqlのディレクトリに移動するためだけのバッチ

WordPress

nginx-1.19.2\html\wp
にWordPressを解凍したので、ブラウザから、
http://localhost/wp

にアクセス。

DBの情報を入れて送信したところ、
サイトに重大なエラーがありました。
と表示されエラーになった。
(1度目のインストール)

・DBをリセット
フォルダを手動で削除せず、mysqlのコマンドからdrop databaseする。
そして再度create databaseする。

・wp-config.phpを削除
wp-config-sample.phpを複写し、名前をwp-config.phpに変更する。

wp-config.phpが存在しないと自動でwp-config.phpは作成されるが、ここでは手動でwp-config.phpを設定する。

wp-config.phpの以下の部分をtrueに変更する。
define( ‘WP_DEBUG’, true);

以下の部分にDB情報を記入する。
define( ‘DB_NAME’, ‘wpd’ );
define( ‘DB_USER’, ‘root’ );
define( ‘DB_PASSWORD’, ‘1234’ );

再度挑戦するが、
サイトに重大なエラーがありました。
と表示されるだけで、特にエラー内容は表示されない。
(2度目のインストール)

Nginxのログ(logs/error.log)
を確認すると、
Fatal error: Maximum execution time of 30 seconds exceeded
とあるので、
php.iniで下記の部分を30から120に変更
max_execution_time = 120
(3度目のインストール)

これでインストールできた。

LAN経由(外部)から見る場合、ファイアーウォールに新しい規則を追加する。
もしCSSが適用されていない場合は、
設定>一般>アドレス
をIPアドレスに変更してみる。

CodeIgniterでホームページの骨格作成2

DB使わずにファイルで管理するタイプ。頻繁に更新するようなら、サブメニューは自動でファイルを読み込んで自動で生成した方が楽になりそう。

CSSだけRewrite除外する。

コントローラ(今回のクラス名は適当)

ビュー

1.php

2.php

header.php

footer.php

CodeIgniterでホームページの骨格作成

実験として記事をSQLiteで取り出すタイプ。記事を作成してSQLiteに登録するのは面倒で、
実際に運用する場合、記事はファイルとした方が楽そう。

コントローラ

モデル

ビュー

CodeIgniter + SQLite + mod_rewriteの使い方メモ

SQLiteメモ

DBへの作成、接続
sqlite3 xxx

情報確認
.schema

終了
.exit

指定できる型
TEXT
NUMERIC
INTEGER
REAL
NONE

キーワード

PRIMARY KEY、ROWID、AUTOINCREMENT

INTEGER PRIMARY KEYと設定しても自動で増加するが、以前使った値を再度使う。
INTEGER PRIMARY KEY AUTOINCREMENTとすると、以前の値を使わない。

create table xxx (id integer primary key autoincrement)
のような感じ。

NOT NULL、UNIQUE、DEFAULT、CHECK

テーブルの作成、削除は標準
create,drop等。

例)
create table news (
id integer not null primary key autoincrement,
title text not null,
slug text not null,
text text not null
);

xampp+SQLiteでの設定

php.iniの以下コメント外す
extension=php_sqlite3.dll

application\config\database.php
の以下を修正

‘database’ => APPPATH.’sqlite/db’,
‘dbdriver’ => ‘sqlite3’,

SQLiteのみ別記事へ

CodeIgniterの使い方(ユーザガイド参考)

コントローラ

application/controllers/pages.php
コントローラクラス名とファイル名が同じ。

ルーティングはこのような感じ。
/コントローラクラス/コントローラクラスメソッド/引数
例)
http://localhost/c/index.php/pages/view/news

定義はこのような感じ
class Pages extends CI_Controller {
public function view($page = ‘home’){}
}

CI_Controllerを継承しているので、
system/core/Controller.php
を利用できる。

テンプレート

application/views/templates/header.php

以下のような感じ。
<html>
<head>
<title>CodeIgniter Tutorial</title>
</head>
<body>
<h1><?php echo $title; ?></h1>

静的なページ

application/views/pages/
home.phpやabout.php等作成。

コントローラからの呼び出し

public function view($page = ‘home’)
{
if ( ! file_exists(APPPATH.’views/pages/’.$page.’.php’))
{
show_404();
}
$data[‘title’] = ucfirst($page); // 頭文字を大文字に
$this->load->view(‘templates/header’, $data);
$this->load->view(‘pages/’.$page, $data);
$this->load->view(‘templates/footer’, $data);
}

モデルの作成

application\models
News_model.phpを作成し、以下を記述

<?php
class News_model extends CI_Model {
public function __construct()
{
  $this->load->database();
}
public function get_news($slug = FALSE)

{
if ($slug === FALSE)
{
$query = $this->db->get(‘news’);
return $query->result_array();
}
$query = $this->db->get_where(‘news’, array(‘slug’ => $slug));
return $query->row_array();
}
}

モデルを呼び出すためのコントローラ

<?php
class News extends CI_Controller {
public function __construct()
{
parent::__construct();
$this->load->model(‘news_model’); //モデルのロード
$this->load->helper(‘url_helper’);
}
public function index()
{
$data[‘news’] = $this->news_model->get_news();
//モデル->モデルメソッド
}
public function view($slug = NULL)
{
$data[‘news_item’] = $this->news_model->get_news($slug);
}
}

変数

コントロール内の$data[‘title’]のビュー内の$title

ルーティング

application/config/routes.php

$route[‘default_controller’] = ‘pages/view’;
default_controllerはURIに何もない場合、
コントローラ/メソッドになるがメソッドを省略するとindexを呼ぶ。

$route[‘(:any)’] = ‘news/$1’;
//このルーティングを使うと、
//http://localhost/c/index.php/create
//とアクセスすると、
//http://localhost/c/index.php/news/create
//実際は上記にアクセスしたことになる。

index.phpを消す。

httpd.confのmod_rewriteが有効かどうか確認。(通常有効)

ルートに.htaccessを作成。(localhost/c/.htaccess)

RewriteEngine on
RewriteCond $1 !^(index\.php|images|robots\.txt)
RewriteRule ^(.*)$ /c/index.php/$1 [L]
と記述。

.htaccess(mod_rewrite)について

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

RewriteCondは
RewriteRuleを実行するための条件。IF文のようなもの。

以下記述例。

RewriteCond %変数名(テスト文字列) 条件パターン(正規表現) [フラグ]
RewriteRule ここにRewriteRuleのURL書換&転送設定を記述

フラグは何も記述しないとANDで、ORの場合[OR]と記述。
[OR]を使わずに空白行を入れてもOR扱い。
[NC]と記述すると大文字/小文字の区別をしない。
ふたつ同時の場合。[OR,NC]

WordPress等のmod_rewrite

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

# Rewrite処理後にベースとなるURL
# 記述がないとhtaccessの設置ディレクトリが選択
# RewriteRuleが相対パスのみ適用される。

RewriteCond %{REQUEST_FILENAME} !-f

# %{REQUEST_FILENAME} が !-f だったという条件式。
# ! と -f であり、
# -f はファイルかどうか。! は真偽の反転。

RewriteCond %{REQUEST_FILENAME} !-d

# -d はディレクトリかどうか

RewriteRule . /index.php [L]

# URLが(.)だったら、/index.phpを参照。
# 全てのアクセスが/index.phpを参照ということ。
# [L]は最後という意味。

</IfModule>

フラグは
[NC] 大小区別無し
[R] リダイレクト
[R=301] リダイレクト

PHP Javascript 工程管理

以前作っていた工程管理。お蔵入り版。

PHP Javascript 在庫管理

以前作っていた在庫管理。お蔵入り版。
1つのファイルにHTML,CSS,JS,PHPを全て書き込んでいた。

PHP IPアドレス確認用POST

クライアント

あるいは、

Winならタスクスケジュール、ubuntuならCRONに設定しておくと、
定期的にWan側のIPがレンサバに表示できるので、そのWan側のIPを使って、
SoftEtherをダイナミックDNSではなく、IP直打ちもできる。
xxx.xxx.xxx.xxx/192.168.xxx.xxxのような感じで入力する。

post.php

s.css

PHP 工程管理テストアプリ

table.php