iT邦幫忙

0

如何利用Laravel讀取資料庫,並呈現在網頁上呢

  • 分享至 

  • xImage

環境資訊
作業系統: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>
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
通靈亡
iT邦高手 1 級 ‧ 2020-05-29 22:03:59

不知道為什麼明明能寫入資料卻無法讀取資料

無法通靈你所謂的能寫入,是透過Laravel還是直接進資料庫寫入資料的

你可以試試看重新啟動 Apache 服務 跟 MySQL 服務
若不行,修改root的密碼,用修改後的密碼連看看。

看更多先前的回應...收起先前的回應...
yoyo_lin iT邦新手 5 級 ‧ 2020-05-29 22:24:29 檢舉

是透過Laravel還是直接進資料庫寫入資料的

是透過Laravel,建立migrations,然後用up方法建立資料表,在用Faker建立假資料,然後執行Seeder寫入的。

你可以試試看重新啟動 Apache 服務 跟 MySQL 服務
若不行,修改root的密碼,用修改後的密碼連看看。

這些之前都有嘗試過了,密碼只有英數,沒有特殊字符,還是無法讀取,謝謝你哦~

通靈亡 iT邦高手 1 級 ‧ 2020-05-30 07:03:58 檢舉

或是你可能有動到MySQL 的root帳號讀取權限

yoyo_lin iT邦新手 5 級 ‧ 2020-05-30 22:47:51 檢舉

我有試過不用Laravel,單純建一個PHP檔案去讀取是可以的,然後呈現在網頁上,那這樣讀取權限應該是沒問題的..

通靈亡 iT邦高手 1 級 ‧ 2020-05-31 14:29:15 檢舉

建議你另外建一個新的Laravel專案測試看看
我覺得很大的機率是,你動到了什麼設定造成異常

yoyo_lin iT邦新手 5 級 ‧ 2020-06-01 15:52:37 檢舉

先謝謝大家耐心地回答,非常感激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)』

通靈亡 iT邦高手 1 級 ‧ 2020-06-01 16:33:04 檢舉

yoyo_lin 你Laravel的mysql是連到本機的mysql還是homestead的mysql?
我懷疑你laravel連到homestead的mysql
但是你原生的php是連到本機的mysql

導致你原生php可以連mysql,Laravel不行

yoyo_lin iT邦新手 5 級 ‧ 2020-06-01 17:00:18 檢舉

你的mysql是連到本機的mysql還是homestead的mysql?

真沒想過這問題啊..傻/images/emoticon/emoticon20.gif
不過我用Laravel Migration檔在本機的Mysql資料庫建立資料表是可以的?! 好奇怪..

通靈亡 iT邦高手 1 級 ‧ 2020-06-01 17:04:50 檢舉

所以你本機跟Homestead都有裝MySQL?
你的Laravel在Homestead底下應該是連Homestead的MySQL而非本機的MySQL

設定一下Homestead裡面的MySQL root帳號的密碼,再重試

yoyo_lin iT邦新手 5 級 ‧ 2020-06-01 19:47:10 檢舉

不好意思問一個弱弱的問題..請問Homestead的MySQL要從哪邊進去阿..還有帳號密碼如何修改呢..謝謝你/images/emoticon/emoticon10.gif

通靈亡 iT邦高手 1 級 ‧ 2020-06-01 22:23:06 檢舉

ssh連進去homestead
下指令修改mysql密碼

yoyo_lin iT邦新手 5 級 ‧ 2020-06-02 08:22:56 檢舉

感謝回復 您意思是:輸入vagrant ssh後,輸入mysql -uhomestead -psecret,會出現mysql >,在輸入ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '密碼';進行修改嗎??/images/emoticon/emoticon20.gif

通靈亡 iT邦高手 1 級 ‧ 2020-06-02 08:38:00 檢舉

自己先試試看阿...

yoyo_lin iT邦新手 5 級 ‧ 2020-06-05 17:50:38 檢舉

謝謝大家耐心的幫忙找問題,已經解決了謝謝大家~ /images/emoticon/emoticon41.gif
我在本地MySQL Workbench新增連接,把Homestead內建的MySQL連進來,在裡面新增資料以後,就都正常讀寫了,並顯示在網頁上了。
Ps.但是還有個問題就是不能用Laravel的migrations建立Homestead內建的MySQL的資料表,其他本地資料庫都可以正常利用migrations新增,其他讀寫都沒問題了。

Nick iT邦新手 5 級 ‧ 2020-09-25 16:31:32 檢舉

我的也是這樣,我最後改用PDO去撈資料就拿到了...
跟這個↓
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
是不是有關係啊

0

config/database.php
不要去動它。只改env就好。

如果還原 config/database.php 就會造成以上的問題。

試試將env的localhost改成127.0.0.1

看更多先前的回應...收起先前的回應...
yoyo_lin iT邦新手 5 級 ‧ 2020-05-30 23:01:47 檢舉

我把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>",我都要關掉在重開終端機才會顯示,請問..這樣是正常的嗎?

通靈亡 iT邦高手 1 級 ‧ 2020-05-30 23:23:28 檢舉

你連資料庫的port該不會連到8001...

yoyo_lin iT邦新手 5 級 ‧ 2020-05-31 11:42:59 檢舉

你連資料庫的port該不會連到8001...

可是其他資料庫建資料表,或是寫入資料都是沒問題,如果我把.env的port改成8001,他的錯誤會變成:
『Illuminate\Database\QueryException
SQLSTATE[HY000] [2002] Connection refused (SQL: select * from articles where id = 1)』

我弱弱的問一句,你有安裝或啟用mysql嘛??

先試試直接下命令 「mysql」試試

yoyo_lin iT邦新手 5 級 ‧ 2020-05-31 17:55:27 檢舉

啟用mysql嗎,我進去services.msc看,MYSQL80的狀態是執行中,這樣就是有啟用對吧..

那只剩下最後了,再開一個新的專案。
只改env
再重新試試。目前是擔心你已經改到啥東西了。

yoyo_lin iT邦新手 5 級 ‧ 2020-06-01 15:51:47 檢舉

先謝謝大家耐心地回答,非常感激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再重新安裝。

yoyo_lin iT邦新手 5 級 ‧ 2020-06-01 16:09:31 檢舉

進去後下達「SELECT User,Host FROM mysql.user;」
先查看看你目前的帳號及所屬host有哪些。

不管是root還是其他使用者或是前綴有mysql.的,host都只有localhostㄟ..沒有2~3個

不過正常安裝完因該root會有至少兩個才對。
你有修改過使用者權限過嘛?
因為聽到你說還有其它....

那只剩下最後一個測試。
ping localhost 看看

yoyo_lin iT邦新手 5 級 ‧ 2020-06-01 16:37:45 檢舉

安裝MYSQL之後只有改過這個:

配合PHP更改MYSQL驗證方式:
caching_sha2_password 改成
mysql_native_password

  1. my.ini更改mysqld
    default-authentication-plugin=mysql_native_password

  2. ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '密碼';

  3. 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能進入取得資料的程式。

}); 

再試試看。

yoyo_lin iT邦新手 5 級 ‧ 2020-06-01 18:53:01 檢舉

我的程式碼:

$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)』

那答案找出來了,你的環境問題。

yoyo_lin iT邦新手 5 級 ‧ 2020-06-05 17:50:22 檢舉

謝謝大家耐心的幫忙找問題,已經解決了謝謝大家~ /images/emoticon/emoticon41.gif
我在本地MySQL Workbench新增連接,把Homestead內建的MySQL連進來,在裡面新增資料以後,就都正常讀寫了,並顯示在網頁上了。
Ps.但是還有個問題就是不能用Laravel的migrations建立Homestead內建的MySQL的資料表,其他本地資料庫都可以正常利用migrations新增,其他讀寫都沒問題了。

0
小魚
iT邦大師 1 級 ‧ 2020-05-31 12:37:19

同上,
database.php 不要去動他,
你寫的那些clear的指令我沒有執行過.

另外.env那些參數,
你確定可以進入資料庫嗎?
可以先用資料庫連線軟體(如HeidiSQL等等),
然後資料庫名稱確定是 DATABASE?
確認可以正常連線.
再進行下一步判斷.

然後...
沒看到你的MySql版本,
你的MySql是用甚麼方式安裝的?

看更多先前的回應...收起先前的回應...
yoyo_lin iT邦新手 5 級 ‧ 2020-05-31 17:49:46 檢舉

另外.env那些參數,
你確定可以進入資料庫嗎?
可以先用資料庫連線軟體(如HeidiSQL等等),
然後資料庫名稱確定是 DATABASE?
確認可以正常連線.
再進行下一步判斷.

可以的,可以建立/刪除資料表,或是寫入資料。

沒看到你的MySql版本
你的MySql是用甚麼方式安裝的?

MYSQL 版本是 8.0.19
是利用這個連結下載的:
MySQL Community Downloads
https://dev.mysql.com/downloads/windows/installer/

小魚 iT邦大師 1 級 ‧ 2020-05-31 23:24:02 檢舉

環境都是你自己建的嗎?
看起來很像是權限的問題,
如果不是帳號密碼錯誤,
有可能是權限的問題.

yoyo_lin iT邦新手 5 級 ‧ 2020-06-01 16:05:52 檢舉

先謝謝大家耐心地回答,非常感激T~T

環境都是你自己建的嗎?

是的,MYSQL Apache Homestead Laravel..都是自己建立,但是我的Laravel不是安裝在Apache的htdocs資料夾裡面,是安裝在Homestead裡面,請問這樣會有差異嗎?

看起來很像是權限的問題,
如果不是帳號密碼錯誤,
有可能是權限的問題.

請問是Laravel讀取資料庫權限的意思嗎? 因為我單純用php檔案讀取是可行的..

小魚 iT邦大師 1 級 ‧ 2020-06-03 17:48:39 檢舉

 

yoyo_lin iT邦新手 5 級 ‧ 2020-06-05 17:51:06 檢舉

謝謝大家耐心的幫忙找問題,已經解決了謝謝大家~ /images/emoticon/emoticon41.gif
我在本地MySQL Workbench新增連接,把Homestead內建的MySQL連進來,在裡面新增資料以後,就都正常讀寫了,並顯示在網頁上了。
Ps.但是還有個問題就是不能用Laravel的migrations建立Homestead內建的MySQL的資料表,其他本地資料庫都可以正常利用migrations新增,其他讀寫都沒問題了。

我要發表回答

立即登入回答