値を返さなくてもよいSQLの実行
\DB::statement('DELETE FROM jobs'); // 全データを削除
\DB::statement('ALTER TABLE jobs auto_increment = 1'); // idの自動インクリメントをリセットする
SELECT系のSQLを直接実行 | INSERT, UPDATE, DELETE
$data = \DB::select('select * from nekos where id= 4');
レスポンスはエンティティの配列となる。SELECT系のSQLを安全に実行
$data = \DB::select('select * from nekos where id = :id', ['id' => 4]);
この方法は値はサニタイズされるようなのでセーフティなコーディングと言える。selectメソッドは一応どんなSQLでも実行可能。
selectメソッドはSELECT文専用ではない。UPDATEなど他のSQLも実行できる。 つまり、selectメソッドは生のSQLを何でも実行できるメソッドである。 ちなみにUPDATEなどのSQLを実行したときのレスポンスは空配列「[]」になる。$data = \DB::select("UPDATE `nekos` SET `neko_val`=2000,`neko_name`='シャム猫' WHERE id=4");
INSERTを直接実行
$res = \DB::insert("INSERT INTO `nekos`(`neko_val`, `neko_name`) VALUES (1001, 'ホンハブ')");
レスポンスはbool型のtrue。
INSERTを安全に実行
$res = \DB::insert("INSERT INTO `nekos`(`neko_val`, `neko_name`) VALUES (?, ?)", [1002, 'ヒメハブ']);
UPDATEを直接実行
$res = \DB::update("UPDATE `nekos` SET `neko_val`=100,`neko_name`='黒猫' WHERE id=4");
UPDATEを安全に実行
$res = \DB::update("UPDATE `nekos` SET `neko_val`=?,`neko_name`=? WHERE id=?", [101,'白猫',5]);
DELETE
$res = \DB::delete('delete from nekos where neko_name = ?', ['マンチカン']);
レスポンスを必要としないSQLの実行
$res = \DB::statement('ALTER TABLE nekos auto_increment = 1;');
レスポンスはbool型のtrueが返ってくる。
try {
\DB::beginTransaction();
// データベース操作...
\DB::commit();
} catch (\Exception $e) {
\DB::rollback();
}
旧
\DB::beginTransaction();
\DB::commit();
\DB::rollback();
if(\Auth::id()){// idは未ログインである場合、nullになる。
$user_id = \Auth::id(); // ユーザーID(番号)
$user_name = \Auth::user()->name; // ユーザー名
$user_email = \Auth::user()->email; // メールアドレス
$user_password_hash = \Auth::user()->password; // ハッシュ化(解読不可)されたパスワード
}
$ composer require laravel/ui 2.*
php artisan ui vue --auth
http://localhost/animal/public/
スタイルの適用
下記の手順でBootstrapを適用するとスタイルが適用されたログイン画面になる。注意
Laravel7では「php artisan make:auth」コマンドが使えなくなっている。php artisan ui bootstrap
php artisan ui vue
npm install
npm run dev
bootstrap.jsやvue.js, jqueryなど一つにまとめる。その一つにまとめたファイルがapp.jsである。app.cssも同様に各種CSSパッケージを一つにまとめたもの。
npm run production
<script src="{{ asset('js/app.js') }}" defer></script>
<script src="{{ asset('/js/test.js') }}"></script>
$query = ¥DB::table('nekos AS Neko')->
select('id', 'neko_name as cat', 'neko_val', 'neko_date');
dump($query->toSql()); // →"select `id`, `neko_name` as `cat`, `neko_val`, `neko_date` from `nekos` as `Neko`"
$data = $query->get();
dump($data);
jQuery is not definedJS読み込みとCSS読み込みが逆になると「$ is not defined」のエラーが発生するようだ。
<link href="{{ asset('/css/app.css') }}" rel="stylesheet">
<script src="{{ asset('/js/app.js') }}" defer></script>
<script src="{{ asset('/js/app.js') }}" defer></script>
<link href="{{ asset('/css/app.css') }}" rel="stylesheet">
<?php $test1="Hello big fish!";?>
@include('layouts/common/test')
テンプレートの埋め込みテスト<br>
<?php echo $test1;?>
テンプレートの埋め込みテスト Hello big fish!
テンプレートに引数追加することもできる
@include('demo.edit_form', ['neko'=>'ロイヤルアナロスタン'])
demo/edit_form(ルートresources/views/layouts/demo/edit_form.php)
猫の名前は?→<?php echo $neko; ?>
注意
ビュー側(ブレードテンプレート/html)
<input type="button" value="test_ajax" onclick="test_ajax()" /> <input type="hidden" id="csrf_token" value="{{ csrf_token() }}" > <div id="err" class="text-danger" ></div>
JS側
フロント側function test_ajax(){ console.log('test_ajax'); let fd = new FormData(); // 送信フォームデータ let data = {id:123, name:'古いねこ', age:15}; // バックエンド側に送信するデータ let json = JSON.stringify(data); fd.append( "key1", json ); // CSRFトークンを送信フォームデータにセットする。 let token = jQuery('#csrf_token').val(); fd.append( "_token", token ); jQuery.ajax({ type: "post", url: 'neko/test_ajax_be', data: fd, cache: false, dataType: "text", processData: false, contentType: false, }).done((str_json, status, xhr) => { // 419エラーならトークンの期限切れの可能性のためリロードする(トークンの期限は2時間) if(xhr.status == 419) location.reload(true); let res = null; try{ res =jQuery.parseJSON(str_json); //パース }catch(e){ alert('バックエンド側のエラー'); console.log(str_json); $('#err').html(str_json); return; } if(res.err_msg == 'logout') location.reload(true); // すでにログアウトになっているならブラウザをリロードする。 if(res.err_msg) { console.log(res.err_msg);//■■■□□□■■■□□□ return; } console.log(res);//■■■□□□■■■□□□ }).fail((xhr, status, errorThrown) => { // 419エラーならトークンの期限切れの可能性のためリロードする(トークンの期限は2時間) if(xhr.status == 419) location.reload(true); alert('通信エラー'); console.log(status); console.log(xhr.responseText); $('#err').html(xhr.responseText); }); }
PHP側
バックエンド、つまりAjaxの受信側。通常のコントローラクラスにて処理を記述。~ 略 ~ class NekoController { ~ 略 ~ public function testAjax(){ // すでにログアウトになったらlogoutであることをフロントエンド側に知らせる。 if(\Auth::id() == null) return json_encode(['err_msg'=>'logout']); $json=$_POST['key1']; $res = json_decode($json,true); $res['name'] = '新しい猫'; $res['age'] = 1; $res['date'] = '2020-7-23'; $json = json_encode($res, JSON_HEX_TAG | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_HEX_APOS); return $json; } ~ 略 ~
ルートパス
~ 略 ~
Route::post('neko/test_ajax_be', 'NekoController@testAjax');
~ 略 ~
画面側の出力例
SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect date value: ...
解決方法
ルート/config/database.phpを開きstrictをtrueからfalseに変更する。'connections' => [ 'mysql' => [ 'driver' => 'mysql', 'url' => env('DATABASE_URL'), 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'prefix_indexes' => true, 'strict' => false, 'engine' => null, 'options' => extension_loaded('pdo_mysql') ? array_filter([ PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), ]) : [],