ラベル PHP の投稿を表示しています。 すべての投稿を表示
ラベル PHP の投稿を表示しています。 すべての投稿を表示

WSL #38:phpMyAdminデータベースインポート時のエラー


環境

■ WSLバージョン:
WSL バージョン: 2.3.24.0
カーネル バージョン: 5.15.153.1-2
WSLg バージョン: 1.0.65
MSRDC バージョン: 1.2.5620
Direct3D バージョン: 1.611.1-81528511
DXCore バージョン: 10.0.26100.1-240331-1435.ge-release
Windows バージョン: 10.0.22631.4317

■ Ubuntuバージョン:
Distributor ID: Ubuntu
Description: Ubuntu 24.04.1 LTS
Release: 24.04
Codename: noble

■ Dockerバージョン:
Version: 27.3.1

■ その他バージョン:
MySQL: 9.1.0 - MySQL Community Server -GPL
phpMyAdmin: 5.2.1
s

phpMyAdminデータベースインポート時のエラー

WSL #36:Docker上にphpMyAdmin環境を作る」で作成したphpMyAdminを使って、とある環境のエクスポートデータをインポートしたところエラーとなった。
エクスポートファイルサイズが大きいらしい。


WSL, WSL2, Windows Subsystem for Linux, Docker, Container

WSL #33:PHPからの書き込みでPermission denied


環境

■ WSLバージョン:
WSL バージョン: 2.3.24.0
カーネル バージョン: 5.15.153.1-2
WSLg バージョン: 1.0.65
MSRDC バージョン: 1.2.5620
Direct3D バージョン: 1.611.1-81528511
DXCore バージョン: 10.0.26100.1-240331-1435.ge-release
Windows バージョン: 10.0.22631.4317

■ Ubuntuバージョン:
Distributor ID: Ubuntu
Description: Ubuntu 24.04.1 LTS
Release: 24.04
Codename: noble

WSL+Ubuntu+Docker上のPHPからの書き込みでPermission deniedとなる

過去記事「WSL #32:Docker上にPHP環境を作る」で構築したphp環境で、とあるサイトのソースを動かしたところ
エラーが発生した。
Fatal error: Uncaught UnexpectedValueException: The stream or file "/var/www/html/log/xxx.log" could not be opened: Failed to open stream: Permission denied in ・・・

永続化した /var/www/htmlに書き込み権限が無いらしい。
コンテナに接続し権限を付与する。
LinuxでDockerを動かすとたまに発生するらしい。(ホストとコンテナのUID/GID不一致?)

■ コンテナへbash接続
      sudo docker exec -it php /bin/bash
    
※ 過去記事「Docker #19:起動中コンテナのbash起動」参照

■ 権限付与
      chmod 755 /var/www/html/log
    
※ 過去記事「Linux:chmodコマンド」参照

これでエラーは無くなった。


WSL, WSL2, Windows Subsystem for Linux, Docker, Container, PHP

PHP:継承元のメソッドを呼び出すには?

PHPで継承元のメソッドを呼び出すには?
VB.NETでいうMyBaseのような・・・

parent:: を使う

phpMyAdmin:インポートでエラー


phpMyAdminでインポートしようとするもエラー

別環境のphpMyAdminでエクスポートしたSQLファイルを新環境でインポートしようとしたらエラーとなった。
アップロードしようとしたファイルが大きすぎるようです。この制限に関する対策についてはドキュメントをご覧ください。
ドキュメントを見たが英語なので探せなかった。

SQLファイルのサイズは17MB。
おそらくPHPのアップロードサイズ制限に引っかかってるんだろう。

対応

php.iniの "upload_max_filesize"、"post_max_size" の値を変更する。
現在の値はそれぞれ "2M"、"8M" だったので "20M" へ変更し Apacheを再起動。
phpMyAdminのインポート画面を開くと、アップロードファイル最大サイズが"20MiB" と表示されるようになりインポートできた。


PHP, MySQL, phpMyAdmin

PHP:変数の値が数値であるか調べるには?


PHPで変数の値が数値であるか調べるには?

is_numeric関数でOK
https://www.php.net/manual/ja/function.is-numeric.php

PHP8.0.0以降で挙動に変化あり。
例 "42 " など空文字で終わる数値形式の文字列の場合、8.0.0以降はtrue、8.0.0より前のバージョンではfalseとなる。


PHP

PHP:Oracleに接続できない


Oracleに接続できない

oci_connectでORACLEに接続しているが ORA-01017 で接続できない。
接続情報は合っているはず。

環境

Windows 10 21H2 (19044.1288)
Apache 2.2.34(x86)
PHP 5.4.22
Oracle Database 19.0
Oracle Instant Client 10.2
OCI8

原因と対応

原因不明
ALTER USER xxx IDENTIFIED BY xxx; でもう一度パスワードを設定しなおしたら正常動作した。


PHP, Oracle, OCI8

PHP:PHP8.1環境でのSmartyエラー

Dockerで作成したPHP環境(PHP8.1環境)にてSmartyの警告が発生した


環境

PHP 8.1.0
Smarty 3.1.36

現象

Dockerで作成したPHP環境(PHP8.1環境)にて、既存のPHPで作成してあるプログラムを実行させたら警告が発生した。
Deprecated: Function strftime() is deprecated in /var/www/html/xxx/vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_codeframe.php on line 48

原因

strftime関数はプラットフォームに依存する問題があるためPHP8.1.0で非推薦となった模様。

対応

とりあえずSmartyをアップデート(composer update smarty/smarty)してみる。
3.1.36 → 3.1.40

今度は違うエラーが発生
Fatal error: Type of SmartyCompilerException::$line must be int (as in class Exception) in /var/www/html/xxx/vendor/smarty/smarty/libs/sysplugins/smartycompilerexception.php on line 8

vendor/smarty/smarty/libs/sysplugins/smartycompilerexception.php の23行目
"public $line = null"
"public int $line = 0;" へ変更することで対処した。

strftimeの警告は、smartyバージョンアップにより解消されたと思ったが解消されていなかった。
vendor/smarty/smarty/libs/sysplugins/smarty_internal_runtime_codeframe.php 48行目の "strftime" を "date" へ変更することで対処した。

require_once("smartybc.class.php"); のところで "Failed to open stream" のエラーとなった。
不要のようなので上記行を削除した。


PHP, Smarty

PHP:MySQLi データベース接続

PHPのMySQLiを使ってデータベースに接続するには?


MySQLi データベース接続

MySQLiには「手続き型」と「オブジェクト型」の2通りの使い方がある。
オブジェクト型の方がいい気がするので(なんとなく)
オブジェクト型の使い方に絞って調べることにする。

mysqiクラスのコンストラクタ、またはconnectメソッドを使い接続する。
https://www.php.net/manual/ja/mysqli.construct.php

■ コンストラクタ
public mysqli::__construct(
  string $hostname = ini_get("mysqli.default_host"),
  string $username = ini_get("mysqli.default_user"),
  string $password = ini_get("mysqli.default_pw"),
  string $database = "",
  int $port = ini_get("mysqli.default_port"),
  string $socket = ini_get("mysqli.default_socket")
)
  

■ connectメソッド
public mysqli::connect(
  string $hostname = ini_get("mysqli.default_host"),
  string $username = ini_get("mysqli.default_user"),
  string $password = ini_get("mysqli.default_pw"),
  string $database = "",
  int $port = ini_get("mysqli.default_port"),
  string $socket = ini_get("mysqli.default_socket")
): void
  
すべての引数には既定値があり省略可能なので、必要なパラメータだけ指定すれば良い。


PHP

PHP:階層化された連想配列の途中に値を追加するには

階層化された連想配列の途中に値を追加したいのだが・・・


連想配列への値の追加

例えば以下のような連想配列があって
$arr = array("KEY0" => array("KEY00" => "VALUE00"));
  
"KEY00"と同じ階層に"KEY01"を追加したい場合…

以下のやり方ではダメ
※ arr1には追加されるが、元々のarrには反映しない
$arr = array("KEY0" => array("KEY00" => "VALUE00"));

$arr1 = $arr["KEY0"];

$arr1 = array_merge($arr1, array("KEY01" => "VALUE01"));
  

ということで素直にarr配列に対してmergeするが正解のようだ
$arr = array("KEY0" => array("KEY00" => "VALUE00"));

$arr1 = $arr["KEY0"];

$arr = array_merge($arr["KEY0"], array("KEY01" => "VALUE01"));
  

array_mergeは内部的に毎回配列のコピーを作るのかな?
だとするとデカい配列では効率悪すぎるかも


PHP

PHP:配列に要素を追加するには?

a
PHPメモ:配列に要素を追加するには?


array_push

https://www.php.net/manual/ja/function.array-push.php

array_push(array &$array, mixed ...$values): int

array に追加先の配列、$valuesに追加する値などを指定、
処理後の配列の中の要素数を返す。


PHP

PHP:配列に指定したキーが存在しているか?

PHPメモ:配列に指定したキーが存在するかを調べるには?


array_key_exists

https://www.php.net/manual/ja/function.array-key-exists.php

array_key_exists(string|int $key, array $array): bool

key に調べる値(キー値)、array に配列を指定すると、存在すれば true、存在しなければ false を返す。


PHP

Docker:PHP環境を作る 3

前回作成したPHPのDocker環境から別コンテナのMySQLへアクセスできるようにする



環境

Windows 10 21H2 (19044.1348)
Docker Desktop
データベースは Docker上のMySQLを使用
MySQLコンテナの作成手順は以下記事を参照
Docker:MySQLを動かす

手順

1. MySQLコンテナにmysqliをインストール
PHPコンテナに接続しmysqliをインストールし再起動する
docker exec -it php bash
docker-php-ext-install mysqli
exit
docker restart php
    

PHP.iniのextension=mysqliを有効化する必要は無い?


Docker, PHP, MySQL

Docker:PHP環境を作る 2

前回作成したPHPのDocker環境をVSCodeからデバッグできるように設定する

Docker:PHP環境を作る 1


環境

Windows 10 21H2 (19044.1348)
Docker Desktop
PHP 8.1.0 (php:8.1-apache)

手順

1. コンテナ接続しPHP Debugをインストールする
docker exec -it php bash
pecl install xdebug && docker-php-ext-enable xdebug
    

2. コンテナXDebug設定
D:\userdata\php\conf.d\docker-php-ext-xdebug.ini を編集
以下記述を末尾に追記
[xdebug]
xdebug.mode=debug
xdebug.client_host=host.docker.internal
xdebug.client_port=9003
xdebug.log=/tmp/xdebug.log
xdebug.start_with_request=yes
    

3. VSCode設定
D:\userdata\apacheフォルダでVSCodeを起動
・PHP Debug (Felix Becker) 拡張機能をインストール
・VSCodeの"実行とデバッグ"ボタン(CTRL+SHIFT+D)より"launch.jsonファイルを作成します"リンクをクリック
・環境の選択ポップアップが開くので"PHP"を選択
・上記で作成されたlaunch.jsonファイルの"configurations"に"pathMappings"の設定を追加
 :
"version": "0.2.0",
"configurations": [
    {
        "name": "Listen for Xdebug",
        "type": "php",
        "request": "launch",
        "port": 9003,
        "pathMappings": {
            "/var/www/html": "D:\\userdata\\apache"
        }
    },
    {
        "name": "Launch currently open script",
         :
    

4. 動作確認
VSCOdeでD:\userdata\apache\phpinfo.phpを開き、デバッグ実行、1行目にブレークポイントを置く
ブラウザで http://localhost:8080/phpinfo.phpを開き、ブレークポイントで停止することを確認


Docker, PHP, VSCode, XDebug

Docker:PHP環境を作る 1

DockerでPHP+Apache環境を作る


はじめに

(2024.10.24) WSL+Ubuntu上のDockerにPHP環境を構築する手順は、以下記事を参照。
WSL #32:Docker上にPHP環境を作る

環境

Windows 10 21H2 (19044.1348)
Docker Desktop

手順

1. 準備
ホストにApacheとPHP.iniのフォルダを作成しておく
・D:\userdata\apache
・D:\userdata\php

2. Dockerイメージ取得
PHPバージョンは8.1とした
docker pull php:8.1-apache

3. とりあえず実行
docker run --name php -d php:8.1-apache

4. コンテナに接続しPHP.iniをホストへコピー
PHP.iniは /usr/local/etc/php/ に入っている。これをD:\userdata\php\ へコピー
docker cp php:/usr/local/etc/php/ d:\userdata\

5. コンテナを停止・削除し、パラメータを付加してコンテナを起動
docker stop php
docker rm php
docker run --name php -d -p 8080:80 -v d:/userdata/php:/usr/local/etc/php -v d:/userdata/apache:/var/www/html --network docker_nw php:8.1-apache
    
パラメータ:
--name … コンテナ名をphpとする
-d … バックグラウンドで実行
-p … Apacheのポート80をホストの8080へマッピング
-v …
コンテナのPHP設定フォルダ/usr/local/etc/php/をホストのd:\userdata\php\ へマッピング
コンテナのHTMLフォルダ/var/www/html/をホストのd:\userdata\apache\ へマッピング
-network …
過去記事:Docker:MySQLを動かす で作ったMySQLコンテナと通信したいので、この時作成したDockerネットワーク "docker_nw" を指定

6. 動作確認
D:\userdata\apache\phpinfo.phpを新規作成
中身に ">?php phpinfo()" を記述
ブラウザで localhost:8080/phpinfo.php を開いてみる

phpinfoの画面が表示されれば成功

7. PHP.iniの編集
PHP.iniを作成し、とりあえずTimezoneがUTCとなっているので"Asia/Tokyo"に変更し、反映されることを確認
D:\userdata\php\php.ini-developmentをPHP.iniとしてコピーし編集
date.timezone の設定を検索、設定はコメントアウトされているのでコメントを除去し設定に"Asia/Tokyo"と指定する。
[Date]
; Defines the default timezone used by the date functions
; https://php.net/date.timezone
date.timezone = "Asia/Tokyo"
    
コンテナを再起動
docker restart php
ブラウザでphpinfo.phpを表示しtimezoneが"Asia/Tokyo"となったことを確認する。


Docker, PHP

Laravel:サーバー起動エラー

"php artisan serve" でエラーとなった。


エラー内容

C:\projects\ressys>php artisan serve
PHP Warning:  require(C:\projects\ressys/vendor/autoload.php): Failed to open stream: No such file or directory in C:\projects\ressys\artisan on line 18

Warning: require(C:\projects\ressys/vendor/autoload.php): Failed to open stream: No such file or 
directory in C:\projects\ressys\artisan on line 18
PHP Fatal error:  Uncaught Error: Failed opening required 'C:\projects\ressys/vendor/autoload.php' (include_path='.;C:\php\pear') in C:\projects\ressys\artisan:18
Stack trace:
#0 {main}
  thrown in C:\projects\ressys\artisan on line 18

Fatal error: Uncaught Error: Failed opening required 'C:\projects\ressys/vendor/autoload.php' (include_path='.;C:\php\pear') in C:\projects\ressys\artisan:18
Stack trace:
#0 {main}
  thrown in C:\projects\ressys\artisan on line 18    
  

対応 1

"composer update" を実行すれば治る、ということでやってみたが…
C:\projects\ressys>composer update
Loading composer repositories with package information
Updating dependencies
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - laravel/framework[v8.65.0, ..., 8.x-dev] require league/flysystem ^1.1 -> satisfiable by league/flysystem[1.1.0, ..., 1.x-dev].
    - league/flysystem[1.1.0, ..., 1.x-dev] require ext-fileinfo * -> it is missing from your system. Install or enable PHP's fileinfo extension.
    - Root composer.json requires laravel/framework ^8.65 -> satisfiable by laravel/framework[v8.65.0, ..., 8.x-dev].

To enable extensions, verify that they are enabled in your .ini files:
    - C:\php\php.ini
You can also run `php --ini` inside terminal to see which files are used by PHP in CLI mode.     
  

対応 2

php.iniのextensionの追加で治る?
以下行をextensionのあたりに適当に追加
extension=php_fileinfo.dll    
  
再度 "composer update" を実行 → 成功
"php artisan serve" を実行 → 成功
ブラウザで http://localhost:8000 を表示 → ブラウザでエラーが表示された
Illuminate\Encryption\MissingAppKeyException
No application encryption key has been specified.    
  

対応 3

プロジェクトフォルダで "php artisan key:generate" コマンドを実行
C:\projects\ressys>php artisan key:generate
Application key set successfully. 
  
http://localhost:8000 をブラウザで表示 → 成功


PHP, Laravel

書籍:プロになるためのPHPプログラミング入門



プロになるためのPHPプログラミング入門

タイトルプロになるためのPHPプログラミング入門
Web開発の基礎からフレームワーク活用まで
伸び悩まずに成長するための基礎を学んでみませんか
著者星野香保子/著
出版者東京 技術評論社
出版年2012.2
形態事項342p 23cm
ISBN978-4-7741-4972-1
価格(本体価格 \2680)
NDC10(NDC9)007.645 (547.4833)
予約日2021.11.13(土)


書籍, PHP

Laravel #12:Log出力

Laravelでデバッグ用のログファイルを出力するには?


手っ取り早くデバッグログ出力するには
use Illuminate\Support\Facades\Log;
を追加し、実際にログを出力するには
Log::debug('デバッグメッセージ');
を書けばよい。

ログは storage\logs\laravel.log に出力される。


PHP, Laravel

Laravel #11:認証機能を作る (Jetstream)

Laravel Jetstream というのを使って認証機能を作る


Laravel Jetstream インストール

Laravelのプロジェクトを作ったら、以下コマンドで認証機能をインストール
composer require laravel/jetstream
php artisan jetstream:install inertia
npm install
npm run dev
php artisan migrate

動作確認

XAMPP経由だと表示できなかった (http://localhost/auth2/public/)
なので "php artisan serve" コマンドでサーバーを起動し http://localhost:8000/ でアクセスする。


Laravel, 認証機能

Laravel #10:認証機能を作る

Laravel Breeze というのを使って認証機能を作る

Laravelプロジェクト作成

今回は C:\xampp\htdocs 配下に "auth" の名前でプロジェクトを作成する
composer create-project --prefer-dist laravel/laravel auth

データベース作成

http://localhost より phpMyAdmin を起動
ユーザーアカウントを作成する
・ユーザー名: auth
・ホスト名: localhost
・パスワードを生成するでパスワードを生成 (パスワードはメモしておくこと)
・同名のデータベースを作成しすべての権限を与える にチェックを付ける

Laravel設定

プロジェクトフォルダの .env ファイルを開き、データベースの設定を行う
・DB_DATABASE=auth
・DB_USERNAME=auth
・DB_PASSWORD=データベース生成時のパスワード

マイグレーション

プロジェクトフォルダに移動し以下コマンドを実行することで必要なテーブルが作成される
php artisan migrate

Laravel Breezeインストール

Laravelの認証機能 Laravel Breeze のインストールとコンパイルを行う
composer require laravel/breeze --dev
php artisan breeze:install
npm install
npm run dev

動作確認

http://localhost/auth/public を開く
いつものLaravelのページが開くが、よく見ると右上に "Log In" と "Register" のリンクが増えている。
このリンクからユーザー登録・ログインを行うことができる。


Laravel Breezee, 認証機能

その他の記事