20210301のPHPに関する記事は9件です。

inputタグのボタンがレスポンシブ実装時に自動でデザイン変更されてしまう現象を防ぐ

はじめに

HTMLなどでフォームを作る際にスマートフォンのフォームデザインが勝手に変わっていることがある。

筆者の場合、HTML, PHPを用いてフォームを作成した時、PCでは自分で考えたデザインが反映されたのに対して、スマートフォンで実機確認するとボタンのデザインが変わっていた。

解決方法

レスポンシブで自動でデザインが反映されたタグやクラスに対して、
-webkit-appearance: none;
border-radius: 0;
二つのプロパティを付ける。

(例)ブラウザによってボタンに自動で付けられた装飾を消去する

<input type="submit" type="cofirm" value="送信" class="c-btn">

該当するクラスがあるcssファイルにプロパティを適用する。

.c-btn {
 -webkit-appearance: none;
 border-radius: 0;
}

これで、レスポンシブ実装の時に自動でデザインが変わる現象を防げる。

P.S.

今回はこのプロパティを適用すれば防止できるよ〜という記事。
ブラウザが勝手にプロパティを付与する理由には調べている途中なので記載していません。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

初学者がPHPを学び始める3

関数について

関数とは、あるまとまった処理を行い、値を返すものです。 PHPには便利な関数がもとから組み込まれていて、それらは組み込み関数と呼ばれます。
「strlen」は組み込み関数の1つで、文字列の文字数を返します。
配列の要素数を数える「count」、ランダムな整数を返す「rand」などが他にもあります。
ここで、()の中に与える値を「引数」といいます。

以下の場合は上から


10〜15のランダムな数字が出力されます。

  <?php

    $str = 'こんにちは';

    echo strlen($str);

    $array = array('HTML', 'CSS', 'PHP');

    echo count($array);

    echo rand(10,15);

  ?>

関数の作り方

関数を作るには「function 関数名(){ 処理 }」という書き方をします。
関数名は自由につけることが出来ます。
関数は「関数名()」というように()をつけて呼び出すことができます。

以下の記述の場合は
Hello, world!!を出力します。

  <?php
    function hello(){
      echo "Hello, world!!";
    }

    hello();
  ?>

また関数を呼び出す際、関数に値を渡すと、関数内でその値を利用することができます。この値を「引数」と呼びます。引数を関数内で使うには、それを受け取るための「仮引数」を、関数の定義時に指定しておく必要があります。仮引数が複数ある場合はカンマ(,)を用いて指定します。

例えば四角形の面積を出したいときは下記のようになります。
この場合だと50が出力されます。

  <?php
    function squareArea($height,$width){
      echo $height*$width;
    }

    squareArea(5,10);
  ?>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

composer self-update のエラー

php artisan make:authが使えなくなって久しいです。
代わりとなるcomposer require laravel/uiを入力すると、次のようなエラーが出ました。

Warning from https://repo.packagist.org: You are using an outdated version of Composer. Composer 2 is now available and you should upgrade. See https://getcomposer.org/2

要はcomposerをver2にアップデートしてくださいということです。
composer self-update --2と打ったところ、またエラーが出ました。

[Composer\Downloader\FilesystemException]                                                                                    
  Filesystem exception:                                                                                                        
  Composer update failed: "C:\ProgramData\ComposerSetup\bin\composer.phar" could not be written.                               
  rename(C:\ProgramData\ComposerSetup\bin/composer-temp.phar,C:\ProgramData\ComposerSetup\bin\composer.phar): ANZX  
  ܂B (code: 5)

リネームしろと言われていますが、その部分は無視してもできました。
今回注目したのは "C:\ProgramData\ComposerSetup\bin\composer.phar" could not be written. の部分です。
書き込みができませんでしたということなので、書き込みができるようにします。

プロパティのアクセスを変更

ローカルの C:\ProgramData\ComposerSetup\bin\composer.phar にアクセスし、右クリックします。
プロパティを選択すると、「セキュリティ」というタブが出てきます。
そのタブの下部にある「詳細設定」をクリックしてください。
詳細設定を押すと、プリンシパルごとにアクセス許可が表示されます。
そのほとんどのアクセス権限がフルコントロールだったのですが、ひとつ違うものになっている箇所があったので編集してフルコントロールにします。

OK、OKでプロパティを閉じたらPowerShellに戻って

composer self-update --2

できました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

composer update のエラー

php artisan make:authが使えなくなって久しいです。
代わりとなるcomposer require laravel/uiを入力すると、次のようなエラーが出ました。

Warning from https://repo.packagist.org: You are using an outdated version of Composer. Composer 2 is now available and you should upgrade. See https://getcomposer.org/2

要はcomposerをver2にアップデートしてくださいということです。
composer self-update --2と打ったところ、またエラーが出ました。

[Composer\Downloader\FilesystemException]                                                                                    
  Filesystem exception:                                                                                                        
  Composer update failed: "C:\ProgramData\ComposerSetup\bin\composer.phar" could not be written.                               
  rename(C:\ProgramData\ComposerSetup\bin/composer-temp.phar,C:\ProgramData\ComposerSetup\bin\composer.phar): ANZX  
  ܂B (code: 5)

リネームしろと言われていますが、その部分は無視してもできました。
今回注目したのは "C:\ProgramData\ComposerSetup\bin\composer.phar" could not be written. の部分です。
書き込みができませんでしたということなので、書き込みができるようにします。

プロパティのアクセスを変更

ローカルの C:\ProgramData\ComposerSetup\bin\composer.phar にアクセスし、右クリックします。
プロパティを選択すると、「セキュリティ」というタブが出てきます。
そのタブの下部にある「詳細設定」をクリックしてください。
詳細設定を押すと、プリンシパルごとにアクセス許可が表示されます。
そのほとんどのアクセス権限がフルコントロールだったのですが、ひとつ違うものになっている箇所があったので編集してフルコントロールにします。

OK、OKでプロパティを閉じたらPowerShellに戻って

composer self-update --2

できました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelのmigration classでchangeメソッドが使用できない

現象

ある既存のカラムでNULL値を許可orDEFAULT値を設定するようにしたく、
migrationを実行したところ以下のエラーに遭遇。

RuntimeException:Changing columns for table "テーブル名" requires Doctrine DBAL.
Please install the doctrine/dbal package.

対処法

素直にdoctrine/dbal packageをcomposerでinstallする。

composer require doctrine/dbal
Using version ^3.0 for doctrine/dbal
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 4 installs, 0 updates, 0 removals
  - Installing composer/package-versions-deprecated (1.11.99.1): Downloading (100%)         
  - Installing doctrine/event-manager (1.1.1): Downloading (100%)         
  - Installing doctrine/cache (1.10.2): Downloading (100%)         
  - Installing doctrine/dbal (3.0.0): Downloading (100%) 
  ...

よし、これでOK。
再度migrationを実行してみます。

Migrating : 2021_03_01_001211_modify_employees_table_20210301

Symfony\Component\Debug\Exception\FatalThrowableError  
: Class 'Doctrine\DBAL\Driver\PDOMySql\Driver' not found

Driverがないだと。。。
こういう時こそ落ち着いて、エラー文で示してくれているディレクトリの中を覗くと原因が判明する。
vendor/doctrine/dbal/src/Driver/

こちらのパスにPDOMySqlが存在しなかった。

他にも同様の現象に出くわしている方がいると期待し検索

[laravel] doctrine/dbalを入れたのに「Class 'Doctrine\DBAL\Driver\PDOMySql\Driver' not found」と言われる

こちらの方が仰られている通り、
ver3.x系(先程installしたversion)とver2.x系とではディレクトリ構成が変わっていました。
気を取り直し、バージョンを指定しinstallし直す。

composer require "doctrine/dbal:2.*"
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 0 installs, 1 update, 0 removals
  - Downgrading doctrine/dbal (3.0.0 => 2.12.1): Downloading (100%)  
 ...

最後に以下を実行し無事解決に至る。(多謝)

php artisan migrate:refresh --seed
該当のmigrationファイル
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class ModifyEmployeesTable20210301 extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('employees', function (Blueprint $table) {
            $table->string('first_name')->nullable()->change();
            $table->string('last_name')->nullable()->change();
            $table->tinyInteger('email_verified')->default(0)->after('email_verified_at');
            $table->string('email_verify_token')->nullable()->after('email_verified');
            $table->tinyInteger('status')->default(0)->after('email_verify_token');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('employees', function (Blueprint $table) {
            $table->string('first_name')->nullable(false)->change();
            $table->string('last_name')->nullable(false)->change();
            $table->dropColumn('email_verified');
            $table->dropColumn('email_verify_token');
            $table->dropColumn('status');
        });
    }
}

まだまだ未熟者ですが、
経験を蓄積していく為に記事にして残すことを決意した次第です。
今後とも先輩方、宜しくお願い致します。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHPではてなブログのAPIで自動投稿する方法。

PHPではてなブログのAPIで自動投稿する方法です。

ある書籍を読んでいてはてなブログにAPIがあることを知りましたが
PHPの自動投稿の方法が検索してもあまりがない感じでしたので?作りました。
(はてなのデベロッパーのヘルプを見て作りましたよ?)

index.php
<?php

require "./config.php";

function hatena_blog($title = "タイトルです", $content = "本文です", $category = "category")
{

    $username = USERNAME;
    $api_key = APIKEY;

    $name = NAME;
    $draft = DRAFT;

    $nonce = sha1(time() . rand() . getmypid(), true);
    $date = new DateTime();

    $blognow = $date->format("Y-m-d\TH:i:s");
    $digest =  base64_encode(sha1($nonce . $blognow . "Z" . $api_key, true));
    $credentials =
        sprintf(
            "UsernameToken Username=\"%s\",PasswordDigest=\"%s\",Nonce=\"%s\",Created=\"%s\"",
            $username,
            $digest,
            base64_encode($nonce),
            $blognow . "Z"
        );

    $headers  = array(
        "X-WSSE: $credentials",
        "Accept: application/x.atom+xml, application/xml, text/xml, */*"
    );

    $POST_DATA = "<?xml version=\"1.0\" encoding=\"utf-8\"?>
    <entry xmlns=\"http://www.w3.org/2005/Atom\"
           xmlns:app=\"http://www.w3.org/2007/app\">
      <title>$title</title>
      <author><name>$name</name></author>
      <content type=\"text/plain\">
      $content
      </content>
      <updated>$blognow</updated>
      <category term=\"$category\" />
      <app:control>
        <app:draft>$draft</app:draft>
      </app:control>
    </entry>
    ";

    $curl = curl_init("https://blog.hatena.ne.jp/" . USERNAME . "/" . BLOGID . "/atom/entry");
    curl_setopt($curl, CURLOPT_POST, TRUE);
    curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $POST_DATA);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($curl);
    if ($response === false) {
        echo 'Curl error: ' . curl_error($curl);
    }

    curl_close($curl);

    var_dump($response);
}

hatena_blog("テスト投稿","これは本文です","blog");
config.php
<?php
define("USERNAME","taokatoshiaki");
define("APIKEY","xxxxxxx");
define("BLOGID","example.hatenadiary.com");//example.hatenadiary.com
define("NAME","taoka");//ブログ投稿者名
define("DRAFT","no");//yes=下書き, no=投稿
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[PHP]定数のプロパティだとstaticプロパティになる

class Foo {
     public $a = "aaa";
     public const b = "bbb";
 }

 $foo = new Foo();
 echo $foo->a;
 echo $foo->b;

エラー

PHP Warning:  Undefined property: Foo::$b in /workspace/Main.php on line 10

phpでclassで定数(const)プロパティを使っても、staticプロパティになりnewで定義したインスタンスから呼び出すことができない

修正

class Foo {
     public $a = "aaa";
     public const b = "bbb";
 }

 $foo = new Foo();
 echo $foo->a;
 echo "\n";
 echo Foo::b;

結果

aaa
bbb

補足

インターフェースでは定数プロパティしか定義できず、変数プロパティは定義できない。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

CentOS5.11にPHP7.0.33を入れる

0.はじめに

どうしても社内で、CentOS5.11を使わなければいけないサーバーがありました。

ソース自体は全サーバーでmasterが動いており、
15台のサーバーのうち14台は冗長化され、CentOS6PHP7.0.33で動いていましたが、
1台だけCentOS5.11で、PHP5.6で動いていました。

しかし、先日自身のコミットで、返り値の型指定を記載してしまい、14台のPHP7.0.33では一切問題なく動きましたが、

唯一PHP5.6で動いているサーバーがfetalで止まっている事に障害発生から24時間後に気づいてしまいました。

public function sample() : string
{
    return 'test';
}

その後、いくつか有識者で対策を検討し、
・このサーバー用に独立したブランチを作り、masterをpullしない
・該当サーバーをCentOS6以降で、稼働させる方法を考える
等々考えましたが、

最終的に、
・頑張ってPHP7.0.33CentOS5に載せてみないか?
となり、完全にやり方は自分で調べてみてくれという感じでボールが渡され、

日本語、英語、中国語で必死で調べましたが、いい感じの例がなかったので、

備忘録として大人の事情でCentOS5.11PHP7.0.33を入れなければいけない場合の対処法を残しておきます。

1.入れる

念のため、事前にphp関連のパッケージで何が入っているか、確認しておいた方がいいです。

# インストールされているPHP関連パッケージの確認
[root@bash] $ yum list installed | grep php
# php5.6.30を削除
[root@bash] $ yum remove php php-*

正常に削除されていることを確認したら、yumリポジトリの書き換えをします。
CentOS5はサポート終了を通り越して、リポジトリの提供もされていないので、
URLをミラーに書き換えます。

# リポジトリの変更
[root@bash] $ sed -i "s/mirrorlist/#mirrorlist/" /etc/yum.repos.d/CentOS-Base.repo
[root@bash] $ sed -i "s_#baseurl=http://mirror.centos.org/centos/\$releasever/os/\$basearch/_baseurl=http://vault.centos.org/5.11/os/\$basearch/_" /etc/yum.repos.d/CentOS-Base.repo 
[root@bash] $ sed -i "s_#baseurl=http://mirror.centos.org/centos/\$releasever/updates/\$basearch/_baseurl=http://vault.centos.org/5.11/os/\$basearch/_" /etc/yum.repos.d/CentOS-Base.repo 
[root@bash] $ sed -i "s_#baseurl=http://mirror.centos.org/centos/\$releasever/extras/\$basearch/_baseurl=http://vault.centos.org/5.11/os/\$basearch/_" /etc/yum.repos.d/CentOS-Base.repo 
[root@bash] $ sed -i "s_#baseurl=http://mirror.centos.org/centos/\$releasever/centosplus/\$basearch/_baseurl=http://vault.centos.org/5.11/os/\$basearch/_" /etc/yum.repos.d/CentOS-Base.repo 
[root@bash] $ sed -i "s_#baseurl=http://mirror.centos.org/centos/\$releasever/contrib/\$basearch/_baseurl=http://vault.centos.org/5.11/os/\$basearch/_" /etc/yum.repos.d/CentOS-Base.repo

PHP本体のインストール前に、依存性の高いパッケージのインストールをします。

# パッケージのインストール
[root@bash] $ yum install -y make gcc flex wget patch autoconf libxml2-devel

そして、めちゃくちゃ調べましたが、今のところCentOS5でPHP7を入れられるリポジトリは存在しないっぽいです。

ちょうどこの作業に入る前に、こちらの方が記事をあげており、
それでも尚、海外コミュニティ含めて探しましたが、見つかりませんでした。

そのため、ソースからのインストールを試みます。

# phpをソースからインストール
[root@bash] $ cd /usr/local/src/
[root@bash] $ wget http://museum.php.net/php7/php-7.0.33.tar.gz

PHP7自体の必要動作環境とか調べましたが、特にCentOS自体は条件になかったです。
ただ、PHP7.1以降だとopenssl1.0.1以上が要求されます。

またPHP7.0でもopenssl0.9.8は必要です。
必要があればアップデートしてください。

(今回はopenssl0.9.8が入っていたので、そちらの作業はしていないです)

あとは解凍してmakeコマンドでインストールします。

[root@bash] $ tar zxvf php-7.0.33.tar.gz
[root@bash] $ cd php-7.0.33/
[root@bash] $ rm -f configure
[root@bash] $ ./buildconf --force
[root@bash] $ ./configure --prefix=/usr
[root@bash] $ make && make install

今回、バイナリの環境変数パス指定を省略するために、/usrにインストール先を指定しましたが、

出来ればもっと下層にインストールをして、パス指定してある箇所にシンボリックを貼るか、
インストール先を環境変数に追加した方が安全かもしれないです。

[root@bash] $ php -v

2.まとめ

二度とやりたくないですが、
意外と大人の事情で、このサーバーは絶対CentOS5じゃないとダメなんだ!!
は実際にあったため、今回は貴重な経験をすることになりました。

EPELとかremiとか、php自体リポジトリからインストールする方が99%だと思うので、
ソースからのインストール、更にはCentOS5.11からのPHP7というあまりない事例だったので、

一応可能です。という事を記事に残しておきたかったです。
おやすみなさい。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Herokuのアップロードサイズの上限を変更する方法

Herokuとその他諸々で画像共有サービスを作ろうとしたときに、ファイルをアップロード出来なくて詰まったのでメモ

やること

Herokuはデフォルトだと2MB未満のファイルしかアップロードできないようなので、いろいろやって上限を20MBまで引き上げたい。

.user.iniファイルを作成

設定を反映させたい対象のphpファイルと同じディレクトリ内に.user.iniを作成する。

upload_max_filesizeを記述

.user.iniにupload_max_filesize = 20M
今回の場合はformからアップロードしたかったのでpost_max_size = 20Mとも書き込んでおく。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む