發表文章

目前顯示的是 2月, 2018的文章

[筆記] Laravel One to Many 遇到 a foreign key constraint fails

圖片
碰到錯誤訊息了 (以下 Model 與 Table 名稱為示意,有可能因為手工改寫而有出入,看起來怪怪的地方請跟我說) 在儲存 Category、Product 兩 table 的 One to Many 資料時,我收到的錯誤訊息如下: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`store`.`products`, CONSTRAINT `products_category_id_foreign` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`)) (SQL: insert into `products` (`name`, `category_id`) values (商品 P, 0)) 發生錯誤的程式碼簡化後類似這樣: $category = new Category ; $category - > id = "category01" ; $category - > name = "分類 C" ; $category - > save ( ) ; $product = new Product ; $product - > name = "商品 P" ; $category - > products ( ) - > save ( $product ) ; 檢查了一遍 Category 的 Model 已經設好 hasMany : public function products ( ) { return $this - > hasMany ( 'App\Product' ) ; } Product 的 Model 中 belongsTo 也設定正確: public function category ( ) { return $this - > belongsTo ( '

[筆記] 無法重置 MariaDB 的 root 密碼該怎麼做?

圖片
忘記 MariaDB 的密碼想要重設,下了多個常見的指令 MariaDB [ ( none ) ] > SET PASSWORD FOR 'root' @'localhost ' = PASSWORD(' new_password '); MariaDB [(none)]> ALTER USER ' root '@' localhost ' IDENTIFIED BY ' new_password '; MariaDB [(none)]> UPDATE mysql.user SET authentication_string = PASSWORD(' new_password ') WHERE User = ' root ' AND Host = ' localhost '; MariaDB [(none)]> update mysql.user set password=password(' MyNewPass ') where user=' root' ; 都失敗,出現的錯誤訊息大多如下 ERROR 1131 (42000): You are using MariaDB as an anonymous user and anonymous users are not allowed to change password 照著很多網路步驟做,都還是不能修改成功。 都是當下看起來成功,然後下 quit 重新登入又失敗。 這時只好換個關鍵字搜尋:"cant reset MariaDB password" 就被拯救了! 發生什麼事? 多篇文章都提到同一個現象 如果你的 mysql.user table 裡面的 plugin 欄位被 “unix_socket” 佔據, 就會修改失敗(這是什麼巫術…) 依據國外網友分析, 通常 MariaDB 更新後, plugin 欄位就會被補上這個值(這又是什麼巫術…) 大致看一下, Unix Socket 是一個認證外掛, 主要是讓使用者可以直接透過系統認證進入資

[筆記] 使用其他 User 執行 Cron Job 腳本

以 Laravel 的 php artisan schedule 為例, 如果希望是特定使用者執行的話可以這樣做: Crontab 部分 在 crontab 中用 su 指定使用者(例如 www),並執行 shell 腳本。 例如在 crontab -e 中: * * * * * su www -c "/usr/local/bin/laravel-scheduler.sh" Shell Script 部分 使用 crontab 執行 shell script 時,預設不會載入 .bashrc。 因為我們有使用 PHPBrew 管理多版本的 PHP, 需要手動透過 source 載入環境變數, 才能執行正確的 PHP 版本。 例如在 /usr/local/bin/laravel-scheduler.sh 中: #!/bin/bash source ~/.bashrc # 載入 www 的 bash 環境變數 php /path-to-your-project/artisan schedule:run >> /dev/null 2 > & 1 其實… 網路上找到一些其他的解決方案,我還沒實際嘗試,有錯誤的話煩請告訴我。 也可以都寫在 Crontab 這樣就不用寫 shell script。 例如在 crontab -e 中: * * * * * su www -c "source /home/www/.bashrc; <command>" 也可以直接指定 Shell 和環境變數 但這應該會影響到整個 crontab。 例如在 crontab -e 中: SHELL = /bin/bash BASH_ENV = "/home/www/.bashrc" * * * * * su www -c "<command>"