PHP関連のことを調べてみた2023年02月07日

PHP関連のことを調べてみた2023年02月07日

ワイが出会ったエラーについて①(PHP)

Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in

どんな時に出る?

→ 引数の数が合いませんえ、
と、上記のエラーは申しているようです。
後述しますが、最初に:deflag だけしか宣言してないのに
後からarrayで出てくる:idとはなんぞや。
とこのケースでは言われてるわけです。

ワイが実際にこのエラーに直面した際の具体例を書いていく。

どんな時に出た?

→ TODOリストを作っている最中。
htmlで作ったチェックボックスにチェックを入れると、
そのtodoの内容を消す、ということがしたかった。
正確には、DELETE文で消すわけではなくて、チェックボックスにチェックが入ると
UPDATE文が走ってデリートフラグが立つようにしたかった。

そこで書いたのがこのようなコード。(抜粋)
もしコードがポンコツだったらごめんなさい。

$sql

元記事を表示

いつの間にかDBが破損して動かない

### いつの間にかmysqlのデータが破損して動かなかった
めちゃ萎えました
Localhostを開くと
“`
General error: 1812 Tablespace is missing for table
“`
的なエラーで表示されない!!

とりあえず開きたいDBが破損していたので
破損しているものをDrop(GUIでドロップしたのでコマンドはわかりません。)

そして
“`
php artisan migrate
“`
すると、さらなるエラーが
“`
Base table or view already exists:
“`
既にテーブルありまっせ的なエラー
いやないやんけと思いながらググると
“`
php artisan migrate:refresh
“`
で解消と書かれているのでやってみるとまたエラー
そこでこの記事に出会いました
https://qiita.com/nozomi_nozomi/items/e355d8067d32603318b9
tinkerを使ってDBのテーブルを検索、削除しています、、、

でやり直したいテーブルまでロールバッ

元記事を表示

MysqlのデータをHTML, PHPで表示する(3. Mysqlのデータ書き換え)

お疲れ様です。
真冬でもクーラーガンガンのJuesa09です。

さって今回は、前回第2回から新たに以下機能を追加してみました。

1. 表の状況欄に在庫状況(Y:在庫あり, M:在庫なし)を反映。
2. ”データベースに登録”ボタンを押すと在庫状況Y(在庫あり)でデータベースに登録し、下表にも反映。
3. 下表中の”売れた日”欄に売上日を記入して最右の”売上記録”ボタンを押すと、データベース内の在庫状況をMへ書き換え。また、”売れた日”欄のテキストアエリアと”売上記録”ボタンをクローズする。(下画像中ID8のよう)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120035/3397ab35-1532-e1cf-0660-b5e4b5a8061e.png)
コードは以下になります。(データベースのカラムの設定は第2回を見て頂けますと幸いです。)

“`



元記事を表示

【環境構築】Docker + Apache + PHP7.3 + MySQL + phpMyAdmin + GDライブラリ

Dockerでの環境構築のメモ。

# ディレクトリ構造
“`
sample
├── htdocs
| └── index.php
├── php
| ├──php.ini
| └── Dockerfile
└── docker-compose.yml
“`

# docker-compose.yml

“`yml:docker-compose.yml
version: ‘3.7’

services:
mysql:
image: mysql:5.7
volumes:
– db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: ‘password’

phpmyadmin:
depends_on:
– mysql
image: phpmyadmin/phpmyadmin
environment:
PMA_HOST: mysql
r

元記事を表示

【PHP8.3】 クラス定数とENUMを文字列から探せるようになる

PHPの[ENUM](https://www.php.net/manual/ja/language.enumerations.php)にはひとつ重大な欠点がありまして、キーを文字列指定することができません。

どういうこと?

“`php
enum Suit:string{
case Hearts = ‘ハート’;
case Diamonds = ‘ダイヤ’;
case Clubs = ‘クラブ’;
case Spades = ‘スペード’;
}

echo Suit::Hearts->value; // ハート

$str = ‘Diamond’; // このキーから値を取りたい
echo Suit::{$str}->value; // syntax error
“`

この制限のせいで、たとえばHTTPリクエストで送られてきた値からENUMを取り出すといったことができませんでした。

それっぽいメソッド[BackedEnum::from()](https://www.php.net/manual/ja/backedenum.from.php)はあ

元記事を表示

[ポートフォリオ技術選定] Laravel Docker Laravel forge

## はじめに
ポートフォリオとして、タスク管理ができる。Todoアプリをつくりました。
以下の技術を選定したので以下で説明していきたいと思います。
技術選定を中心に書いていこうと思います。

## 機能

  • CRUD機能
  • カテゴリーごとにタスクを見ることができる機能
  • LINEのアカウントでログインできる
  • LINEに作ったタスクをチャットボットとして投げることができる。

## 使用技術
フロントエンド:HTML5 CSS TailwindCSS-Daisyui
バックエンド:PHP 8.1.2 Laravel9 Breeze
インフラ:Docker nginx MySQL8.0 / phpMyAdmin ConoHaVPS
デプロイ:Laravel forge

## 技術選定理由
### フロントエンド
フロントエンドは、TailwindCSSを採用しました。
TailwindcssはCSSのフレームワークです。

なぜこれなのか、理由は以下です。

    元記事を表示

    Laravelのログローテートで指定するdaysは日数ではなくファイル数である

    PHPのWebアプリケーションフレームワークであるLaravelは、ログファイルを日別で分けて出力する仕組みが用意されており、一緒にログローテートも設定できます。
    それを用いて、週1回実行するバッチ処理のログを2週間保持する設定をしたのですが、想定していた挙動と異なる動きだったため調査を行いました。

    ## 想定していた挙動と実際の挙動

    想定では常に2週間分の2ファイルのみ保持されていて、その他のファイルは削除される想定でした。
    しかし、実際にはファイルはたまり続け、動作確認をしてみたところ14回分のファイルが保持されるようです。
    具体的には下記のような状態です。

    ### 想定していた挙動

    **2022年1月1日・1月8日に実行したあとの状態**

    “`bash
    $ ls
    laravel-2022-01-01.log laravel-2022-01-08.log
    “`

    **2022年1月15日に実行したあとの状態**

    “`bash
    $ ls
    laravel-2022-01-08.log laravel-2022-01-15.log
    “`

    ### 実際の挙動

    **2

    元記事を表示

    【php】メモリ不足時にphp.iniのmemory_limitを変更する前に変数の解放を試したい

    # 概要
    phpで負荷の高いプログラムを書いてるときに
    Allowed memory size of ~~ みたいなメモリ不足エラーがでることがままあるが、

    普段このエラーが発生したときは脳みそ停止して、
    「php.iniのmemory_limit調整しなきゃ・・・」みたいに思ってたんだけど、
    そもそもプログラム側にメモリの無駄があるんじゃないかと思い色々調べた話です。

    ## 不要になった変数の解放
    普段あまり意識してなかったけど、
    当然と言えば当然だが、プログラム上で変数に値を持たせれば
    その容量に応じてメモリを使ってることになる。

    PHPにはガベージコレクションという仕組みがあって、
    関数とかのまとまった処理を抜けると、そこで使っていた変数は勝手に開放されるらしい
    (この辺はまだちゃんと調べてないが・・・)

    言い換えれば、関数とかを抜けなかったらメモリは勝手に開放されないわけで・・・

    例えば、
    DBからデータを抽出→インポート用にデータを変換→他DBにデータをインポート
    みたいな処理を考える
    “`
    # データの抽出
    $export_data = $this->dataE

    元記事を表示

    PHP で 映画 CRUDアプリを作った

    1ヶ月半ほど PHP・MySQL の基礎学習してきました。その成果の一つとして表題のアプリを作りました。検索時の参照データベースに「TMDb」の API を使用しました。自分が映画が好きな点と、説明的なデザインが少ない本国のポスターは見ていてテンションが上がるので「見てよし、使ってよし」なアプリを目指しました。

    ## アプリ概要
    ### 検索/表示機能
    映画のタイトルを入力すると、検索ワードに共通する映画ポスターとタイトル(日・英)を表示。
    ![スクリーンショット 2023-02-05 23.02![スクリーンショット 2023-02-05 23.23.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47376/5808e73d-467e-e42c-8378-1f4dac938a2b.png)
    .30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47376/969230b4-7b5b-9339-10d3-146f

    元記事を表示

    マストドンAPIでトゥートするPHPコード

    ### マストドンAPIでトゥートするPHPコードです。
    本当はcurl_initを使用してコードを書きたかったのですが、
    上手く動作しなかったので、この手法に変更しました。

    “`
    php Mastodon.php ‘テスト投稿です’
    “`

    “`php:Mastodon.php

    元記事を表示

    人は変わる、ソースは残る

    チーム開発の話です。
    フリーランスでいくつかの案件を経験して思うことは、仕事がしやすいチームと仕事がしにくいチームがあることです。

    チーム開発の基本かもしれないですが、ある一つのことを理解してチーム開発をしている企業としていない企業があります。
    **そのある一つのこととは、「人は変わるが、ソースは残り続ける」という事実です。**

    正社員以外の働き方がメジャーになった現代では、チームの人の入れ替わりが激しいです。
    半年前までバリバリ開発していた人が、今はもういない。
    そういう場面をよく見かけます。
    その代わり、もっとできる人が入ってきたりする場面もありますが。

    つまり、**どの現場でも「人が変わる」ことを念頭に置いておく必要があります。**
    システム開発以外の仕事でも同じかもしれませんね。

    ## 誰が入っても同じようになるツールを導入する

    **「ソースを書く」**
    多くのエンジニアは、ソースを書きます。しかし、人によってムラができてしまうと困ります。
    どの人が書いても、ある一定はソースが担保されるツールを入れるべきです。

    例えば、PHPであるならPSR(PHPのコーディング規

    元記事を表示

    Can’t log into phpMyAdmin: mysqli_real_connect(): (HY000/1698): Access denied for user ‘root’@’localhost’を解決する

    # 初めに

    久々の投稿になります。
    簡単な備忘録となります。
    ローカルのlaravelプロジェクトでphpmyadminを導入する際に題名のエラーメッセージが出てしまいました。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606803/86ef4a14-5e34-4b78-bc8a-9783efd6154a.png)

    以下解決法

    # 解決手順

    “`
    sudo mysql -p -u root
    “`

    ①mysqlに入ります

    “`
    CREATE USER ‘ユーザー名’@’localhost’ IDENTIFIED BY ‘パスワード’;
    “`

    ①ユーザー名とパスワードを作成します。
    “`
    GRANT ALL PRIVILEGES ON *.* TO ‘ユーザー名’@’localhost’ WITH GRANT OPTION;
    “`

    ③ここで、新しいユーザーにスーパーユーザー権限を付与します

    以上を行ったうえでphpmyadminから入りなおすと入れました。

    元記事を表示

    【PHP】S3 ファイル(オブジェクト)の有無をチェックする方法

    # 概要
    S3に保存したファイルの有無をチェックする方法がないかと思い調べたら、良い方法があったので、備忘録も含めてその方法を説明します。

    # 設定方法
    1. 最初に、AWS SDKをインストールします。インストール方法は、開発している環境によって異なる為、下記の公式ドキュメントを確認して行って下さい。
    [インストール:AWS SDK for PHPバージョン 3](https://docs.aws.amazon.com/ja_jp/sdk-for-php/v3/developer-guide/getting-started_installation.html)

    2. SDKとAWSを繋ぐ方法については、下記を参照して行って下さい
    [AWS SDK for PHPバージョン 3 の基本的な使用パターン](https://docs.aws.amazon.com/ja_jp/sdk-for-php/v3/developer-guide/getting-started_basic-usage.html)

    3. 公式内に`doesObjectExist`のメソッドがある為、そのメソッドを

    元記事を表示

    Composerの世界情勢ネタ #StandWithUkraine

    “`
    composer update
    “`
    をしてみると、、、
    ![スクリーンショット 2023-02-04 213851.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3005822/392a2d0a-90e3-7173-3272-7a0f999b5ecb.png)
    **#StandWithUkraine**
    とウクライナカラーで表示されるようになっています。

    :::note info
    国旗の青は空、黄色は小麦と農業を表しているみたいです
    :::
    こちらのコミットに載ってます。

    https://github.com/composer/packagist/commit/86244a3695fcaaac9c5ba4257a4314eae1c6d981#

    ただ、コメントを見てみると、
    * **#StandWithPeace**を使用して欲しい
    * ウクライナを応援してくれてありがとう
    * テク

    PHP で テキストのハッシュタグへリンクを貼る

     PHPで、テキスト文字列内のハッシュタグ(#から始まる単語)をリンクに変換する関数をChatgpt に聞きながら、作成してみました。その時のメモです。

    Q.
    “`
    php で テキストのハッシュタグに検索リンクを貼るロジックを教えて
    “`
    A.
    “`php
    #$1“;
    return preg_replace($hashtag_regex, $replace, $text);
    }

    $text = “こんにちは #PHP でハッシュタグをリンクに変換しましょう。”;
    $linked_text = add_hashtag_links($text);
    echo $linked_text;

    “`

    下記のサイトで確認したところ、全角スペースに対応していななたったので、
    https://ja.functions-online.com

    Why is CodeIgniter More Productive than Other PHP Frameworks?

    ![CodeIgniter for Web Development.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199949/e0a1abd0-e595-8b4f-7135-e2fa9053d434.png)

    PHP frameworks are widely used for their functionality and productivity. Most PHP-based frameworks make development fun as they reduce the long lines of code, courtesy of their in-built features. CodeIgniter is one such framework that has gained a lot of attention in recent times.

    But what’s truly amazing is that it has managed to beat quite the re

    laravelで個別にログファイルを出力する

    まずは、ログ出力の設定から。
    ログの出力設定はconfig/logging.phpで設定する

    “`config/logging.php
    ‘hoge’ => [
    ‘driver’ => ‘daily’,
    ‘path’ => storage_path(‘logs/hoge/hoge_log.log’),
    ‘level’ => ‘info’,
    ‘days’ => 3, //保存期間
    ‘permission’ => 0664,
    ],
    “`
    あとは、出力したいControllerとかに
    以下のログ出力用のコマンドを渡してあげればよい

    “`HogeController.php
    Log::channel(‘hoge’)->info(‘なんかのログ’, ここは配列);
    “`

    テストしたいだけだったら以下を入れてみる。
    “`HogeController.php
    Log::channel(‘hoge’)->info(‘test’);
    “`

    ApplicationGatewayとLaravelの合わせ技で通信が困った話

    # 問題になったこと
    AzureのApplicationGatewayを前段に置いて、後ろにLaravelのWebサーバーがある構成で、
    何故かLaravelから生成されるURLが非SSLになって色々と困ったので備忘録

    ## 結論
    ### 原因
    Laravelは特に指定がなければ、サーバー変数$_SERVERの値を使ってURLを生成する。
    ApplicationGatewayより後ろを非暗号化httpで通信していたため、Laravel側はhttpのURLを生成していた模様。

    ### 解決方法
    二種類ある
    #### 1. Apache側でサーバー変数を書き換える
    ApacheのVirtaulhostに下記の設定を追加
    “`
    SetEnv HTTPS on
    “`
    これで$_SERVER[“HTTPS”]が強制的にONになるので、
    Laravel側でもhttpsのURLが生成されるようになる

    #### 2. Laravel側でURL生成に使う値を強制的に変更する
    下記の処理をAppServiceProvider.phpに加えることで強制的にURL生成に使い値を変更することが可能

    Laravel コマンド一覧

    # よく使うコマンド一覧
    よく使うコマンドを一覧にまとめています。

    | 項番 | 項目 | コマンド |
    |:—-:|:————-|:————-|
    | 1 | [バージョン確認](#バージョン確認) | php artisan –version |
    | 2 | [ヘルプ](#ヘルプ) | php artisan help <コマンド> |
    | 3 | [起動](#起動) | php artisan serve |
    | 4 | [コントローラー作成](#コントローラー作成) | php artisan make:controller <コントローラー名> |
    | 5 | [テーブル作成](#テーブル作成) | php artisan make:migration <クラス名> |
    | 6 | [マイグレーション実行](#マイグレーション実行) | php artisan migrate |
    | 7 | [シーダー作成](#シーダー作成) | php artisan make:seeder <シーダー名> |
    | 8 | [シーダー実行](#シーダー

    PHPのforeach文で一部だけ2次元の連想配列からキーだけを取り出す方法

    # はじめに
    備忘録
    タイトルの通りです。
    どなたかのお役に立てれば幸いです。

    ※追記
    コメント欄にて、すっきりと書けるコードや、コードの補足情報を教えていただけました。
    ぜひコメント欄の方も参照してください。
    コメントしてくださったお三方、ありがとうございました!

    # foreach文で一部だけ2次元の連想配列からキーを取り出す
    例えば、以下のような2次元の連想配列があったとします。
    “`php
    $array = [
    “aaa” => true,
    “bbb” => “foo”,
    “ccc” => [
    “ddd” => “this”,
    “eee” => “is”,
    “fff” => “sample”,
    “ggg” => “array”
    ]
    ];
    “`
    この場合は以下のように書くことで全ての次元からキーだけを取り出すことができます。
    “`php
    $key_array = [];
    foreach ($array as $key1 => $value1) {
    array_pus