20201121のPHPに関する記事は8件です。

【DB接続後sqlを渡すパターン】

beginTransaction()commit()の使い方をわかっていなかったのでメモ

一つのsql文ですむ場合
prepare()execute()だけでいい

try{
    $db = new PDO('mysql:host=localhost;dbname=users','root','pass');
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERROMODE_EXCEPTION);
}catch(PDOException $e){
    print $e->Message();
}
$sql = 'INSERT INTO users (name) VALUES (?)';
$stmt = $db->prepare($sql);
$stmt->execute("taro");

関連する複数のsqlをinsertなどしたい場合(どれかが欠けるとおかしくなる時)
beginTransaction()を使って、失敗したらrollbackさせる。

try{
    $db = new PDO('mysql:host=localhost;dbname=users','root','pass');
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERROMODE_EXCEPTION);
}catch(PDOException $e){
    print $e->Message();
}

try{
    $db->beginTransaction();
    $sql1 = 'INSERT INTO users (name) VALUES (?)';
    $stmt = $db->prepare($sql1);
    $stmt->execute("taro");

    $sql2 = 'INSERT INTO orders (order_name) VALUES (?)';
    $stmt = $db->prepare($sql2);
    $stmt->execute("rice");

    $sql3 = 'INSERT INTO prices (price) VALUES (?)';
    $stmt = $db->prepare($sql3);
    $stmt->execute(200);

    $dbh->commit();
}catch(Exception $e){
    $db->rollback();
    print $e->Message();
}

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

LaravelのSeeder実行時に「Class 'Database\Seeders\Datetime' not found」エラーが出たときの対処法

背景

LaravelでSeeder実行時に少々詰まったので共有します。

環境

Laravel Framework 8.15.0

現象

Seederファイルを用意した状態でSeederを実行するとエラーが発生する

$ php artisan db:seed
Seeding: Database\Seeders\FutsalsTableSeeder

   Error 

  Class 'Database\Seeders\Datetime' not found

  at database/seeders/FutsalsTableSeeder.php:22
     18▕             [
     19▕             'name' => 'futsal 1',
     20▕             'place' => 'tokyo',
     21▕             'url' => 'xxx',
  ➜  22▕             'created_at' => new Datetime(),
     23▕             'updated_at' => new Datetime()
     24▕         ],
     25▕             [
     26▕             'name' => 'futsal 2',

原因

Datetimeに関して、use宣言をしていないため

解決策

use DateTimeを追記すればOKです。

HobeTablesSeeder.php
<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use DateTime; // ←これを追加

class FutsalsTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
   // 省略
    }
}

参考
https://stackoverflow.com/questions/52074184/laravel-error-class-app-http-controllers-datetime-not-found

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

phpUnitの練習をしたのでメモ

phpUnitの練習をしたのでメモしておく

書いているテストは全てGreen

数値関連

$answer = 1 + 1;
$this->assertIsInt($answer);
$this->assertIsNotFloat($answer);
$this->assertIsNumeric($answer);
$this->assertEquals($answer,2);
$this->assertNotEquals($answer, 100);
$this->assertGreaterThan($answer, 5);
$this->assertGreaterThanOrEqual($answer, 2);
$this->assertLessThan($answer, 1);
$this->assertLessThanOrEqual($answer, 2);

boolean関連

$this->assertIsBool(true);
$this->assertIsBool(false);
$this->assertTrue(true);
$this->assertFalse(false);

Null関連

$this->assertNull(null);
$this->assertNotNull(!null);

配列関連

$users = ['konan', 'sherry', 'ran', 'jin'];
$this->assertIsArray($users);
$this->assertCount(4, $users);
$this->assertNotCount(0, $users);
$this->assertContains('konan', $users);
$this->assertNotContains('kogoro', $users);
$this->assertNotEmpty($users);

$user = ['name' => 'konan', 'age' => 6];
$this->assertArrayHasKey('name', $user);

まとめ

TDD頑張りたい

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

【Laravel6でエラーが出た】BadMethodCallExeption: Method Illuminate¥Routing¥Rout::get does not exist.

【Laravel6でエラーが出た】BadMethodCallExeption: Method Illuminate¥Routing¥Rout::get does not exist.

使用環境

  • windows 10 Home(COREi7)
  • XAMPP 7.3.18
  • Laravel 6

背景

Laravel5.7入門の動画に沿ってLaravel6の学習をしていた。
しかしながら、ところどころ違うところも出てきており、極力、ファイルをいじらずに進め、php artisan serveをしようとしたところエラーが発生。

image.png

routesディレクトリ中のweb.phpを見てみると、以下のようになっていた。

<?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

use App\Http\Controllers\TaskController;
use Illuminate\Routing\Route;


Route::get('/', function () {
    return redirect('/tasks');
});

Route::get('/tasks', 'TaskController@index');
Route::post('/tasks', 'TaskController@store');
Route::delete('/tasks/{task}', 'TaskController@destroy');


  • 解決案1

エラー文そのまま検索してみるとちょうど同じ状況に陥った人の記事を発見できた。
https://qiita.com/tatuki81/items/6384f21382c17200de0d

早速、同じことをしてみる。

use App\Http\Controllers\TaskController;
use vendor\laravel\framework\src\Illuminate\Routing;

しかし、エラーは解決できず...

まずは以下のように。

use App\Http\Controllers\TaskController;
use Illuminate\Support\Facades\Route;

すると、php artisan serveできた。

内容を見てみると同じRoute.phpというファイル名でも中身は全然違う。

Illuminate\Support\Facades内のRoute.phpは以下のような内容。

<?php

namespace Illuminate\Support\Facades;

/**
 * @method static \Illuminate\Routing\Route fallback(\Closure|array|string|callable|null $action = null)
 * @method static \Illuminate\Routing\Route get(string $uri, \Closure|array|string|callable|null $action = null)
 * @method static \Illuminate\Routing\Route post(string $uri, \Closure|array|string|callable|null $action = null)
 * @method static \Illuminate\Routing\Route put(string $uri, \Closure|array|string|callable|null $action = null)
 * @method static \Illuminate\Routing\Route delete(string $uri, \Closure|array|string|callable|null $action = null)


わかったこと

原因は指定したファイルにメソッド(getとか使えるように書いてある)が入っていないよ!ということだったらしい。
メソッドが入っているIlluminate\Support\Facades内のRoute.phpを使うよという風にしたことでエラーが解除されたみたい。

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

Laravel8をノリで使ってみたらTarget class [◯◯Controller] does not existと表示された

今までLaravle6や7でアプリなどを作っていたが8にバージョンアップになったと聞いて早速8を使ってみたら、今まで見たことないエラーメッセージが表示されたのでここにメモとして残すことにした。

記述したコード
routes/web.php
<?php

use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/','BbsController@index');

App\Http\Controllers\BbsController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class BbsController extends Controller
{
//
public function index(){
return view('Bbs.index');
}
}

いつもの通りこれで画面表示されるだろと思ったらまさかのTarget class [BbsController] does not exist.と表示された。

よくよく調べてみたらLaravel8からルーティングの書き方が変わったらしく以下のように修正したら正常に動作した

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\BbsController;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', [BbsController::class,'index']);

どうやら作成したControllerのパスとルーティングの書き方を上のようにしないといけなくなったらしい。

まだまだLaravel8の変更点があるらしいので公式ドキュメントを見ようと思った。

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

PHPのThread Safetyが有効になっているかを調べる

tags: php

PHPには,スレッドセーフ版とノンスレッドセーフ版というのがある.

TS版,NTS版とか,PHP TS, PHP NTSとか呼ばれたりもする.

自分の環境で有効になっているかを確認するには,phpinfo()の出力や,php -iの出力を確認すればよい

phpinfo()の結果を見るとわかる。Thread Safetyの項がenabledならスレッド・セーフ版、disabledならノン・スレッド・セーフ版である。
https://clover.fcg.world/2017/03/19/8093/#toc1

確認方法

linux

linuxで確認する場合は以下.

$ php -i | grep -i "thread safety"
Thread Safety => disabled

windows

windowsで確認するためには powershell で以下のように発行する.

> php -i | Select-String -Pattern "Thread Safety"

Thread Safety => enabled

参考・関連リンク

この記事読んだのをきっかけに.スレッドセーフの有効/無効を調べようと思った.

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

sabre/dav

インストール

composer require sabre/dav
# データの保存場所
mkdir -p /home/share/webdav/
chmod 700 /home/share/webdav/
# lockファイル用
mkdir data

利用方法

/webdav/server.php
<?php
use Sabre\DAV;

require 'vendor/autoload.php';

// データ保管場所の設定。DocumentRootは避ける
$rootDirectory = new DAV\FS\Directory('/home/share/webdav/');
$server = new DAV\Server($rootDirectory);

// このスクリプトのURI
$server->setBaseUri('/webdav/server.php');

$lockBackend = new DAV\Locks\Backend\File('data/locks');
$lockPlugin = new DAV\Locks\Plugin($lockBackend);
$server->addPlugin($lockPlugin);

$server->addPlugin(new DAV\Browser\Plugin());

$server->exec();

アクセス

explorerで https://ドメイン名/webdav/server.php にアクセスすると
/home/share/webdav/が読み書きできることを確認。

認証

後で書く

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

【PHP】配列Aの並び順を正として、配列Bを並び替える

本記事の趣旨

PHPの配列について、備忘のためメモします。
誰かの何かの役に立てれば幸いです。

要件

配列A(以下”見本”)の要素の並び順を正として、配列B(以下”要並び替え”)の要素を並び替える。

ただし、
要並び替え配列の中身そのものを並び替えるのではなく、
要並び替え配列の各要素が見本配列に存在するか、をチェックしたうえで、
存在していたら、その要素は見本配列内では何番目にあるのか、という情報を取得し、
その情報をもとに、別な配列に要素を入れ直す。

単純な配列の場合

$mihon = ["りんご", "みかん", ”バナナ”]; // 見本

$temoto = ["バナナ”, "りんご", "みかん"]; // 要並び替え

$checked_array = []; // 並び替え後に格納する用の配列

foreach($mihon as $key => $fruit){
   // 見本配列をループしつつ、要並び替え配列の$key番目の要素が、見本配列内に存在するかチェック
   if(in_array($temoto[$key], $mihon)){
       $index = array_search($fruit, $mihon); // 見本配列の要素の添字情報を変数に代入
       $checked_array[$index] = $fruit; // 並び替え(というか別な配列に詰め直し)
   }
}

var_dump($checked_array); // 見本配列と同じ順番になっている
// array(3) {
  [0]=>
  string(9) "りんご"
  [1]=>
  string(9) "みかん"
  [2]=>
  string(9) "バナナ"
}


「foreachでは$key => $valueはワンセット」というのを強く意識しないと混乱します。
もっと良いやり方があるような気もしますが、現状思いつきません。

多次元配列の場合

追って記載

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