發表文章

目前顯示的是 二月, 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=newCategory;$category->id="category01";$category->name="分類 C";$category->save();$product=newProduct;$product->name="商品 P";$category->products()->save($product);檢查了一遍 Category 的 Model 已經設好 hasMany:publicfunctionproducts(){return$this->hasMany('App\Product');}Product 的 Model 中 belongsTo 也設定正確:publicfunctioncategory(){return$this->belongsTo('App\Category');}問題在這這時我們從上面錯誤訊息可以注意到 category_id 的值是「0」values(商品 P,0)這個 category_id 照程式碼來看應該要是「category01」,
但我們要儲存 one to many 時,卻在組成 …

[筆記] 無法重置 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 是一個認證外掛,
主要是讓使用者可以直接透過系統認證進入資料庫,不需輸入密碼。
(那為什麼我還要這麼折騰進不去RRRR)所以解決方法?解決方法很簡單,就是把 “unix_socket…

[筆記] Facebook Open Graph 的 og:local 該如何設定?

圖片
Facebook 的開放社交關係圖(Open Graph)針對 og:locale 的規範不曉得是不是有更新,以至於檢查網頁抓取資訊的時候噴了一個我沒看過的錯:
「 website 」類型的 URL「 https://www.example.com 」無效,因為「 og:locale:locale 」特性的指定值「 XX 」無法作為「 enum 」類型進行剖析。
Object at URL ‘https://www.example.com’ of type ‘website’ is invalid because the given value ‘XX’ for property ‘og:locale:locale’ could not be parsed as type ‘enum’.查了一下發現是語言格式錯了,Facebook 的格式不是完全依照 ISO 標準,依據本地化文件的說明:Facebook 上的語言使用 ll_CC 格式,ll 是兩個字母的語言代碼,CC 是兩個字母的國家/地區代碼。例如,en_US 代表美式英文。 我們支援許多 ISO 語言和國碼/區碼從 SDK 文件裡面可以看到目前 Facebook 支援的 og:locate 列舉如下:Allowed values: en_us, ca_es, cs_cz, cx_ph, cy_gb, da_dk, de_de, eu_es, en_pi, en_ud, ck_us, es_la, es_es, es_mx, gn_py, fi_fi, fr_fr, gl_es, ht_ht, hu_hu, it_it, ja_jp, ko_kr, nb_no, nn_no, nl_nl, fy_nl, pl_pl, pt_br, pt_pt, ro_ro, ru_ru, sk_sk, sl_si, sv_se, th_th, tr_tr, ku_tr, zh_cn, zh_hk, zh_tw, fb_lt, af_za, sq_al, hy_am, az_az, be_by, bn_in, bs_ba, bg_bg, hr_hr, nl_be, en_gb, eo_eo, et_ee, fo_fo, fr_ca, ka_ge, el_gr, gu_in, hi_in, is_is, id_id, ga_ie, …

[筆記] 使用其他 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/bashsource ~/.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>"