- 投稿日:2020-11-21T22:42:34+09:00
【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(); }
- 投稿日:2020-11-21T18:53:04+09:00
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() { // 省略 } }
- 投稿日:2020-11-21T18:13:49+09:00
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頑張りたい
- 投稿日:2020-11-21T16:40:56+09:00
【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をしようとしたところエラーが発生。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;しかし、エラーは解決できず...
- 解決案2
- 違う記事を見つけたので同じことを試してみる https://teratail.com/questions/257584
まずは以下のように。
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を使うよという風にしたことでエラーが解除されたみたい。
- 投稿日:2020-11-21T11:56:47+09:00
Laravel8をノリで使ってみたらTarget class [◯◯Controller] does not existと表示された
今までLaravle6や7でアプリなどを作っていたが8にバージョンアップになったと聞いて早速8を使ってみたら、今まで見たことないエラーメッセージが表示されたのでここにメモとして残すことにした。
記述したコード
routes/web.php
<?phpuse 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の変更点があるらしいので公式ドキュメントを見ようと思った。
- 投稿日:2020-11-21T11:16:30+09:00
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 => disabledwindows
windowsで確認するためには powershell で以下のように発行する.
> php -i | Select-String -Pattern "Thread Safety" Thread Safety => enabled参考・関連リンク
この記事読んだのをきっかけに.スレッドセーフの有効/無効を調べようと思った.
- 投稿日:2020-11-21T05:53:55+09:00
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/
が読み書きできることを確認。認証
後で書く
- 投稿日:2020-11-21T00:10:59+09:00
【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はワンセット」というのを強く意識しないと混乱します。
もっと良いやり方があるような気もしますが、現状思いつきません。多次元配列の場合
追って記載