<abbr id="91665"></abbr>
<i id="91665"><legend id="91665"><dfn id="91665"></dfn></legend></i>
        \n \n <\/body>\n<\/html>\n<\/pre>>由於笑話可能包含可以解釋為HTML代碼的字符(例如,或&),因此我們必須使用htmlspecialchars來確保它們被翻譯成HTML字符實體(即,&lt;&gt;&gt;&gt; &gt;&gt; ;\n

        下面的圖像顯示了此頁面一旦您在數(shù)據(jù)庫中添加了幾個笑話後的外觀。 <\/p>\n

        <\/p>

        \n<\/p>>

        記得我們?nèi)绾卧诳刂破髦惺褂靡粋€時循環(huán)以一次設(shè)置一個行中的行中的行?<\/p>\n

        \nCREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';\nGRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';\n<\/pre>\n事實證明,pdostatement對象的行為就像陣列一樣,當(dāng)您將它們傳遞到foreach循環(huán)時。因此,您可以使用foreach循環(huán)而不是while循環(huán)稍微簡化數(shù)據(jù)庫處理代碼:

        >\n<\/em>\n<\/p>\n

        new PDO('mysql:host=hostname;dbname=database', 'username',\n  'password')\n<\/pre>>我將在本書的其餘部分中使用此整形詞。\nPHP提供的另一種整潔的工具是調(diào)用Echo命令的速記方式,如您已經(jīng)看到的那樣,我們需要經(jīng)常使用。我們的迴聲陳述看起來像這樣:

        \n\n<\/em>>我們可以使用以下方式:<\/p>>\n

        \n<\/p>這完全是相同的。 $pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',\n 'mypassword');\n這是一個使用速記迴聲的更新模板。\n

        >示例:mysql-listjokes-shorthand<\/p>\n

        try {\n  ? do something risky\n}\ncatch (ExceptionType $e) {\n  ? handle the exception\n}\n<\/pre>\n

        >從此適用時,我將使用速記符號。 <\/p>>\n

        <\/p>注意:在5.4之前的PHP版本中,此速記符號需要啟用相當(dāng)不常見的PHP設(shè)置,因此出於兼容的原因而勸阻它。使用速記符號可能會導(dǎo)致您的代碼從啟用的服務(wù)器移動到?jīng)]有的服務(wù)器時停止工作。\n

        <\/p>>

        try {\n  $pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',\n    ’mypassword’);\n  $output = 'Database connection established.';\n}\ncatch (PDOException $e) {\n  $output = 'Unable to connect to the database server.';\n}\n\ninclude  __DIR__ . '\/..\/templates\/output.html.php';\n<\/pre>截至PHP 5.4(因此,您實際上將遇到這些天的任何版本),無論PHP設(shè)置如何。 

        <\/p>\n

        提前思考\n在我們剛剛查看的示例中,我們創(chuàng)建了一個模板jokes.html.php,其中包含顯示頁面所需的所有HTML。但是,隨著我們網(wǎng)站的增長,我們將添加更多頁面。當(dāng)然,我們當(dāng)然希望人們能夠在網(wǎng)站上添加笑話,我們還需要一個帶有一些介紹性文本的主頁,一個帶有所有者的聯(lián)繫方式的頁面,並且隨著網(wǎng)站的增長,也許甚至可能人們可以<\/em>登錄到網(wǎng)站的頁面。 <\/p>>\n

        >我在這裡跳了很多,但是考慮到項目的發(fā)展始終值得一提。如果我們應(yīng)用方法,我們只是將jokes.html.php用於其餘模板- addjoke.html.php,home.html.php,contact.html.php,login.html.php等等- 我們'最終有很多重複的代碼。 >\n<\/em>網(wǎng)站上的每個頁面都需要一個模板,看起來像這樣的模板:<\/p>>\n

        \n作為程序員,重複代碼是您可以做的最糟糕的事情之一。實際上,程序員通常是指乾燥原則,該原則代表“不要重複自己”。如果您發(fā)現(xiàn)自己重複了代碼的部分,幾乎可以肯定有一個更好的解決方案。 <\/h2>>

        所有最好的程序員都是懶惰的,重複代碼意味著重複工作。使用此副本\/粘貼方法作為模板,該網(wǎng)站非常難以維護(hù)。想像一下,我們要在每個頁面上出現(xiàn)一個頁腳和一個導(dǎo)航部分?,F(xiàn)在,我們的模板看起來像這樣:<\/p>\n

        \nCREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';\nGRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';\n<\/pre>\n

        >我們將在2022年遇到問題!如果網(wǎng)站上所有頁面的模板- 例如,jokes.html.php addjoke.html.php,home.html.php,contact.html.php andlogin.html.php-將版權(quán)通知中的年份更新為“ 2022”,您需要打開每個模板並更改日期。 <\/p>\n

        >我們可能會很聰明,並從服務(wù)器的時鐘(echo date('y');如果您很好奇!)動態(tài)讀取日期,以避免此問題,但是如果我們想添加

        国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

        目錄
        >示例:mysql-create
        >其他
        >確保您的MySQL數(shù)據(jù)庫涉及多個步驟。首先,確保使用防火牆和其他適當(dāng)?shù)陌踩胧┰诎踩h(huán)境中運行您的MySQL Server。其次,為您的MySQL帳戶使用強,獨特的密碼。第三,限制您的MySQL帳戶的特權(quán),以便它們只有執(zhí)行任務(wù)所需的權(quán)限。最後,定期更新和修補您的mysql Server以防止已知漏洞。
        >您可以使用更新在MySQL數(shù)據(jù)庫中更新數(shù)據(jù)命令。此命令修改表中的現(xiàn)有行。您可以指定表名稱,要更新的列以及新值,以及一個以下子句選擇要更新的行。
        首頁 後端開發(fā) php教程 在網(wǎng)絡(luò)上顯示MySQL的數(shù)據(jù):簡介

        在網(wǎng)絡(luò)上顯示MySQL的數(shù)據(jù):簡介

        Feb 08, 2025 am 09:45 AM

        在網(wǎng)絡(luò)上顯示MySQL的數(shù)據(jù):簡介

        >以下文章摘自PHP&MySQL:新手到Ninja,第7版,這是學(xué)習(xí)所有工具,原理和技術(shù)的動手指南,以構(gòu)建專業(yè)的Web應(yīng)用程序。在該系列的最後一個教程中,您將學(xué)習(xí)如何將存儲在MySQL數(shù)據(jù)庫中的信息並在網(wǎng)頁上顯示供所有人查看。 。


          >使用Docker
        • 設(shè)置PHP開發(fā)環(huán)境
        • > php
        • 的初學(xué)者指南
        • 介紹MySQL:初學(xué)者指南
        • >在網(wǎng)絡(luò)上顯示MySQL的數(shù)據(jù):簡介

        就是這樣 - 您註冊的內(nèi)容!在本章中,您將學(xué)習(xí)如何將存儲在MySQL數(shù)據(jù)庫中的信息顯示並在網(wǎng)頁上顯示以供所有人查看。

        到目前為止,您已經(jīng)編寫了第一個PHP代碼,並了解了MySQL(關(guān)係數(shù)據(jù)庫引擎)的基礎(chǔ)知識,而PHP是服務(wù)器端腳本語言。

        >現(xiàn)在,您已經(jīng)準(zhǔn)備好學(xué)習(xí)如何一起使用這些工具來創(chuàng)建一個網(wǎng)站,用戶可以從數(shù)據(jù)庫中查看數(shù)據(jù),甚至添加自己的數(shù)據(jù)。

        >

        注意:如第3章所示,我在這裡使用“ mysql”來參考數(shù)據(jù)庫協(xié)議。您的PHP腳本也會做同樣的事情。本章中有許多參考文獻(xiàn) - 在您將編寫的PHP代碼中,即使我們實際上是連接到MariadB數(shù)據(jù)庫的“ MySQL”。

        。

        大圖

        >在我們飛躍之前,值得一試,以清楚地了解我們的最終目標(biāo)。我們可以使用兩個強大的工具:PHP腳本語言和MySQL數(shù)據(jù)庫引擎。重要的是要了解這些將如何融合在一起。 在網(wǎng)絡(luò)上顯示MySQL的數(shù)據(jù):簡介>

        >將MySQL用於我們的網(wǎng)站的目的是允許從數(shù)據(jù)庫中動態(tài)提取內(nèi)容,以創(chuàng)建用於在常規(guī)瀏覽器中查看的網(wǎng)頁。因此,在系統(tǒng)的一端,您可以使用Web瀏覽器訪問網(wǎng)站訪問者來請求頁面。該瀏覽器希望收到標(biāo)準(zhǔn)的HTML文檔作為回報。在另一端,您有網(wǎng)站的內(nèi)容,該網(wǎng)站位於MySQL數(shù)據(jù)庫中的一個或多個表中,該數(shù)據(jù)庫僅了解如何響應(yīng)SQL查詢(命令)。

        >如上圖所示,PHP腳本語言是說兩種語言的介於之間。它處理頁面請求並使用SQL查詢從MySQL數(shù)據(jù)庫中獲取數(shù)據(jù),就像您用來在第3章中創(chuàng)建笑話表的數(shù)據(jù)庫一樣。然後,它隨著瀏覽器期望的良好格式的HTML頁面而動態(tài)地吐出它。 >

        >使您清楚地清楚,這是當(dāng)您網(wǎng)站上的訪問者的訪問者時,會發(fā)生什麼:

        1. 訪問者的Web瀏覽器從您的Web服務(wù)器請求網(wǎng)頁。 >
        2. > Web服務(wù)器軟件(通常是Apache或nginx)識別請求的文件是PHP腳本,因此服務(wù)器啟動PHP解釋器以執(zhí)行文件中包含的代碼。
        3. >
        4. 某些php命令(將是本章的焦點)連接到MySQL數(shù)據(jù)庫,並請求屬於網(wǎng)頁中的內(nèi)容。
        5. MySQL數(shù)據(jù)庫通過將請求的內(nèi)容髮送到PHP腳本來響應(yīng)。
        6. 。 PHP腳本將內(nèi)容存儲到一個或多個PHP變量中,然後使用Echo語句作為網(wǎng)頁的一部分輸出內(nèi)容。
        7. PHP解釋器通過將其創(chuàng)建給Web服務(wù)器的HTML的副本傳遞到結(jié)束。 Web服務(wù)器將HTML發(fā)送到Web瀏覽器,因為它將是一個普通的HTML文件,除了不是直接來自HTML文件,該頁面是PHP解釋器提供的輸出。但是,瀏覽器無法知道這一點。就瀏覽器而言,它像其他任何人一樣請求和接收網(wǎng)頁。
        8. >
        9. 創(chuàng)建mySQL用戶帳戶
        10. 為了使PHP連接到您的MySQL數(shù)據(jù)庫服務(wù)器,它將需要使用用戶名和密碼。到目前為止,您的笑話數(shù)據(jù)庫所包含的所有內(nèi)容都是許多Pithy ,但是不久之後,它可能包含敏感信息,例如電子郵件地址和有關(guān)您網(wǎng)站用戶的其他私人詳細(xì)信息。因此,MySQL的設(shè)計為非常安全,使您可以嚴(yán)格控制其將接受的連接以及這些連接可以做什麼。
        >

        docker環(huán)境已經(jīng)在第3章中包含了MySQL用戶,您已經(jīng)用來登錄MySQL Server。

        >您可以使用相同的用戶名(v.je)和密碼(v.je)從您的PHP腳本連接到數(shù)據(jù)庫,但是創(chuàng)建一個新帳戶很有用- 因為如果您有一個Web服務(wù)器,您可能需要使用它託管多個網(wǎng)站。通過為每個網(wǎng)站提供自己的用戶帳戶,您將獲得更多控制誰可以訪問任何給定網(wǎng)站的數(shù)據(jù)。如果您與其他開發(fā)人員一起工作,則可以讓他們訪問他們正在開發(fā)的網(wǎng)站,但不再使用。

        > >您應(yīng)該創(chuàng)建一個新的用戶帳戶,只有在您的網(wǎng)站依賴的IJDB數(shù)據(jù)庫上使用的特定特權(quán)。讓我們現(xiàn)在就這樣做。

        創(chuàng)建用戶,打開MySQL Workbench並連接到您的服務(wù)器。然後運行以下查詢:

        CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
        GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
        

        第一個查詢是相當(dāng)自我解釋的:它創(chuàng)建了一個名為ijdbuser的用戶,並使用密碼myPassword。用戶名之後的%符號表示數(shù)據(jù)庫可以從任何位置連接到。第二個查詢可為用戶提供完整的IJDB架構(gòu),因此該用戶可以在IJDB架構(gòu)中查看並修改所有表,列和數(shù)據(jù),但無法訪問其外部任何內(nèi)容。

        >現(xiàn)在已經(jīng)創(chuàng)建了用戶ijdbuser,我們可以使用它連接到數(shù)據(jù)庫。可以與此用戶在MySQL Workbench中建立連接,但是由於權(quán)限有限,因此最好使用V.JE帳戶來保持MySQL Workbench。相反,我們將在從PHP腳本連接時使用新用戶。 >

        >使用php

        連接到mySQL 在您可以從MySQL數(shù)據(jù)庫中檢索內(nèi)容以包含在網(wǎng)頁中之前,您必須知道如何從PHP腳本內(nèi)部建立與MySQL的連接。到目前為止,您已經(jīng)使用了一個名為MySQL Workbench的應(yīng)用程序來連接到您的數(shù)據(jù)庫。就像MySQL Workbench可以直接連接到運行的MySQL Server一樣,您自己的PHP腳本也可以。 >

        >儘管本章完全討論了從PHP連接到MySQL,但實際上我們正在連接到上一章中討論的MARIADB數(shù)據(jù)庫。 PHP在MySQL和Mariadb之間看不到任何區(qū)別,因為它們是可以互換的。在整個過程中,我都將數(shù)據(jù)庫稱為MySQL,因為所有使用的命令都可以用於連接到MySQL或MariadB數(shù)據(jù)庫服務(wù)器。 >

        >原始的MySQL數(shù)據(jù)庫為

        >客戶端提供了標(biāo)準(zhǔn)化的方法,例如MySQL Workbench和PHP,以與服務(wù)器進(jìn)行通信。 Mariadb複製了該標(biāo)準(zhǔn),PHP中的所有命令都使用名稱

        mysql

        ,因此,為了保持簡單,我將在本章中使用術(shù)語

        > mysql

        來參考數(shù)據(jù)庫。 有三種從php連接到MySQL Server的方法:> mysql庫

        > mysqli庫

        pdo庫
        • >這些基本上都在做同樣的工作 - 連接到數(shù)據(jù)庫並向其發(fā)送查詢 - 但他們使用不同的代碼來實現(xiàn)它。
        • > MySQL庫是連接到數(shù)據(jù)庫的最古老的方法,並在PHP 2.0中引入。它包含的功能很小,並且被Mysqli取代了PHP 5.0(2004年發(fā)行)。
        • 使用舊的MySQL庫來連接和查詢數(shù)據(jù)庫,使用了MySQL_Connect()和MySQL_Query()等函數(shù)。自PHP 5.5以來,這些功能已被棄用 - 意味著應(yīng)避免它們,並且自PHP 7.0以來已完全從PHP中刪除。

          >儘管大多數(shù)開發(fā)人員在發(fā)布PHP 5.0後立即看到了發(fā)生變化的原因,但儘管有實際上已經(jīng)有效地是MySqli,但現(xiàn)在使用這些現(xiàn)在不存在的MySQL_*功能,網(wǎng)絡(luò)上仍有數(shù)百個文章和代碼示例。首選的圖書館已有十五年。

          >遇到一個包含LINE MYSQL_CONNECT()的代碼示例,請檢查文章的日期。大概是從2000年代初開始,在編程中,您永遠(yuǎn)不應(yīng)該相信任何古老的東西。事情一直在改變 - 這就是為什麼這本書在其第七版中!

          > 在PHP 5.0中,MySQLI庫(代表“ MySQL改進(jìn)”)被釋放,以解決原始MySQL庫中的某些局限性。您可以輕鬆地識別MySQLI的使用,因為代碼將使用諸如mysqli_connect()和mysqli_query()。 在PHP 5.0中發(fā)布MySQLI庫後不久,PHP 5.1發(fā)行了,並進(jìn)行了大量更改,有助於塑造我們今天編寫PHP的方式(主要是針對對象的編程,您會看到的本書的後期很多) 。 PHP 5.1的主要變化之一是它引入了第三個庫PDO(PHP數(shù)據(jù)對象),用於連接MySQL數(shù)據(jù)庫。 PDO和MySQLI之間存在幾個區(qū)別,但主要的是您可以使用PDO庫將幾乎所有數(shù)據(jù)庫服務(wù)器連接到任何數(shù)據(jù)庫服務(wù)器(例如Oracle Server或Microsoft SQL Server)。對於開發(fā)人員而言,這種通用方法的最大優(yōu)勢是,一旦您學(xué)習(xí)瞭如何使用庫與MySQL數(shù)據(jù)庫進(jìn)行交互,那麼與另一家數(shù)據(jù)庫服務(wù)器進(jìn)行交互非常簡單。 可以說,為PDO編寫代碼更簡單,並且有些細(xì)微差別可以使PDO代碼更可讀性 - 準(zhǔn)備好語句中的參數(shù)為主要好處。 (不用擔(dān)心,我將稍後解釋這意味著什麼。)

          >

          由於這些原因,最近的PHP項目使用PDO庫,這是我將向您展示如何在本書中使用的庫。有關(guān)差異的更多信息,請查看SitePoint文章“重新引入PDO - 正確訪問PHP數(shù)據(jù)庫的正確方法”。

          >在那段小歷史課之後,您可能渴望回到編寫代碼。這是您使用PDO建立與MySQL Server的連接的方式:

          >

          >目前,將新的PDO視為內(nèi)置功能,就像我們在第2章中使用的RAND函數(shù)一樣。如果您在想“嘿,函數(shù)在他們的範(fàn)圍內(nèi)就不可能具有> space

          名字!”,您比普通的熊聰明,我將在稍後確切地說明這裡發(fā)生了什麼。無論如何,它需要三個參數(shù):

          • >一個字符串指定數(shù)據(jù)庫類型(mysql :),服務(wù)器的主機名(host = hostName;)和數(shù)據(jù)庫的名稱(dbname = database)
          • >
          • > MySQL用戶名,您希望PHP使用
          • 該用戶名的mySQL密碼
          • >您可能還記得從第2章中記得,PHP功能通常在調(diào)用時返回值。這個新的PDO“函數(shù)”返回一個稱為PDO對象的值,該值標(biāo)識已建立的連接。由於我們打算利用連接,因此我們應(yīng)該通過將其存儲在變量中來保留此值。這是看起來的樣子,填寫了必要的值以連接到您的數(shù)據(jù)庫:>

          >您可能可以查看最後兩個參數(shù)的情況:它們是您本章之前創(chuàng)建的用戶名和密碼。

          >
          CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
          GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
          
          第一個論點有點複雜。 dbName = ijdb part告訴PDO使用數(shù)據(jù)庫(也稱為a

          架構(gòu)

          ),稱為ijdb。從PHP運行的任何查詢都將默認(rèn)為該模式中的表。從笑話中選擇 * *將從ijdb架構(gòu)中的笑話表中選擇記錄。

          > >即使您已經(jīng)熟悉PHP,PDO和MySQL,主機= mysql部分看起來令人困惑。通常,這將是host = localhost(參考本地計算機,運行php的同一臺計算機)或指向數(shù)據(jù)庫所在的特定域名,例如host = sitepoint.com。 為什麼它是主機= mysql,MySQL在這裡指的是什麼?在docker中,每個

          >服務(wù)

          被賦予一個名稱。如果您檢查配置服務(wù)器的Docker-compose.yml文件,則數(shù)據(jù)庫服務(wù)稱為MySQL,在Docker中,一個服務(wù)可以使用另一個服務(wù)的名稱連接到另一個服務(wù)。 除了參數(shù)之外,這裡重要的是,新PDO返回的值存儲在名為$ pdo的變量中。

          > MySQL Server是與Web服務(wù)器完全獨立的軟件。因此,我們必須考慮由於網(wǎng)絡(luò)中斷而導(dǎo)致服務(wù)器可能無法使用或無法訪問的可能性,或者因為您提供的用戶名/密碼組合被服務(wù)器拒絕,或者是因為您只是忘記啟動MySQL Server!在這種情況下,新的PDO不會運行,並且會拋出PHP例外。 > >

          注意:至少在默認(rèn)情況下,可以配置PHP,以使其無例外,並且根本不會連接。這通常不是理想的行為,因為它使得弄清楚出了什麼問題變得更加困難。

          >如果您想知道“拋出PHP例外”意味著什麼,請自己做好準(zhǔn)備!您將要發(fā)現(xiàn)PHP語言的更多功能。

          > php例外是當(dāng)您告訴PHP執(zhí)行任務(wù)並且無法執(zhí)行任務(wù)時,會發(fā)生什麼。 PHP會嘗試做所講的事情,但會失??;為了告訴您失敗,它會給您帶來例外。一個例外僅僅是PHP僅帶有特定的錯誤消息崩潰。當(dāng)拋出例外時,PHP停止。將執(zhí)行錯誤之後沒有代碼行。

          >

          作為負(fù)責(zé)任的開發(fā)人員,您的工作是捕獲該異常並做些事情以使程序可以繼續(xù)。

          >

          注意:如果您沒有捕獲異常,則PHP將停止運行您的PHP腳本並顯示出驚人的醜陋錯誤消息。該錯誤消息甚至?xí)沂灸_本的代碼,這些代碼引發(fā)了錯誤。在這種情況下,該代碼包含您的MySQL用戶名和密碼,因此避免用戶看到的錯誤消息尤其重要! 為了捕獲異常,您應(yīng)該包圍可能會嘗試嘗試的代碼。

          >您可以嘗試一個嘗試…像if…else語句一樣捕獲語句,除了第二個代碼塊是第一個代碼無法運行的情況。

          >困惑了嗎?我知道我正在向您扔很多新概念(沒有雙關(guān)語),但是如果我把它們放在一起並向您展示我們擁有的東西,那將是更有意義的:

          CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
          GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
          
          如您所見,此代碼是一個嘗試…catch語句。在頂部的嘗試塊中,我們嘗試使用新PDO連接到數(shù)據(jù)庫。如果成功成功,我們將所得的PDO對象存儲在$ PDO中,以便我們可以使用新的數(shù)據(jù)庫連接。如果連接成功,則將$輸出變量設(shè)置為稍後顯示的消息。

          >重要的是,在嘗試……捕獲語句中,拋出異常後的任何代碼都不會被執(zhí)行。在這種情況下,如果連接到數(shù)據(jù)庫會引發(fā)異常(也許密碼是錯誤的,或者服務(wù)器未響應(yīng)),則$輸出變量永遠(yuǎn)不會設(shè)置為“已建立數(shù)據(jù)庫連接”。

          如果我們的數(shù)據(jù)庫連接嘗試失敗,PHP將拋出PDOException,這是新PDO投擲的例外類型。因此,我們的捕獲塊說,它將捕獲PdoException(並將其存儲在名為$ e的變量中)。在該塊內(nèi)部,我們設(shè)置了變量$輸出以包含有關(guān)出了什麼問題的消息。

          > 但是,此錯誤消息並不是特別有用。它告訴我們的只是PDO無法連接到數(shù)據(jù)庫服務(wù)器。最好有一些有關(guān)為什麼這樣的信息 - 例如,因為用戶名和密碼無效。

          >
          new PDO('mysql:host=hostname;dbname=database', 'username',
            'password')
          
          $ e變量包含有關(guān)發(fā)生的異常的詳細(xì)信息,包括描述問題的錯誤消息。我們可以使用串聯(lián)將其添加到輸出變量:

          CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
          GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
          

          >注意:$ e變量不是字符串,而是對象。我們將不久的將來意味著什麼。但是,目前,您需要知道的是,代碼$ e-> getMessage()基於發(fā)生的特定異常獲取錯誤消息。 > if…else語句,一個嘗試的兩個分支之一…catch語句可以運行。 TRY塊中的代碼將成功執(zhí)行,或者捕獲塊中的代碼將運行。不管數(shù)據(jù)庫連接是否成功,$輸出變量中都會有一條消息 - 錯誤消息或說明連接成功的消息。

          >最後,無論嘗試塊是成功的還是捕獲塊運行,都包括模板輸出。 html.php。這是一個通用模板,僅在頁面上顯示一些文本:

          >

          可以在示例中找到完整的代碼:mysql-connect。

          >
          new PDO('mysql:host=hostname;dbname=database', 'username',
            'password')
          
          當(dāng)包含模板時,它將顯示錯誤消息或“建立數(shù)據(jù)庫連接”消息。

          我希望上述代碼現(xiàn)在對您有意義。隨意回到本節(jié)的開始,如果您迷路了,請再次閱讀全部,因為其中有一些棘手的概念。但是,一旦您對代碼有堅定的抓地力,您可能會意識到,我仍然留下了一個無法解釋的神秘:PDOS。新的PDO到底是什麼,當(dāng)我說它返回一個“ PDO對象”時,一個對像到底是什麼?

          >

          >

          注意:所有下載的示例代碼都包含一個名為ijdb_sample的架構(gòu)和一個稱為ijdb_sample的用戶,以便您能夠運行它,無論您所謂的架構(gòu)和用戶如何。將包含數(shù)據(jù)庫的文件作為數(shù)據(jù)庫.sql提供,您可以導(dǎo)入。

          >

          如果您使用提供的基於Web的示例代碼查看器,則在加載示例時將創(chuàng)建IDBJ_Sample數(shù)據(jù)庫,但是當(dāng)您查看另一個示例時,該模式的任何更改都將丟失。 (您可以弄亂事情,然後切換到另一個樣本並將其重置,但是如果要保留任何更改,請將它們製作在您創(chuàng)建的模式中。) 如果要使用MySQL Workbench將示例數(shù)據(jù)加載到您的架構(gòu)中,請通過選擇數(shù)據(jù)導(dǎo)入/還原來從項目目錄中導(dǎo)入database.sql。然後從獨立文件中選擇導(dǎo)入,瀏覽到database.sql,然後在默認(rèn)目標(biāo)架構(gòu)中選擇您的架構(gòu)名稱。如果您創(chuàng)建了任何具有相同名稱的表格,它們將被覆蓋並且所有記錄都丟失了。

          >面向?qū)ο蟮木幊讨械乃俪烧n程 >您可能已經(jīng)註意到“對象”一詞開始在上一節(jié)中滲入我的詞彙。 PDO是php數(shù)據(jù)

          對象

          擴展,而新的PDO返回PDO對象。在本節(jié)中,我想解釋哪些對像是有意義的。

          >

          >也許您在自己的PHP或編程中遇到了術(shù)語面向?qū)ο蟮木幊蹋∣OP)。 OOP是一種先進(jìn)的編程風(fēng)格,特別適合用很多部分構(gòu)建真正複雜的程序。當(dāng)今有效使用中的大多數(shù)編程語言都支持OOP。他們中的一些人甚至需要您才能以O(shè)OP風(fēng)格工作。 PHP對此有些隨和,並將其歸納為開發(fā)人員,以決定是否以O(shè)OP樣式編寫腳本。 > 到目前為止,我們已經(jīng)以一種更簡單的樣式編寫了PHP代碼,稱為Procationural編程,現(xiàn)在我們將繼續(xù)這樣做,以後更詳細(xì)地查看對象。程序風(fēng)格非常適合我們目前正在處理的相對簡單的項目。但是,幾乎所有復(fù)雜的項目都會遇到OOP,我將在本書稍後更詳細(xì)地介紹它。

          也就是說,我們將用來連接並使用MySQL數(shù)據(jù)庫的PDO擴展名是以面向?qū)ο蟮木幊虡邮皆O(shè)計的。這意味著,我們必須首先創(chuàng)建一個將代表我們的數(shù)據(jù)庫連接的pdo ,而不是簡單地調(diào)用函數(shù)連接到mySQL,然後調(diào)用其他使用該連接的功能,然後使用該對象可以與數(shù)據(jù)庫一起使用。

          創(chuàng)建對像很像調(diào)用函數(shù)。實際上,您已經(jīng)看過如何做:

          > >新關(guān)鍵字告訴PHP您要創(chuàng)建一個新對象。然後,您離開空間並指定一個類名稱,該名稱告訴PHP您要創(chuàng)建哪種類型的對象。一類是PHP將遵循的一組指令來創(chuàng)建對象。您可以將班級視為食譜,例如蛋糕,而物體是遵循食譜產(chǎn)生的實際蛋糕。不同的類可以產(chǎn)生不同的物體,就像不同的食譜可以產(chǎn)生不同的菜餚一樣。 當(dāng)PHP帶有可以調(diào)用的一堆內(nèi)置功能時,PHP帶有可以從中創(chuàng)建對象的類庫。因此,新的PDO告訴PHP創(chuàng)建一個新的PDO對象 - 即內(nèi)置PDO類的新對象。

          在PHP中,對像是一個值,就像字符串,數(shù)字或數(shù)組一樣。您可以將對象存儲在變量中,也可以將其作為參數(shù)傳遞給函數(shù) - 所有與其他PHP值相同的事情。但是,對象具有一些有用的其他功能。

          >

          首先,一個對象的行為與數(shù)組相似,因為它充當(dāng)了其他值的容器。正如我們在第2章中看到的那樣,您可以通過指定其索引來訪問數(shù)組內(nèi)部的值(例如,$生日['Kevin'])。當(dāng)涉及對象時,概念相似,但名稱和代碼不同。我們不是訪問存儲在數(shù)組索引中的值,而是說我們正在訪問對象的屬性。我們使用箭頭符號( - >) - 例如,$ myObject-> someproperty:>

          CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
          GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
          
          >通常用於存儲 samely

          值的列表(例如生日的數(shù)組),而對象則用於存儲>相關(guān)>值的列表(例如,例如,數(shù)據(jù)庫連接的屬性)。不過,如果這是所有對像都可以的,那麼它們對它們沒有太大的意義:我們可能會使用一個數(shù)組來存儲這些值,對嗎?當(dāng)然,對象會做更多的。 除了存儲屬性及其值集合外,對像還可以包含一組函數(shù),旨在帶來更多有用的功能。存儲在對像中的函數(shù)稱為一種方法(如果您問我,編程世界中更令人困惑的名稱之一)。方法只是類中的功能。更令人困惑的是,當(dāng)我們開始編寫自己的課程時,使用函數(shù)關(guān)鍵字定義方法!即使是經(jīng)驗豐富的開發(fā)人員,也經(jīng)常錯誤地使用函數(shù)

          方法互換。 要調(diào)用一種方法,我們再次使用箭頭符號 - $ myobject-> somemethod():>

          就像獨立函數(shù)一樣,方法可以採用參數(shù)並返回值。 > 在此階段,這聽起來可能有些複雜且毫無意義,但是請相信我:將變量集合(屬性)和函數(shù)(方法)集中在一起,稱為對象的小捆綁包,會導(dǎo)致更加整潔,更易於閱讀某些任務(wù)的代碼- 與數(shù)據(jù)庫一起工作只是其中之一。有一天,您甚至可能想開發(fā)可以使用的自定義類,以創(chuàng)建自己設(shè)計的對象。

          > 但是,目前,我們將堅持使用PHP隨附的類。讓我們繼續(xù)使用我們創(chuàng)建的PDO對象,並通過調(diào)用其方法之一來查看我們可以做什麼。

          >
          new PDO('mysql:host=hostname;dbname=database', 'username',
            'password')
          
          配置連接

          到目前為止,我向您展示瞭如何創(chuàng)建PDO對像以與您的MySQL數(shù)據(jù)庫建立連接,以及當(dāng)出現(xiàn)問題時如何顯示有意義的錯誤消息:

          但是,假設(shè)連接成功,則需要在使用之前對其進(jìn)行配置。您可以通過調(diào)用新PDO對象的某些方法來配置連接。

          >在將查詢發(fā)送到數(shù)據(jù)庫之前,我們需要配置數(shù)據(jù)庫連接的字符編碼。正如我在第2章中簡要提到的那樣,您應(yīng)該在網(wǎng)站中使用UTF-8編碼的文本,以最大程度地提高用戶在填寫網(wǎng)站上表格時可以使用的字符範(fàn)圍。默認(rèn)情況下,當(dāng)PHP連接到MySQL時,它使用更簡單的ISO-8859-1(或Latin-1)編碼而不是UTF-8。如果我們要保持原樣,我們將無法輕易插入中文,阿拉伯語或大多數(shù)英語角色。

          >

          >即使您100%確定您的網(wǎng)站只能由英語說話者使用,但沒有設(shè)置角色集引起的其他問題。如果您的網(wǎng)頁未設(shè)置為UTF-8,那麼當(dāng)人們將某些字符(例如捲曲引號)寫入文本框時,您會遇到問題,因為它們會以不同的字符出現(xiàn)在數(shù)據(jù)庫中。

          因此,我們現(xiàn)在需要設(shè)置我們的新PDO對像以使用UTF-8編碼。

          >我們可以指示PHP通過附加; charset = utf8mb4詢問數(shù)據(jù)庫時使用UTF-8。只要您的PHP腳本也以UTF-8發(fā)送到瀏覽器(這是最近的PHP版本中的默認(rèn)值):>

          >

          注意:如果您去搜索,您會找到不同的方法來設(shè)置Charset,並且本書的早期版本指示您使用此代碼:
          CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
          GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
          

          這是因為在PHP 5.3.6之前,PHP無法正確應(yīng)用Charset選項。由於您實際上要使用的任何PHP版本都解決了這一點,因此將Charset設(shè)置為連接字符串的一部分是首選選項。 我們用來連接到mySQL的完整代碼,然後配置該連接,如下所示。

          >
          new PDO('mysql:host=hostname;dbname=database', 'username',
            'password')
          
          >示例:mysql-connect-complete

          >在您的瀏覽器中啟動此示例。 (如果您將數(shù)據(jù)庫代碼放入index.php中的public Directory和output.html.php文件中的模板目錄中,則頁面的URL為https://v.je/。)

          >如果您的服務(wù)器啟動並運行,並且一切正常,則應(yīng)看到一條表示成功的消息。

          >

          $pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
            'mypassword');
          
          >如果PHP無法連接到您的MySQL Server,或者提供的用戶名和密碼不正確,則將看到與下面顯示的類似屏幕。為了確保您的錯誤處理代碼正常運行,您可能需要故意拼寫密碼以測試它。

          >多虧了我們的捕獲塊,數(shù)據(jù)庫中的錯誤消息已包含在頁面上:在網(wǎng)絡(luò)上顯示MySQL的數(shù)據(jù):簡介

          CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
          GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
          

          方法getMessage()返回一條消息,描述發(fā)生的異常。還有一些其他方法(包括getFile()和getline())用於返回拋出異常的文件名和行號。您可以生成一個非常詳細(xì)的錯誤消息:

          new PDO('mysql:host=hostname;dbname=database', 'username',
            'password')
          

          >如果您有一個包含數(shù)十個文件的大型網(wǎng)站,這將非常有用。錯誤消息將準(zhǔn)確地告訴您要查看哪個文件以及錯誤在哪一行中。

          如果您很好奇,請嘗試在數(shù)據(jù)庫連接代碼中插入其他一些錯誤(例如,拼寫錯誤的數(shù)據(jù)庫名稱),並觀察結(jié)果的詳細(xì)錯誤消息。完成後,數(shù)據(jù)庫連接正常工作,請返回簡單的錯誤消息。這樣,如果您的數(shù)據(jù)庫服務(wù)器出現(xiàn)了真正的問題,您的訪問者就不會被技術(shù)gobbledygook轟炸。

          >

          >有了建立的連接並選擇了數(shù)據(jù)庫,您就可以開始使用存儲在數(shù)據(jù)庫中的數(shù)據(jù)。

          >

          >您可能想知道腳本完成執(zhí)行後,與MySQL Server的連接會發(fā)生什麼。如果您真的願意,則可以通過丟棄代表您連接的PDO對象來強迫PHP與服務(wù)器斷開連接。您可以通過設(shè)置包含對象為null的變量來做到這一點:

          > 也就 >使用php

          發(fā)送SQL查詢 在第3章中,我們使用MySQL Workbench連接到MySQL數(shù)據(jù)庫服務(wù)器,這使我們能夠鍵入SQL查詢(命令)並立即查看這些查詢的結(jié)果。 PDO對象提供了類似的機制 - EXEC方法:
          $pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
            'mypassword');
          

          >在這裡,$ QUERY是一個字符串,包含您要執(zhí)行的任何SQL查詢。 > 如您所知,如果執(zhí)行查詢存在問題(例如,如果您在SQL查詢中犯了打字錯誤),則此方法將為您添加PDOException供您捕獲。 >

          考慮以下示例,該示例試圖產(chǎn)生我們在第3章中創(chuàng)建的笑話表

          >示例:mysql-create

          請注意,我們使用相同的嘗試…捕獲語句技術(shù)來處理查詢產(chǎn)生的可能的錯誤??梢允褂枚啻螄L試…捕獲塊顯示不同的錯誤消息 - 一條用於連接,其中一條用於查詢 - 但這可能會導(dǎo)致相當(dāng)多的額外代碼。
          try {
            ? do something risky
          }
          catch (ExceptionType $e) {
            ? handle the exception
          }
          
          > 相反,我選擇使用相同的嘗試語句來包含連接和查詢。嘗試…捕獲塊一旦發(fā)生錯誤就會停止執(zhí)行代碼,因此,如果在數(shù)據(jù)庫連接期間發(fā)生錯誤,則$ pdo-> exec($ run)行將永遠(yuǎn)不會運行,以確保如果將查詢發(fā)送到數(shù)據(jù)庫,必須建立連接。

          >這種方法使我們對顯示的錯誤消息的控制權(quán)更少,但是節(jié)省了每個數(shù)據(jù)庫操作的鍵入語句。在本書的稍後,我們將將它們分解為不同的塊,但就目前而言,將所有數(shù)據(jù)庫操作保留在同一嚐試塊中。

          此示例還使用GetMessage方法從MySQL Server檢索詳細(xì)的錯誤消息。下圖顯示了例如,笑話表已經(jīng)存在時顯示的錯誤。

          >

          在網(wǎng)絡(luò)上顯示MySQL的數(shù)據(jù):簡介 對於刪除,插入和更新查詢(用於修改存儲的數(shù)據(jù)),EXEC方法返回受查詢影響的表行(條目)的數(shù)量??紤]以下SQL命令,我們在第3章中使用的命令來設(shè)置包含“程序員”一詞的所有笑話的日期。

          >

          >示例:mysql-update

          >通過存儲從$ aventedrows中的Exec方法返回的值,我們可以在$ output變量中使用變量在模板中打印。 >
          CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
          GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
          
          下圖顯示了此示例的輸出,假設(shè)您的數(shù)據(jù)庫中只有一個“程序員”笑話。

          >如果您刷新頁面以再次運行相同的查詢,則應(yīng)看到消息更改,如下圖所示。這表明沒有排的更新,因為將新日期應(yīng)用於笑話與現(xiàn)有日期相同。 在網(wǎng)絡(luò)上顯示MySQL的數(shù)據(jù):簡介

          >選擇的查詢對待有所不同,因為它們可以檢索大量數(shù)據(jù),而PHP提供了處理該信息的方法。

          > 在網(wǎng)絡(luò)上顯示MySQL的數(shù)據(jù):簡介>處理選擇結(jié)果集

          對於大多數(shù)SQL查詢,EXEC方法工作正常。該查詢對您的數(shù)據(jù)庫有所作為,您會從方法的返回值中獲得受影響的行(如果有)。但是,選擇查詢需要比執(zhí)行更奇特的東西。您會記得,精選查詢用於在數(shù)據(jù)庫中查看存儲的數(shù)據(jù)。 SELECT查詢不僅只影響數(shù)據(jù)庫,還具有結(jié)果 - 我們需要一種返回它們的方法。

          查詢方法看起來就像EXEC一樣,因為它接受SQL查詢作為要發(fā)送到數(shù)據(jù)庫服務(wù)器的參數(shù)。但是,它返回的是一個pdostatement對象,它表示一個結(jié)果集,其中包含從查詢中返回的所有行(條目)的列表:

          >

          提供處理查詢時沒有遇到錯誤,該代碼將將結(jié)果集(以Pdostatement對象的形式)存儲到變量$結(jié)果中。此結(jié)果集包含笑話表中存儲的所有笑話的文字。由於數(shù)據(jù)庫中的笑話數(shù)量沒有實際限制,因此結(jié)果集可能很大。

          >

          >我在第2章中提到,當(dāng)我們需要循環(huán)時,while循環(huán)是一個有用的控制結(jié)構(gòu),但不知道多少次。我們不能將循環(huán)使用,因為我們不知道返回的查詢有多少記錄。實際上,您可以在此處使用一段時間循環(huán)來處理結(jié)果的行一次設(shè)置:

          CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
          GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
          
          while循環(huán)的條件可能與您習(xí)慣的條件有所不同,因此讓我解釋一下它的工作原理。將條件本身視為陳述:

          new PDO('mysql:host=hostname;dbname=database', 'username',
            'password')
          
          pdostatement對象的獲取方法將結(jié)果集中的下一行返回為數(shù)組(我們在第2章中討論了數(shù)組)。當(dāng)結(jié)果集中沒有更多的行時,F(xiàn)etch返回false。 (這是一種要求pdo對像做某件事的情況 - 因為結(jié)果集中沒有行剩下時,fetch不能返回下一行 - 將

          > not 。 現(xiàn)在,上面的語句將值分配給$ ROW變量,但同時,該語句總體上具有相同的值。這就是讓您在循環(huán)中使用該語句作為條件的原因。由於段循環(huán)將繼續(xù)循環(huán)直到其條件評估為false,因此此循環(huán)將與結(jié)果集中的行一樣多次發(fā)生,每次循環(huán)執(zhí)行時,$ row都會佔據(jù)下一行的值。每次循環(huán)運行時,剩下的所有要弄清楚的是如何從$行變量中檢索值。

          > 由Fetth返回的結(jié)果集的

          行表示為關(guān)聯(lián)陣列,其指數(shù)以結(jié)果集中的表列命名。如果我們的結(jié)果集中$ row是一行,則$ row ['joketext']是該行的joketext列中的值。

          >我們在此代碼中的目標(biāo)是存儲所有笑話的文本,以便我們可以將其顯示在PHP模板中。最好的方法是將每個笑話作為新項目存儲在數(shù)組中,

          >隨著笑話從數(shù)據(jù)庫中撤出,我們現(xiàn)在可以將它們傳遞到PHP模板笑話.html.php。

          總而言之,這是到目前為止的控制器的代碼:
          $pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
            'mypassword');
          
          >

          $笑話變量是存儲笑話列表的數(shù)組。如果您在PHP中寫下了數(shù)組的內(nèi)容,則看起來像這樣:

          但是,數(shù)據(jù)已從數(shù)據(jù)庫中檢索到數(shù)據(jù),而不是在代碼中手動輸入。

          >您會注意到,設(shè)置了兩個不同的變量 - $笑話和$錯誤 - 具體取決於是否成功執(zhí)行了Try Block。 在jokes.html.php模板中,我們需要顯示$ jokes數(shù)組的內(nèi)容或$錯誤變量中包含的錯誤消息。

          >檢查是否已分配了一個變量,我們可以使用以前使用的ISSET函數(shù)來檢查是否已提交表單。該模板可以包括一個if語句以確定是顯示錯誤還是笑話列表:>

          CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
          GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
          
          >這裡沒有什麼新的,但是要顯示笑話,我們需要顯示$笑話陣列的內(nèi)容。與我們使用的其他變量不同,到目前為止,$ jokes數(shù)組不僅包含一個值。

          >

          處理PHP中數(shù)組的最常見方法是使用循環(huán)。我們已經(jīng)在循環(huán)和循環(huán)時已經(jīng)看到。 foreach循環(huán)特別有助於處理數(shù)組:

          new PDO('mysql:host=hostname;dbname=database', 'username',
            'password')
          
          而不是條件,括號在foreach循環(huán)的頂部包含一個數(shù)組,然後是關(guān)鍵字為AS,然後是新變量的名稱,該名稱將用於依次存儲數(shù)組的每個項目。然後,為陣列中的每個項目執(zhí)行循環(huán)的主體。每當(dāng)該項目存儲在指定變量中,以便代碼可以直接訪問它。

          >

          >通常,在php模板中使用foreach循環(huán)依次顯示陣列的每個項目。這可能是如何尋找我們的$笑話陣列的方式:

          $pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
            'mypassword');
          
          >使用PHP代碼的這種混合物來描述循環(huán)和HTML代碼以顯示它,代碼看起來不整潔。因此,通常使用另一種方法來編寫模板中的foreach循環(huán):

          >

          try {
            ? do something risky
          }
          catch (ExceptionType $e) {
            ? handle the exception
          }
          
          >這兩個代碼在功能上是相同的,但是與HTML代碼混合時,後者看起來更友好。這是代碼的這種形式在模板中的外觀:

          > if語句可以完成同樣的事情,通過避免括號來查看內(nèi)部HTML模板內(nèi)部更好。
          try {
            $pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
              ’mypassword’);
            $output = 'Database connection established.';
          }
          catch (PDOException $e) {
            $output = 'Unable to connect to the database server.';
          }
          
          include  __DIR__ . '/../templates/output.html.php';
          

          >使用這些新工具,我們可以編寫模板以顯示笑話的列表。

          try {
            $pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
              'mypassword');
             $output = 'Database connection established.';
          }
          catch (PDOException $e) {
            $output = 'Unable to connect to the database server: ' . $e->getMessage();
          }
          
          include  __DIR__ . '/../templates/output.html.php';
          
          >示例:mysql-listjokes

          $要么在頁面上顯示$錯誤文本,要么在塊引用(

          )中顯示的每個笑話都顯示在段落(

          )中,因為我們在此中有效地引用了每個笑話的作者頁。

          <!doctype html>
          <html>
            <head>
              <meta charset="utf-8">
              <title>Script Output</title>
            </head>
            <body>
                <?php echo $output; ?>
            </body>
          </html>
          
          >由於笑話可能包含可以解釋為HTML代碼的字符(例如,或&),因此我們必須使用htmlspecialchars來確保它們被翻譯成HTML字符實體(即,&lt;&gt;&gt;&gt; &gt;&gt; ;

          下面的圖像顯示了此頁面一旦您在數(shù)據(jù)庫中添加了幾個笑話後的外觀。

          >

          記得我們?nèi)绾卧诳刂破髦惺褂靡粋€時循環(huán)以一次設(shè)置一個行中的行中的行?

          CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
          GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
          
          事實證明,pdostatement對象的行為就像陣列一樣,當(dāng)您將它們傳遞到foreach循環(huán)時。因此,您可以使用foreach循環(huán)而不是while循環(huán)稍微簡化數(shù)據(jù)庫處理代碼:

          >

          new PDO('mysql:host=hostname;dbname=database', 'username',
            'password')
          
          >我將在本書的其餘部分中使用此整形詞。 PHP提供的另一種整潔的工具是調(diào)用Echo命令的速記方式,如您已經(jīng)看到的那樣,我們需要經(jīng)常使用。我們的迴聲陳述看起來像這樣:

          >我們可以使用以下方式:

          >

          這完全是相同的。 $pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser', 'mypassword'); 這是一個使用速記迴聲的更新模板。

          >示例:mysql-listjokes-shorthand

          try {
            ? do something risky
          }
          catch (ExceptionType $e) {
            ? handle the exception
          }
          

          >從此適用時,我將使用速記符號。

          >

          注意:在5.4之前的PHP版本中,此速記符號需要啟用相當(dāng)不常見的PHP設(shè)置,因此出於兼容的原因而勸阻它。使用速記符號可能會導(dǎo)致您的代碼從啟用的服務(wù)器移動到?jīng)]有的服務(wù)器時停止工作。

          >
          try {
            $pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
              ’mypassword’);
            $output = 'Database connection established.';
          }
          catch (PDOException $e) {
            $output = 'Unable to connect to the database server.';
          }
          
          include  __DIR__ . '/../templates/output.html.php';
          
          截至PHP 5.4(因此,您實際上將遇到這些天的任何版本),無論PHP設(shè)置如何。

          提前思考 在我們剛剛查看的示例中,我們創(chuàng)建了一個模板jokes.html.php,其中包含顯示頁面所需的所有HTML。但是,隨著我們網(wǎng)站的增長,我們將添加更多頁面。當(dāng)然,我們當(dāng)然希望人們能夠在網(wǎng)站上添加笑話,我們還需要一個帶有一些介紹性文本的主頁,一個帶有所有者的聯(lián)繫方式的頁面,並且隨著網(wǎng)站的增長,也許甚至可能人們可以登錄到網(wǎng)站的頁面。

          >

          >我在這裡跳了很多,但是考慮到項目的發(fā)展始終值得一提。如果我們應(yīng)用方法,我們只是將jokes.html.php用於其餘模板- addjoke.html.php,home.html.php,contact.html.php,login.html.php等等- 我們'最終有很多重複的代碼。 > 網(wǎng)站上的每個頁面都需要一個模板,看起來像這樣的模板:

          >

          作為程序員,重複代碼是您可以做的最糟糕的事情之一。實際上,程序員通常是指乾燥原則,該原則代表“不要重複自己”。如果您發(fā)現(xiàn)自己重複了代碼的部分,幾乎可以肯定有一個更好的解決方案。

          >

          所有最好的程序員都是懶惰的,重複代碼意味著重複工作。使用此副本/粘貼方法作為模板,該網(wǎng)站非常難以維護(hù)。想像一下,我們要在每個頁面上出現(xiàn)一個頁腳和一個導(dǎo)航部分?,F(xiàn)在,我們的模板看起來像這樣:

          CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
          GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
          

          >我們將在2022年遇到問題!如果網(wǎng)站上所有頁面的模板- 例如,jokes.html.php addjoke.html.php,home.html.php,contact.html.php andlogin.html.php-將版權(quán)通知中的年份更新為“ 2022”,您需要打開每個模板並更改日期。

          >我們可能會很聰明,並從服務(wù)器的時鐘(echo date('y');如果您很好奇!)動態(tài)讀取日期,以避免此問題,但是如果我們想添加<script> tag,該怎麼辦每個頁面都包含在內(nèi)嗎?還是向菜單添加新鏈接?我們?nèi)匀恍枰蜷_每個模板文件並將其更改! </script>

          >

          更改五個或六個模板可能有點煩人,但這不會帶來很多問題。但是,如果網(wǎng)站生長到數(shù)十個或數(shù)百頁,該怎麼辦?每次您想添加鏈接到菜單時,您都必須打開每個模板並更改它。

          這個問題

          可以用一系列包含語句來解決。例如:

          new PDO('mysql:host=hostname;dbname=database', 'username',
            'password')
          
          >但是,這種方法需要千里眼:我們需要準(zhǔn)確地預(yù)測將來可能需要進(jìn)行的更改,並且使用相關(guān)的陳述包括我們預(yù)見的更改的位置。 例如,在上面的示例中,通過將它們添加到nav.html.php中添加新的菜單條目很容易,但是在每個頁面中添加

          熱AI工具

          Undress AI Tool

          Undress AI Tool

          免費脫衣圖片

          Undresser.AI Undress

          Undresser.AI Undress

          人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

          AI Clothes Remover

          AI Clothes Remover

          用於從照片中去除衣服的線上人工智慧工具。

          Clothoff.io

          Clothoff.io

          AI脫衣器

          Video Face Swap

          Video Face Swap

          使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

          熱工具

          記事本++7.3.1

          記事本++7.3.1

          好用且免費的程式碼編輯器

          SublimeText3漢化版

          SublimeText3漢化版

          中文版,非常好用

          禪工作室 13.0.1

          禪工作室 13.0.1

          強大的PHP整合開發(fā)環(huán)境

          Dreamweaver CS6

          Dreamweaver CS6

          視覺化網(wǎng)頁開發(fā)工具

          SublimeText3 Mac版

          SublimeText3 Mac版

          神級程式碼編輯軟體(SublimeText3)

        如何在PHP中實施身份驗證和授權(quán)? 如何在PHP中實施身份驗證和授權(quán)? Jun 20, 2025 am 01:03 AM

        tosecurelyhandleauthenticationandationallizationInphp,lofterTheSesteps:1.AlwaysHashPasswordSwithPassword_hash()andverifyusingspasspassword_verify(),usepreparedStatatementStopreventsqlineptions,andStoreSeruserDatain usseruserDatain $ _sessiveferterlogin.2.implementrole-2.imaccessccsccccccccccccccccccccccccc.

        如何在PHP中安全地處理文件上傳? 如何在PHP中安全地處理文件上傳? Jun 19, 2025 am 01:05 AM

        要安全處理PHP中的文件上傳,核心在於驗證文件類型、重命名文件並限制權(quán)限。 1.使用finfo_file()檢查真實MIME類型,僅允許特定類型如image/jpeg;2.用uniqid()生成隨機文件名,存儲至非Web根目錄;3.通過php.ini和HTML表單限製文件大小,設(shè)置目錄權(quán)限為0755;4.使用ClamAV掃描惡意軟件,增強安全性。這些步驟有效防止安全漏洞,確保文件上傳過程安全可靠。

        PHP中==(鬆散比較)和===(嚴(yán)格的比較)之間有什麼區(qū)別? PHP中==(鬆散比較)和===(嚴(yán)格的比較)之間有什麼區(qū)別? Jun 19, 2025 am 01:07 AM

        在PHP中,==與===的主要區(qū)別在於類型檢查的嚴(yán)格程度。 ==在比較前會進(jìn)行類型轉(zhuǎn)換,例如5=="5"返回true,而===要求值和類型都相同才會返回true,例如5==="5"返回false。使用場景上,===更安全應(yīng)優(yōu)先使用,==僅在需要類型轉(zhuǎn)換時使用。

        如何在PHP( - , *, /,%)中執(zhí)行算術(shù)操作? 如何在PHP( - , *, /,%)中執(zhí)行算術(shù)操作? Jun 19, 2025 pm 05:13 PM

        PHP中使用基本數(shù)學(xué)運算的方法如下:1.加法用 號,支持整數(shù)和浮點數(shù),也可用於變量,字符串?dāng)?shù)字會自動轉(zhuǎn)換但不推薦依賴;2.減法用-號,變量同理,類型轉(zhuǎn)換同樣適用;3.乘法用*號,適用於數(shù)字及類似字符串;4.除法用/號,需避免除以零,並註意結(jié)果可能是浮點數(shù);5.取模用%號,可用於判斷奇偶數(shù),處理負(fù)數(shù)時餘數(shù)符號與被除數(shù)一致。正確使用這些運算符的關(guān)鍵在於確保數(shù)據(jù)類型清晰並處理好邊界情況。

        如何與PHP的NOSQL數(shù)據(jù)庫(例如MongoDB,Redis)進(jìn)行交互? 如何與PHP的NOSQL數(shù)據(jù)庫(例如MongoDB,Redis)進(jìn)行交互? Jun 19, 2025 am 01:07 AM

        是的,PHP可以通過特定擴展或庫與MongoDB和Redis等NoSQL數(shù)據(jù)庫交互。首先,使用MongoDBPHP驅(qū)動(通過PECL或Composer安裝)創(chuàng)建客戶端實例並操作數(shù)據(jù)庫及集合,支持插入、查詢、聚合等操作;其次,使用Predis庫或phpredis擴展連接Redis,執(zhí)行鍵值設(shè)置與獲取,推薦phpredis用於高性能場景,Predis則便於快速部署;兩者均適用於生產(chǎn)環(huán)境且文檔完善。

        我如何了解最新的PHP開發(fā)和最佳實踐? 我如何了解最新的PHP開發(fā)和最佳實踐? Jun 23, 2025 am 12:56 AM

        TostaycurrentwithPHPdevelopmentsandbestpractices,followkeynewssourceslikePHP.netandPHPWeekly,engagewithcommunitiesonforumsandconferences,keeptoolingupdatedandgraduallyadoptnewfeatures,andreadorcontributetoopensourceprojects.First,followreliablesource

        什麼是PHP,為什麼它用於Web開發(fā)? 什麼是PHP,為什麼它用於Web開發(fā)? Jun 23, 2025 am 12:55 AM

        PHPbecamepopularforwebdevelopmentduetoitseaseoflearning,seamlessintegrationwithHTML,widespreadhostingsupport,andalargeecosystemincludingframeworkslikeLaravelandCMSplatformslikeWordPress.Itexcelsinhandlingformsubmissions,managingusersessions,interacti

        如何設(shè)置PHP時區(qū)? 如何設(shè)置PHP時區(qū)? Jun 25, 2025 am 01:00 AM

        tosetTherightTimeZoneInphp,restate_default_timezone_set()functionAtthestArtofyourscriptWithavalIdidentIdentifiersuchas'america/new_york'.1.usedate_default_default_timezone_set_set()

        See all articles