環境資訊
作業系統:WINDOWS 10 1909 專業版 64位元
Laravel Framework 7.8.1
Laravel/homestead (virtualbox, 9.5.1)
Vagrant version 2.2.9
git version 2.26.2.windows.1
MYSQL Workbench version 8.0.19
APACHE version 2.4.41
目前需求:
使用Laravel框架連接database(MYSQL),讀取資料並在網頁上呈現。
遇到的問題:
可以透過Laravel的migrations在資料庫中新增資料表與刪除資料表,也能插入資料等等,但就是無法從中讀取資料呈現在網頁上。
網頁上都是出現以下錯誤訊息:
『Illuminate\Database\QueryException
SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: YES) (SQL: select * from articles
where id
= 1)』
已經有上網爬很多文了,文章都說要先確定database.php檔與 .env檔設定是否正確,並且要清除快取/重啟服務器:
php artisan config:clear
php artisan cache:clear
php artisan serve
這些都有做過也確認無誤但都沒用,不知道為什麼明明能寫入資料卻無法讀取資料,這問題已經卡了好久了…希望各位前輩能幫我解答!!
以下是各個檔案的程式碼--如附圖
.env檔
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=DATABASE
DB_USERNAME=root
DB_PASSWORD=123
database.php檔
'mysql' => [
'read' => [
'host' => '127.0.0.1',
],
'write' => [
'host' => '127.0.0.1'
],
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'DATABASE'),
'username' => env('DB_USERNAME', 'root'),
'password' => env('DB_PASSWORD', '123'),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
routes/web.php檔
Route::get('/', "Controllers@index");
Controllers/Controllers.php檔
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
class Controllers extends Controller
{
public function index ()
{
$posts=DB::table('articles')->where('id', '=', "1")->get();
return view('page.index', ['articles' => $posts]);
}
}
views/page/index.blade.php檔
<h1>{{$articles}}</h1>
不知道為什麼明明能寫入資料卻無法讀取資料
無法通靈你所謂的能寫入,是透過Laravel還是直接進資料庫寫入資料的
你可以試試看重新啟動 Apache 服務 跟 MySQL 服務
若不行,修改root的密碼,用修改後的密碼連看看。
是透過Laravel還是直接進資料庫寫入資料的
是透過Laravel,建立migrations,然後用up方法建立資料表,在用Faker建立假資料,然後執行Seeder寫入的。
你可以試試看重新啟動 Apache 服務 跟 MySQL 服務
若不行,修改root的密碼,用修改後的密碼連看看。
這些之前都有嘗試過了,密碼只有英數,沒有特殊字符,還是無法讀取,謝謝你哦~
或是你可能有動到MySQL 的root帳號讀取權限
我有試過不用Laravel,單純建一個PHP檔案去讀取是可以的,然後呈現在網頁上,那這樣讀取權限應該是沒問題的..
建議你另外建一個新的Laravel專案測試看看
我覺得很大的機率是,你動到了什麼設定造成異常
先謝謝大家耐心地回答,非常感激T~T
我新開了一個專案,只改了.env,沒有動database.php,然後在App\Http\Controllers/YoyoController.php寫:
class YoyoController extends Controller
{
public function index ()
{
$posts=DB::table('articles')->where('id', '=', "1")->get();
return view('index', ['articles' => $posts]);
}
}
在routes/web.php寫:
Route::get('/', "YoyoController@index");
在resources/view.php寫:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>test</title>
</head>
<body>
{{ $articles }}
</body>
</html>
只改了這4個檔案,其他沒動,還是出現:
『Illuminate\Database\QueryException
SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: YES) (SQL: select * from articles
where id
= 1)』
yoyo_lin 你Laravel的mysql是連到本機的mysql還是homestead的mysql?
我懷疑你laravel連到homestead的mysql
但是你原生的php是連到本機的mysql
導致你原生php可以連mysql,Laravel不行
你的mysql是連到本機的mysql還是homestead的mysql?
真沒想過這問題啊..傻
不過我用Laravel Migration檔在本機的Mysql資料庫建立資料表是可以的?! 好奇怪..
所以你本機跟Homestead都有裝MySQL?
你的Laravel在Homestead底下應該是連Homestead的MySQL而非本機的MySQL
設定一下Homestead裡面的MySQL root帳號的密碼,再重試
不好意思問一個弱弱的問題..請問Homestead的MySQL要從哪邊進去阿..還有帳號密碼如何修改呢..謝謝你
ssh連進去homestead
下指令修改mysql密碼
感謝回復 您意思是:輸入vagrant ssh
後,輸入mysql -uhomestead -psecret
,會出現mysql >
,在輸入ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '密碼';
進行修改嗎??
自己先試試看阿...
謝謝大家耐心的幫忙找問題,已經解決了謝謝大家~
我在本地MySQL Workbench新增連接,把Homestead內建的MySQL連進來,在裡面新增資料以後,就都正常讀寫了,並顯示在網頁上了。
Ps.但是還有個問題就是不能用Laravel的migrations建立Homestead內建的MySQL的資料表,其他本地資料庫都可以正常利用migrations新增,其他讀寫都沒問題了。
我的也是這樣,我最後改用PDO去撈資料就拿到了...
跟這個↓
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
是不是有關係啊
config/database.php
不要去動它。只改env就好。
如果還原 config/database.php 就會造成以上的問題。
試試將env的localhost改成127.0.0.1
我把config/database.php還原,然後把env的localhost改成127.0.0.1,還是會出現一樣的錯誤:
『Illuminate\Database\QueryException
SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: YES) (SQL: select * from articles where id = 1)』
PS.另外有個想請教地方,就是每次更動.env檔案後,我在VS CODE終端機輸入:
php artisan serve
他最後一行顯示:
[Sat May 30 22:53:01 2020] PHP 7.4.4 Development Server (http://127.0.0.1:8001) started
之後並沒有再出現路徑"PS C:(路徑...)\laravel>",我都要關掉在重開終端機才會顯示,請問..這樣是正常的嗎?
你連資料庫的port該不會連到8001...
你連資料庫的port該不會連到8001...
可是其他資料庫建資料表,或是寫入資料都是沒問題,如果我把.env的port改成8001,他的錯誤會變成:
『Illuminate\Database\QueryException
SQLSTATE[HY000] [2002] Connection refused (SQL: select * from articles
where id
= 1)』
我弱弱的問一句,你有安裝或啟用mysql嘛??
先試試直接下命令 「mysql」試試
啟用mysql嗎,我進去services.msc看,MYSQL80的狀態是執行中,這樣就是有啟用對吧..
那只剩下最後了,再開一個新的專案。
只改env
再重新試試。目前是擔心你已經改到啥東西了。
先謝謝大家耐心地回答,非常感激T~T
我新開了一個專案,只改了.env,沒有動database.php,然後在App\Http\Controllers/YoyoController.php寫:
class YoyoController extends Controller
{
public function index ()
{
$posts=DB::table('articles')->where('id', '=', "1")->get();
return view('index', ['articles' => $posts]);
}
}
在routes/web.php寫:
Route::get('/', "YoyoController@index");
在resources/view.php寫:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>test</title>
</head>
<body>
{{ $articles }}
</body>
</html>
只改了這4個檔案,其他沒動,還是出現:
『Illuminate\Database\QueryException
SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: YES) (SQL: select * from articles
where id
= 1)』
好,那目前可以確定程式暫沒問題。
再來解決一下你的mysql
你說你用mysql命令還能進去吧。
進去後下達「SELECT User,Host FROM mysql.user;」
先查看看你目前的帳號及所屬host有哪些。
切記 localhost 並不等於 127.0.0.1
所以正常來說你的root帳號會看到2個或3個host。(第三個會是ipv6的,並不一定有)
或是你直接開一個新帳號來測試也行。
除非,你連mysql命令的方式也進不去。
那就先解決你的mysql、帳號、密碼。
不行的話,很有可能你動到mysql什麼設定了。
如密碼編碼之類的。
建議你的做法是先移除掉mysql再重新安裝。
進去後下達「SELECT User,Host FROM mysql.user;」
先查看看你目前的帳號及所屬host有哪些。
不管是root還是其他使用者或是前綴有mysql.的,host都只有localhostㄟ..沒有2~3個
不過正常安裝完因該root會有至少兩個才對。
你有修改過使用者權限過嘛?
因為聽到你說還有其它....
那只剩下最後一個測試。
ping localhost 看看
安裝MYSQL之後只有改過這個:
配合PHP更改MYSQL驗證方式:
caching_sha2_password 改成
mysql_native_password
my.ini更改mysqld
default-authentication-plugin=mysql_native_password
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '密碼';
CREATE USER 'newuser'@'localhost' IDENTIFIED BY '密碼;
以上這樣
ping localhost的話...是這樣
Ping 電腦名稱 [::1] (使用 32 位元組的資料):
回覆自 ::1: 時間<1ms
回覆自 ::1: 時間<1ms
回覆自 ::1: 時間<1ms
回覆自 ::1: 時間<1ms
::1 的 Ping 統計資料:
封包: 已傳送 = 4,已收到 = 4, 已遺失 = 0 (0% 遺失),
大約的來回時間 (毫秒):
最小值 = 0ms,最大值 = 0ms,平均 = 0ms
我會建議你裝個 phpmyadmin 先看看是否可以正常。
可以的話,不要用root另外開一個試試。
目前說真的並不太確定你的問題所在。
只能明白你的帳密是錯誤的。
先用phpmyadmin來分析你的php跟mysql的問題。
我本來的確是在猜測密碼編碼的問題。不過看你有修正了。
所以也可以排除這個問題了。
其它就真的不知道了。
先看看phpmyadmin能否進去吧。先不要去搞 laravel
因為你的 laravel 很單純。目前看來設定跟程式沒有很大的問題。
問題還是出在你mysql的帳號情況。
如果對指令不是很熟的情況下。phpmyadmin會是一個幫助。
剛看到你底下的留言。推測你用了雙環境。
你說用php一般的方式可以進去。
那可以先試著在 routes/web.php
打入如下的內容試試
Route::get('/', function(){
這裏放上你原本php能進入取得資料的程式。
});
再試試看。
我的程式碼:
$servername = "localhost"; //伺服器連線名
$username = "root"; //資料庫使用者名稱
$password = "資料庫密碼"; //資料庫密碼
$dbname = "資料庫名"; //資料庫名
$conn = new mysqli($servername, $username, $password, $dbname); //連線資料庫
echo "<table border='2' bordercolor='#66ccff'>";
if (!$conn) {
die("連線失敗:" . mysqli_connect_error()); //連線資料庫失敗則殺死程序
}
$sql = "SELECT product, price FROM 資料表名"; //查詢語句--查詢資料庫表
$result = mysqli_query($conn, $sql);
if (mysqli_num_rows($result) > 0) {
while ($row = mysqli_fetch_assoc($result)) {
echo "<tr>";
// echo "<tr>";
echo "<td>產品名稱:" . $row["product"] . "</td><td>價格:" . $row["price"] . "</td>";
echo "</tr>";
// echo "<td>產品名稱:" . $row["product"] . "</td><td>價格:" . $row["price"] . "</td>";
// echo "</tr>";
}
} else {
echo "0 結果";
}
echo "</table>";
mysqli_close($conn);
放進去後,結果是:
『ErrorException
mysqli::__construct(): (HY000/1045): Access denied for user 'root'@'localhost' (using password: YES)』
那答案找出來了,你的環境問題。
謝謝大家耐心的幫忙找問題,已經解決了謝謝大家~
我在本地MySQL Workbench新增連接,把Homestead內建的MySQL連進來,在裡面新增資料以後,就都正常讀寫了,並顯示在網頁上了。
Ps.但是還有個問題就是不能用Laravel的migrations建立Homestead內建的MySQL的資料表,其他本地資料庫都可以正常利用migrations新增,其他讀寫都沒問題了。
同上,
database.php 不要去動他,
你寫的那些clear的指令我沒有執行過.
另外.env那些參數,
你確定可以進入資料庫嗎?
可以先用資料庫連線軟體(如HeidiSQL等等),
然後資料庫名稱確定是 DATABASE?
確認可以正常連線.
再進行下一步判斷.
然後...
沒看到你的MySql版本,
你的MySql是用甚麼方式安裝的?
另外.env那些參數,
你確定可以進入資料庫嗎?
可以先用資料庫連線軟體(如HeidiSQL等等),
然後資料庫名稱確定是 DATABASE?
確認可以正常連線.
再進行下一步判斷.
可以的,可以建立/刪除資料表,或是寫入資料。
沒看到你的MySql版本
你的MySql是用甚麼方式安裝的?
MYSQL 版本是 8.0.19
是利用這個連結下載的:
MySQL Community Downloads
https://dev.mysql.com/downloads/windows/installer/
環境都是你自己建的嗎?
看起來很像是權限的問題,
如果不是帳號密碼錯誤,
有可能是權限的問題.
先謝謝大家耐心地回答,非常感激T~T
環境都是你自己建的嗎?
是的,MYSQL Apache Homestead Laravel..都是自己建立,但是我的Laravel不是安裝在Apache的htdocs資料夾裡面,是安裝在Homestead裡面,請問這樣會有差異嗎?
看起來很像是權限的問題,
如果不是帳號密碼錯誤,
有可能是權限的問題.
請問是Laravel讀取資料庫權限的意思嗎? 因為我單純用php檔案讀取是可行的..
謝謝大家耐心的幫忙找問題,已經解決了謝謝大家~
我在本地MySQL Workbench新增連接,把Homestead內建的MySQL連進來,在裡面新增資料以後,就都正常讀寫了,並顯示在網頁上了。
Ps.但是還有個問題就是不能用Laravel的migrations建立Homestead內建的MySQL的資料表,其他本地資料庫都可以正常利用migrations新增,其他讀寫都沒問題了。