ホームページ >バックエンド開発 >PHPチュートリアル >WebでMySQLからのデータの表示:はじめに
次の記事は、php&mysqlからの抜粋です:Novice to Ninja、7th Edition、プロのWebアプリケーションを構築するために必要なすべてのツール、原則、およびテクニックを学習するための実践ガイドです。シリーズのこの最終チュートリアルでは、MySQLデータベースに保存されている情報を取得し、すべての人が表示されるようにWebページに表示する方法を学びます。
これまでのところ、最初のPHPコードを作成し、リレーショナルデータベースエンジンであるMySQLの基本と、サーバー側のスクリプト言語であるPHPを学びました。
ここで、これらのツールを一緒に使用して、ユーザーがデータベースからデータを表示したり、独自のデータを追加できるWebサイトを作成する方法を学ぶ準備ができています。 注:第3章のように、ここでは「mysql」を使用してデータベースプロトコルを参照しています。あなたのPHPスクリプトは同じことをします。この章には、実際にMariadBデータベースに接続しているにもかかわらず、「mysql」に書くために、PHPコードに記載されている多くの参照があります。
全体像
前進する前に、私たちの究極の目標を明確に描くために一歩後退する価値があります。 PHPスクリプト言語とMySQLデータベースエンジンという2つの強力なツールがあります。これらがどのように合うかを理解することが重要です当社のWebサイトにMySQLを使用する目的は、データベースからコンテンツを動的にプルして、通常のブラウザで表示するためのWebページを作成できるようにすることです。したがって、システムの一端に、Webブラウザーを使用してページをリクエストするためにサイトに訪問者がいます。そのブラウザは、見返りに標準のHTMLドキュメントを受信することを期待しています。もう一方の端には、SQLクエリ(コマンド)に応答する方法のみを理解するMySQLデータベースの1つ以上のテーブルにあるサイトのコンテンツがあります。
ちょうどそれはあなたの心の中ではっきりと新鮮です、これはあなたのウェブサイトのページへの訪問者がいるときに起こることです:
ユーザーを作成するには、MySQLワークベンチを開き、サーバーに接続します。次に、次のクエリを実行します
CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword'; GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
最初のクエリはかなり自明です。パスワードmyPasswordを使用してijdbuserというユーザーを作成します。ユーザー名の後の%記号は、データベースを任意の場所から接続できることを示します。 2番目のクエリでは、ユーザーにIJDBスキーマへの完全なACCEが得られます。その結果、このユーザーはIJDBスキーマのすべてのテーブル、列、データを確認および変更できますが、外部のものにはアクセスできません。
ユーザーijdbuserが作成されたので、それを使用してデータベースに接続できます。このユーザーとのMySQLワークベンチで接続を設定することは可能ですが、許可が限られているため、V.JEアカウントを使用してMySQLワークベンチを維持することをお勧めします。代わりに、PHPスクリプトから接続するときに新しいユーザーを使用します。php
でmysqlに接続しますクライアント
にサーバーと通信するための標準化されたメソッドを提供しました。 Mariadbはその標準をコピーし、PHPのすべてのコマンドは名前mysql
という名前を使用しているため、物事をシンプルに保つために、この章を通してmysql という用語を使用してデータベースを参照します。 phpからmysqlサーバーに接続する方法は3つあります: mysqlライブラリ
mysqliライブラリ
PHP 5.0がリリースされるとすぐに、ほとんどの開発者は変更の理由を見ましたが、MySQLIが事実上されているという事実にもかかわらず、これらの現在存在しないMySQL_*機能を使用してWeb上に何百もの記事とコード例があります。 15年間の優先ライブラリ。
行mysql_connect()を含むコードの例に出くわした場合は、記事の日付を確認してください。それはおそらく2000年代初頭からであり、プログラミングでは、それほど古いものを決して信用すべきではありません。物事は常に変わります - そのため、この本は第7版にあります!
PHP 5.0では、「MySQLの改善」の立場にあるMySQLIライブラリは、元のMySQLライブラリの制限の一部に対処するためにリリースされました。コードはmysqli_connect()やmysqli_query()などの関数を使用するため、mysqliの使用を簡単に識別できます。PHP 5.0でMySQLIライブラリがリリースされた直後に、PHP 5.1がリリースされ、今日のPHPの書き方を形作るのに役立つかなりの数の変更があります(主にオブジェクト指向のプログラミングを使用します。この本の後半でたくさん)。 PHP 5.1の主要な変更の1つは、MySQLデータベースに接続するために、3番目のライブラリPDO(PHPデータオブジェクト)を導入したことでした。
PDOとMySqliにはいくつかの違いがありますが、主なものは、PDOライブラリを使用して、OracleサーバーやMicrosoft SQL Serverなどのほぼすべてのデータベースサーバーに接続できることです。開発者にとって、この一般的なアプローチの最大の利点は、ライブラリを使用してMySQLデータベースと対話する方法を学んだことです。別のデータベースサーバーと対話するのは非常に簡単です。間違いなく、PDOのコードを作成するのは簡単であり、PDOコードをより読みやすくすることができるいくつかのニュアンスがあります。 (心配しないでください、それが後で何を意味するのかを説明します。)
これらの理由で、最新のPHPプロジェクトはPDOライブラリを使用しています。これは、この本での使用方法を紹介するライブラリです。違いの詳細については、SitePointの記事「PDOの再導入 - PHPのデータベースにアクセスする正しい方法」をご覧ください。その小さな歴史のレッスンの後、あなたはおそらくコードを書くことに戻りたいと思っています。 PDOを使用してMySQLサーバーへの接続を確立する方法は次のとおりです。
今のところ、新しいPDOを第2章で使用したRAND関数と同様に、組み込み関数と考えてください。名前!いずれにせよ、3つの引数が必要です
おそらく、最後の2つの引数で何が起こっているのかを見ることができます。これらは、この章で作成したユーザー名とパスワードです。
CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword'; GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';最初の議論はもう少し複雑です。 dbname = ijdbパーツは、ijdbと呼ばれるデータベース(
schema
とも呼ばれる)を使用するようにpdoに指示します。 PHPから実行されるクエリは、そのスキーマのテーブルにデフォルトになります。 [JOKEから]を選択します。IJDBスキーマのジョークテーブルからレコードを選択します。PHP、PDO、およびMySQLにすでに精通していても、Host = MySQLパーツは混乱しているように見えます。通常、これはhost = localhost(ローカルコンピューター、PHPを実行しているのと同じマシンを参照)、またはhost = sitepoint.com。 なぜHOST = MySQLで、MySQLはここで何を参照していますか? dockerでは、各サービス
に名前が付けられています。サーバーを構成するdocker-compose.ymlファイルを調べると、データベースサービスはmysqlと呼ばれ、Dockerでは、あるサービスが他のサービスの名前を使用して別のサービスに接続できます。引数はさておき、ここで見ることが重要なのは、新しいPDOによって返される値が$ PDOという名前の変数に保存されていることです。
MySQL Serverは、Webサーバーとは完全に個別のソフトウェアです。したがって、ネットワークの停止のためにサーバーが利用できないか、アクセスできない可能性を考慮する必要があります。そのような場合、新しいPDOは実行されず、PHP例外をスローします。注:少なくともデフォルトでは、PHPを構成することができるため、例外がスローされず、単に接続できません。これは一般的に望ましい動作ではありません。何が間違っていたのかを解決するのがはるかに難しくなるためです。 「PHP例外を投げる」ことが何を意味するのか疑問に思っているなら、あなた自身を締めます! PHP言語のいくつかの機能を発見しようとしています。
PHP例外は、PHPにタスクを実行するように指示すると何が起こり、それを行うことができません。 PHPは、それが言われたことをしようとしますが、失敗します。そして、失敗について話すために、それはあなたに例外を投げかけます。例外は、特定のエラーメッセージでPHPがクラッシュするだけです。例外がスローされると、PHPは停止します。エラーが実行された後のコード行はありません。
責任ある開発者として、その例外をキャッチしてそれについて何かをすることはあなたの仕事です。
注:例外をキャッチしない場合、PHPはPHPスクリプトの実行を停止し、壮大な醜いエラーメッセージを表示します。そのエラーメッセージは、エラーを投げたスクリプトのコードさえ表示されます。この場合、そのコードにはMySQLのユーザー名とパスワードが含まれているため、ユーザーが表示されているエラーメッセージを回避することが特に重要です! 例外をキャッチするには、試してみると例外をスローする可能性のあるコードを囲む必要があります... catchステートメント:
試してみることができます... if…elseステートメントのようなステートメントをキャッチします。
まだ混乱していますか?私はあなたに多くの新しい概念を投げていることを知っています(しゃれはありません)が、私がそれをすべてまとめて私たちが持っているものをあなたに見せたら、それはより理にかなっています:CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword'; GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
ご覧のとおり、このコードは試してみてください…CATCHステートメント。上部のトライブロックでは、新しいPDOを使用してデータベースに接続しようとします。これが成功した場合、結果のPDOオブジェクトを$ PDOに保存して、新しいデータベース接続を操作できるようにします。接続が成功した場合、$ output変数は後で表示されるメッセージに設定されます。
重要なことに、試してみてください。ステートメントをキャッチします。例外がスローされた後のコードは実行されません。この場合、データベースに接続すると例外がスローされます(パスワードが間違っているか、サーバーが応答していないかもしれません)、$出力変数は「データベース接続の確立」に設定されることはありません。
データベース接続の試行が失敗した場合、PHPはPDOExceptionをスローします。これは、新しいPDOがスローする例外のタイプです。したがって、私たちのキャッチブロックは、PDOExceptionをキャッチする(そして$ eという名前の変数に保存する)と述べています。そのブロック内で、変数$ outputを設定して、何がうまくいかなかったかについてのメッセージが含まれています。 ただし、このエラーメッセージは特に役立ちません。 PDOがデータベースサーバーに接続できなかったということです。それがなぜであるかについての情報を持っている方が良いでしょう - たとえば、ユーザー名とパスワードが無効だったからです。new PDO('mysql:host=hostname;dbname=database', 'username', 'password')$ e変数には、問題を説明するエラーメッセージなど、発生した例外に関する詳細が含まれています。連結を使用してこれを出力変数に追加できます:
CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword'; GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
注:$ e変数は文字列ではなくオブジェクトです。それがまもなく意味することになります。ただし、今のところ、知っておくべきことは、コード$ e-> getMessage()が発生した特定の例外に基づいてエラーメッセージを取得することです。 if…elseステートメントのように、試してみる2つのブランチの1つ…catchステートメントが実行されることが保証されています。 Tryブロックのコードが正常に実行されるか、Catchブロックのコードが実行されます。データベース接続が成功したかどうかに関係なく、$ output変数にメッセージがあります - エラーメッセージ、または接続が成功したというメッセージのいずれか。
最後に、Tryブロックが成功したか、キャッチブロックが実行されたかに関係なく、テンプレートoutput.html.phpが含まれています。これは、ページにテキストを表示するだけの一般的なテンプレートです。完全なコードは、例:mysql-connect。
テンプレートが含まれている場合、エラーメッセージまたは「データベース接続の確立」メッセージのいずれかが表示されます。
new PDO('mysql:host=hostname;dbname=database', 'username', 'password')前述のコードがあなたにある程度理にかなっていることを願っています。このセクションの最初に戻って、迷子になった場合はもう一度読んでください。ただし、コードをしっかりと把握したら、おそらく私がまだ説明されていない1つの謎、PDOを残したことに気付くでしょう。新しいPDOとは正確には、「PDOオブジェクト」を返すと言ったとき、正確にオブジェクトとは何ですか?
注:ダウンロードされたサンプルコードには、ijdb_sampleというスキーマとijdb_sampleというユーザーが含まれているため、スキーマとユーザーと呼ばれるものに関係なく実行できるようにします。データベースを含むファイルは、データベースとして提供されています。これをインポートできます。
提供されたWebベースのサンプルコードビューアーを使用すると、サンプルをロードするときにIDBJ_Sampleデータベースが作成されますが、このスキーマの変更は別のサンプルを表示すると失われます。 (物事を台無しにして、別のサンプルとバックに切り替えるとリセットされますが、変更した変更を保持したい場合は、作成したスキーマにします。)
前のセクションでは、「オブジェクト」という言葉が私の語彙に忍び込んできたことに気づいたかもしれません。 PDOはPHPデータ
オブジェクト拡張子であり、新しいPDOはPDO オブジェクトを返します。このセクションでは、オブジェクトが何であるかを説明したいと思います。
おそらく、PHPまたは一般的なプログラミングの独自の調査で、オブジェクト指向プログラミング(OOP)という用語に出くわしたことでしょう。 OOPは、多くの部品を備えた非常に複雑なプログラムを構築することに特に適したプログラミングの高度なスタイルです。今日アクティブに使用されているほとんどのプログラミング言語は、OOPをサポートしています。それらのいくつかは、 をoopスタイルで作業することを要求しています。 PHPはそれについてもう少し気まぐれであり、oopスタイルでスクリプトを書くかどうかを決定するために開発者に任せます。
これまでのところ、PHPコードをProceduralプログラミングと呼ばれるよりシンプルなスタイルで作成しました。今のところ、後でオブジェクトをより詳細に調べても続けます。手続きスタイルは、現在取り組んでいる比較的単純なプロジェクトに適しています。ただし、遭遇するほぼすべての複雑なプロジェクトは、OOPを使用しています。この本の後半で詳しく説明します。とは、MySQLデータベースに接続して作業するために使用するPDO拡張機能は、オブジェクト指向のプログラミングスタイルで設計されています。これは、単に関数を呼び出してMySQLに接続してからその接続を使用する他の関数を呼び出すのではなく、最初にデータベース接続を表すPDO
オブジェクトを作成し、次にの機能を使用する必要があることを意味します。データベースで動作するオブジェクトオブジェクトを作成することは、関数を呼び出すことによく似ています。実際、あなたはすでにそれを行う方法を見てきました:
新しいキーワードは、新しいオブジェクトを作成することをPHPに指示します。次に、スペースを残してクラス名を指定します。クラス名は、作成したいオブジェクトの種類をPHPに伝えます。クラスは、PHPがオブジェクトを作成するために従うような一連の指示です。クラスは、ケーキなどのレシピであると考えることができます。また、オブジェクトはレシピに続くことから生成された実際のケーキです。さまざまなレシピが異なる料理を生産できるのと同じように、異なるクラスが異なるオブジェクトを生成できます。PHPには、呼び出すことができる組み込み関数がたくさん付属しているように、PHPにはオブジェクトを作成できるクラスのライブラリが付属しています。したがって、新しいPDOは、PHPに新しいPDOオブジェクトを作成するように指示します。つまり、組み込みのPDOクラスの新しいオブジェクトです。
PHPでは、オブジェクトは、文字列、数字、または配列のような値です。オブジェクトを変数に保存するか、それを引数として関数に渡すことができます。他のPHP値でできるすべてのことです。ただし、オブジェクトにはいくつかの便利な追加機能がありますまず、オブジェクトは、他の値のコンテナとして機能するという点で、配列のように動作します。第2章で見たように、インデックス(たとえば、$誕生日['kevin']など)を指定することにより、配列内の値にアクセスできます。オブジェクトに関しては、概念は似ていますが、名前とコードは異なります。配列インデックスに保存されている値にアクセスするのではなく、オブジェクトのプロパティにアクセスしていると言います。正方形の括弧を使用してアクセスするプロパティの名前を指定する代わりに、矢印表記( - >)を使用します。たとえば、$ myobject-> someproperty:
CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword'; GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
アレイは通常、類似した値(誕生日の配列など)のリストを保存するために使用されますが、オブジェクトは関連値のリストを保存するために使用されます(たとえば、たとえば、データベース接続のプロパティ)。それでも、それがすべてのオブジェクトがそうであった場合、それらにあまり重要ではないでしょう:私たちはこれらの値を保存するために配列を使用することもできますよね?もちろん、オブジェクトはもっと多くのことをします
プロパティとその値のコレクションを保存することに加えて、オブジェクトには、より便利な機能をもたらすように設計された機能のグループを含めることができます。オブジェクトに保存されている関数は、メソッドと呼ばれます(プログラミングの世界では、私に尋ねると、より紛らわしい名前の1つ)。メソッドは、クラス内の機能です。さらに紛らわしいのは、独自のクラスを作成すると、関数キーワードを使用してメソッドが定義されています。経験豊富な開発者でさえ、しばしば誤ってfunctionとメソッドを互換性があります。
メソッドを呼び出すには、矢印表記を再度使用します - $ myobject-> somemethod():
new PDO('mysql:host=hostname;dbname=database', 'username', 'password')スタンドアロン関数と同様に、メソッドは引数を取り、値を返すことができます。 この段階では、これはおそらく少し複雑で無意味に聞こえますが、私を信頼してください。変数(プロパティ)と関数(方法)のコレクションをオブジェクトと呼ばれる小さなバンドルにまとめると特定のタスクのコード - データベースの1つにすぎないデータベースを使用します。ある日、独自の考案のオブジェクトを作成するために使用できるカスタムクラスを開発することもできます。 ただし、今のところ、PHPに含まれるクラスに固執します。作成したPDOオブジェクトで作業し続け、その方法の1つを呼び出すことで何ができるかを見てみましょう。 接続の構成
これまでのところ、PDOオブジェクトを作成してMySQLデータベースとの接続を確立する方法と、何か問題が発生したときに意味のあるエラーメッセージを表示する方法を紹介しました。
ただし、接続が成功すると仮定すると、使用する前に構成する必要があります。新しいPDOオブジェクトのメソッドを呼び出すことで、接続を構成できます。データベースにクエリを送信する前に、データベース接続の文字エンコードを構成する必要があります。第2章で簡単に述べたように、WebサイトでUTF-8エンコードされたテキストを使用して、サイトのフォームに記入するときにユーザーが自由に使用できるキャラクターの範囲を最大化する必要があります。デフォルトでは、PHPがMySQLに接続すると、UTF-8ではなくよりシンプルなISO-8859-1(またはラテン-1)エンコードを使用します。そのままにしておくと、中国語、アラビア語、またはほとんどの非英語のキャラクターを簡単に挿入することはできません。
あなたのウェブサイトが英語の話者のみが使用することを100%確信していても、文字セットを設定しないことによって引き起こされる他の問題があります。 WebページがUTF-8に設定されていない場合、Curly Quotesなどの特定の文字をテキストボックスに書くと問題が発生します。データベースに別の文字として表示されるためです。 したがって、UTF-8エンコードを使用するように新しいPDOオブジェクトを設定する必要があります。データベースを照会するときにデータベースをクエリするときにUTF-8を使用するようにPHPに指示できます; charset = utf8mb4接続文字列に。 PHPスクリプトがUTF-8(最近のPHPバージョンのデフォルト)としてブラウザに送信されている場合、これを行うには欠点がありません。
注:検索に行くと、charsetを設定するさまざまな方法があります。この本の以前の版では、このコードを使用するように指示されました。
CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword'; GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';これは、PHP 5.3.6まで、PHPによってcharSetオプションが正しく適用されなかったためです。これは実際に使用する任意のPHPバージョンで修正されているため、接続文字列の一部としてcharsetを設定することは優先オプションです。
MySQLに接続してからその接続を構成するために使用する完全なコードを以下に示します。 例:mysql-connect-complete
new PDO('mysql:host=hostname;dbname=database', 'username', 'password')ブラウザでこの例を起動します。 (パブリックディレクトリ内のindex.phpにデータベースコードを配置し、output.html.phpファイルをテンプレートディレクトリ内に配置した場合、ページのURLはhttps://v.je/。)
サーバーが稼働していて、すべてが正常に機能している場合、成功を示すメッセージが表示されるはずです。
PHPがMySQLサーバーに接続できない場合、または提供したユーザー名とパスワードが正しくない場合、代わりに以下に示すものと同様の画面が表示されます。エラー処理コードが適切に機能していることを確認するには、パスワードを意図的に間違えてテストすることをお勧めします。
$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser', 'mypassword');
キャッチブロックのおかげで、データベースからのエラーメッセージがページに含まれています。
CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword'; GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
メソッドgetMessage()は、発生した例外を説明するメッセージを返します。例外がスローされたファイル名と行番号を返すためのgetFile()やgetLine()を含むいくつかの方法があります。このような非常に詳細なエラーメッセージを生成できます。
new PDO('mysql:host=hostname;dbname=database', 'username', 'password')これは、数十のインクルードファイルを備えた大きなWebサイトがある場合、非常に便利です。エラーメッセージは、どのファイルを調べるか、どの線がどのラインで発生したかを正確に示します。
興味がある場合は、データベース接続コード(たとえば、誤ったデータベース名)に他のいくつかの間違いを挿入して、結果の詳細なエラーメッセージを観察してみてください。完了し、データベース接続が正しく動作している場合は、単純なエラーメッセージに戻ります。これにより、データベースサーバーに真の問題が発生した場合、訪問者は技術的なGobbledyGookで攻撃されません。
接続が確立され、データベースが選択されている場合、データベースに保存されているデータの使用を開始する準備が整いました。 スクリプトの実行が終了した後、MySQLサーバーとの接続に何が起こるのか疑問に思うかもしれません。本当に必要な場合は、接続を表すPDOオブジェクトを破棄することにより、PHPにサーバーから切断するように強制できます。オブジェクトを含む変数をnullに設定することにより、これを行います:と言った、PHPはスクリプトの実行が終了したときに開いているデータベース接続を自動的に閉じます。そのため、通常、PHPをクリーンアップさせることができます。
php$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser', 'mypassword');でSQLクエリを送信します
第3章では、MySQLワークベンチを使用してMySQLデータベースサーバーに接続しました。これにより、SQLクエリ(コマンド)を入力し、それらのクエリの結果をすぐに表示できます。 PDOオブジェクトは、同様のメカニズムを提供します - execメソッド:
ここで、$ queryは、実行するsqlクエリを含む文字列です。 ご存知のように、クエリの実行に問題がある場合(たとえば、SQLクエリでタイピングミスを犯した場合)、このメソッドはPDOExceptionをスローします。例:mysql-create
try { ⋮ do something risky } catch (ExceptionType $e) { ⋮ handle the exception }
同じTry Try ... Catchステートメント手法を使用して、クエリによって生成された可能性のあるエラーを処理することに注意してください。複数の試行を使用することは可能です...キャッチブロックをキャッチして、さまざまなエラーメッセージを表示します。1つは接続用、もう1つはクエリ用です - これにより、かなりの量の追加コードが発生する可能性があります。
代わりに、同じTRYステートメントを使用して、接続とクエリの両方を含めることを選択しました。 try…catch blockはエラーが発生したらコードの実行を停止するため、データベース接続中にエラーが発生した場合、$ pdo-> exec($ run)行は実行されず、クエリがデータベースに送信された場合を確認します。 、接続が確立されている必要がありますこのアプローチにより、表示されているエラーメッセージに対する制御が少し少なくなりますが、Tryのタイピングを保存します。各データベース操作のステートメントをキャッチします。この本の後半では、これらをさまざまなブロックに分割しますが、今のところ、すべてのデータベース操作を同じTryブロックに保持します。
この例では、getMessageメソッドも使用して、MySQLサーバーから詳細なエラーメッセージを取得します。次の画像は、たとえば、ジョークテーブルがすでに存在する場合に表示されるエラーを示しています。
削除、挿入、および更新クエリ(保存されたデータを変更するのに役立つ)の場合、execメソッドはクエリの影響を受けたテーブル行(エントリ)の数を返します。次のSQLコマンドを考えてみましょう。これを第3章で使用して、「プログラマー」という言葉を含むすべてのジョークの日付を設定します。
execメソッドから返された値を$ hiblectedRowsで保存することにより、テンプレートに印刷するために$ output変数の変数を使用できます。
以下の画像は、データベースに「プログラマー」ジョークが1つしかないと仮定して、この例の出力を示しています。CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword'; GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
同じクエリを再度実行するためにページを更新する場合、次の画像に示すように、メッセージの変更が表示されます。ジョークに適用される新しい日付が既存の日付と同じであるため、行が更新されなかったことを示します。
[結果]セットの取り扱い
ほとんどのSQLクエリでは、execメソッドは正常に機能します。クエリはデータベースに何かを行い、メソッドの返品値から影響を受ける行の数(ある場合)を取得します。ただし、選択クエリには、execより少しファンシーなものが必要です。選択したクエリがデータベースに保存されたデータを表示するために使用されることを思い出してください。データベースにのみ影響する代わりに、選択したクエリに結果があります。>を返す方法が必要です。
クエリの処理でエラーが発生しなかった場合、このコードは結果セット(pdostatementオブジェクトの形で)を変数$ resultに保存します。この結果セットには、ジョークテーブルに保存されているすべてのジョークのテキストが含まれています。データベースのジョークの数に実際的な制限がないため、結果セットは非常に大きくなる可能性があります。
第2章で、ループする必要があるが、何回かわからないときは、whileループは有用な制御構造であると述べました。クエリが返されたレコードの数がわからないため、ループを使用することはできません。確かに、ここでは、ここで時間ループを使用して、結果セットの行を一度に1つずつ処理できます。
CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword'; GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';whileループの条件は、おそらく慣れている条件とは異なるので、それがどのように機能するかを説明させてください。条件をすべてそれ自体で声明として考えてください:
new PDO('mysql:host=hostname;dbname=database', 'username', 'password')pdostatementオブジェクトのフェッチメソッドは、結果セットの次の行を配列として返します(第2章で配列について説明しました)。結果セットにこれ以上行がない場合、Fetchは代わりにFalseを返します。 (これは、PDOオブジェクトにできないことをするように依頼する1つのケースです。結果セットに行が残っていない場合、フェッチは次の行を返すことができないためです。 。
さて、上記のステートメントは$ row変数に値を割り当てますが、同時に、ステートメント全体が同じ値を引き受けます。これが、ステートメントをwhileループの条件として使用できる理由です。しばらくの間、ループは条件がfalseに評価されるまでループを続けます。このループは、結果セットに行があると同じくらい何度も発生し、ループが実行されるたびに$ rowが次の行の値を帯びます。把握するために残されているのは、ループが実行されるたびに$ row変数から値を取得する方法です。 Fetchによって返された結果セットの行は連想配列として表され、結果セットのテーブル列にちなんで指定されたインデックスとともに表されます。 $ rowが結果セットの行である場合、$ row ['joketext']はその行のjoketext列の値です。 このコードでの目標は、すべてのジョークのテキストを保存して、PHPテンプレートに表示できるようにすることです。これを行う最良の方法は、各ジョークを配列に新しいアイテムとして保存することです。 ジョークがデータベースから引き出された状態で、PHPテンプレートjokes.html.php。
に渡すことができます。ただし、データは、コードで手動で入力されるのではなく、データベースから取得されました。
設定されている2つの異なる変数($ジョークと$エラー)があることに気付くでしょう。
jokes.html.phpテンプレートでは、$ jokes配列の内容または$エラー変数に含まれるエラーメッセージを表示する必要があります。変数に値が割り当てられているかどうかを確認するには、フォームが送信されたかどうかを確認するために以前に使用したISSET関数を使用できます。テンプレートには、エラーを表示するかジョークのリストを表示するかを決定するIFステートメントを含めることができます。
CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword'; GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';ここには新しいものは何もありませんが、ジョークを表示するには、$ jokesアレイの内容を表示する必要があります。この時点まで使用した他の変数とは異なり、$ Jokesアレイには単一の値以上のものが含まれています。
PHPで配列を処理する最も一般的な方法は、ループを使用することです。ループやループ用にすでに見てきました。 foreachループは、配列を処理するのに特に役立ちます:
条件の代わりに、foreachループの上部にある括弧内に配列が含まれ、次にキーワードが続き、次に配列の各アイテムを順番に保存するために使用される新しい変数の名前が含まれます。次に、ループの本体が配列内の各アイテムに対して1回実行されます。そのアイテムが指定された変数に保存されるたびに、コードが直接アクセスできるようにします。
new PDO('mysql:host=hostname;dbname=database', 'username', 'password')PHPテンプレートでForeachループを使用して、配列の各アイテムを順番に表示することが一般的です。これが私たちの$ JOKESアレイを探している方法です:
ループコードとHTMLコードを説明するこのPHPコードのブレンドを使用すると、コードはかなり乱雑に見えます。このため、テンプレートで使用されている場合、foreachループを作成する代替方法を使用することが一般的です。
$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser', 'mypassword');2つのコードは機能的に同一ですが、後者はHTMLコードと混合すると友好的に見えます。この形式のコードがテンプレートでどのように見えるかは次のとおりです。
同じことをIFステートメントで行うことができ、ブレースを避けてHTMLテンプレート内を見ることをお勧めします。
try { ⋮ do something risky } catch (ExceptionType $e) { ⋮ handle the exception }これらの新しいツールを手元に置いて、ジョークのリストを表示するためにテンプレートを書くことができます。
例:mysql-listjokes
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';ジョークにはおそらくHTMLコード(、または&&&)として解釈できる文字が含まれている可能性があるため、HTMLSpecialCharsを使用してHTML文字エンティティ(つまり、&<、&gtに変換される必要があります。 ;、および&&)それで、それらが正しく表示されるように。次の画像は、データベースにいくつかのジョークを追加したら、このページがどのように見えるかを示しています。
<!doctype html> <html> <head> <meta charset="utf-8"> <title>Script Output</title> </head> <body> <?php echo $output; ?> </body> </html>コントローラーでwhileループを使用して、一度に1つずつセットから行を削除する方法を覚えていますか?CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword'; GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';pdostatementオブジェクトは、foreachループに渡すと、配列のように動作するように設計されていることがわかります。したがって、しばらくの間ではなく、Foreachループを使用してデータベース処理コードをわずかに簡素化できます。
new PDO('mysql:host=hostname;dbname=database', 'username', 'password')この本の残りの部分では、このTidier Foreachの形を使用します。別のきちんとしたツールPHPが提供するのは、Echoコマンドを呼び出す速記の方法です。これは、すでに見たように、頻繁に使用する必要があります。私たちのエコーステートメントは次のようになります: 代わりに、
これを使用できます:
$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser', 'mypassword');これはまったく同じことをします。 速記を使用した更新されたテンプレートを次に示します。try { ⋮ do something risky } catch (ExceptionType $e) { ⋮ handle the exception }例:mysql-listjokes-shorthand
この時点から適用可能な速記表記を使用します。
注:5.4以前のPHPのバージョンでは、この速記の表記法にはかなり珍しい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.'; } include __DIR__ . '/../templates/output.html.php';PHP 5.4(最近現実的に遭遇するバージョン)の時点で、速記はPHP設定に関係なく機能するため、すべてのサーバーで動作しないことを心配せずに安全に使用できます。
先に考える
見た例では、ページを表示するために必要なすべてのHTMLが含まれるテンプレートjokes.html.phpを作成しました。ただし、当社のウェブサイトが成長するにつれて、さらにページを追加します。人々がウェブサイトにジョークを追加できるようにするページが必要です。また、入門テキストを備えたホームページ、所有者の連絡先の詳細を備えたページ、そしてサイトが成長するにつれて、おそらくさえ、ホームページも必要です。人々がウェブサイトにログインできるページ。ここではかなり前に飛び込んでいますが、プロジェクトがどのように成長するかを常に検討する価値があります。 jokes.html.phpに使用したばかりのアプローチを適用した場合、残りのテンプレートにaddjoke.html.php、home.html.php、contact.html.php、login.html.phpなど - 私たちllは、繰り返されるコードがたくさんあります。 ウェブサイト上のすべてのページには、このようなものになるテンプレートが必要です。
プログラマーとして、繰り返しコードはあなたができる最悪のことの1つです。実際、プログラマーはしばしば「自分自身を繰り返さないでください」を表す乾燥原理を指します。コードのセクションを繰り返していることに気付いた場合、ほぼ間違いなくより良い解決策があります。
最高のプログラマーはすべて怠zyであり、コードを繰り返すことは作業を繰り返すことを意味します。テンプレートにこのコピー/貼り付けアプローチを使用すると、Webサイトの維持が非常に困難になります。各ページに表示したいフッターとナビゲーションセクションがあると想像しましょう。私たちのテンプレートは、次のようになります:
CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword'; GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';2022年に問題に遭遇します! Webサイト上のすべてのページのテンプレート - たとえば、jokes.html.php addjoke.html.php、home.html.php、contact.html.php andlogin.html.php - 上記の構造にコードを含める場合「2022」の著作権通知で年を更新すると、各テンプレートを開き、日付を変更する必要があります。 この問題を回避するために、私たちは賢く、サーバーのクロック(エコー日付( 'y');)から動的に読み取ることができますが、<script>タグを追加したい場合はどうなりますかそれはすべてのページに含まれていましたか?または、メニューに新しいリンクを追加しますか?すべてのテンプレートファイルを開いて変更する必要があります! </script>
5つまたは6つのテンプレートを変更するのは少し迷惑な場合がありますが、それほど問題は発生しません。しかし、ウェブサイトが数十または数百ページに成長した場合はどうなりますか?メニューにリンクを追加するたびに、すべてのテンプレートを開いて変更する必要があります。この問題
一連のインクルードステートメントで解決できます。たとえば、
しかし、この方法には透視が必要です。将来行うために必要な変更を正確に予測する必要があり、関連性を使用する必要があります。 上記の例では、たとえば、nav.html.phpにそれらを追加することで新しいメニューエントリを簡単に追加できますが、すべてのページに<script>タグを追加するか、CSSクラスを追加するのと同じくらい些細なことですNAV要素は、変更を行うためにすべてのテンプレートを開くことを意味します。 </script>ウェブサイトの生涯にわたって必要なすべての変更を正確に予測する方法はないため、この章の冒頭で示したアプローチは実際には優れています。
new PDO('mysql:host=hostname;dbname=database', 'username', 'password')このテンプレートを常にLayout.html.phpを呼び出す場合、$ output変数をいくつかのhtmlコード
に設定し、ナビゲーションとページに表示してください。フッター。これの利点は、Webサイトのすべてのページの日付を変更するには、1つの場所で変更するだけでいいということです。 また、各コントローラーがと タグの間に表示される値(サンプルコードでjokes.cssとして使用できる)とともにとタグの間に表示される値を定義できるように、$タイトル変数にも忍び込みました。ページは少しきれいです。
$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser', 'mypassword');コントローラーを使用できるようになりました。 '/../templates/layout.html.php'; $ outputと$ titleの値を提供しますrayout.html.phpを使用したjokes.phpは、以下に示すようにコード化されています
例:mysql-listjokes-layout-1
CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword'; GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';しかし、待ってください! Tryブロックの$ outputで何が起こっていますか? $ output変数には、実際にはHTMLコードが含まれています。ループは、ジョークリストのHTMLコードを含む文字列を構築します。
原則として、これが私たちが起こりたいことです。$ output変数には、ナビゲーションとフッターの間にレイアウトの間に挿入されるHTMLコードが含まれています。信じられないほど醜い。既に、includeステートメントを介してHTMLとPHPコードの混合を避ける方法を示しました。先ほど行ったように、ジョークを独自のファイルに表示するためにHTMLを移動するのは良いことですが、今回は、ジョークリストページに固有のHTMLコードのみです。
Jokes.html.php Templatesディレクトリには、このコードが含まれている必要があります
重要なことに、これはジョークを表示するためのコードのみです。ナビゲーション、フッター、
タグなど、すべてのページで繰り返されるものは含まれていません。ジョークリストページに固有のHTMLコードのみです。 このテンプレートを使用するには、以下を試すことができますnew PDO('mysql:host=hostname;dbname=database', 'username', 'password')またはあなたが非常に賢い場合:このアプローチを使用すると、ロジックは完全に健全になります。 jokes.html.phpを含める必要があります。残念ながら、includeステートメントは、呼び出されたポイントで含まれるファイルからコードを実行するだけです。上記のコードを実行すると、出力は実際には次のようなものになります:
$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser', 'mypassword');jokes.html.phpが最初に含まれるため、最初にブラウザに送信されます。私たちがする必要があるのはLoad jokes.html.phpですが、出力をブラウザに直接送信する代わりに、それをキャプチャして$ output変数に保存する必要があります。 。includeステートメントは値を返しないため、$ output = include 'jokes.html.php';望ましい効果はありません。PHPには、それを行うための代替声明がありません。しかし、それはそれが不可能であるという意味ではありません。
try { ⋮ do something risky } catch (ExceptionType $e) { ⋮ handle the exception }PHPには、「出力バッファリング」と呼ばれる便利な機能があります。複雑に聞こえるかもしれませんが、コンセプトは実際には非常にシンプルです。エコーを使用して何かを印刷する場合、またはHTMLを含むファイルを含める場合、通常はブラウザに直接送信されます。出力バッファリングを使用することにより、出力をブラウザに直接送信する代わりに、HTMLコードは「バッファ」でサーバーに保存されます。これは、基本的にこれまでに印刷されているすべてを含む文字列です。 さらに良いことに、PHPを使用すると、バッファーをオンにしてその内容をいつでも読み取ることができます。
必要な2つの関数がありますおそらく推測したように、関数名の「OB」は「出力バッファー」の略です。
- ob_start()、出力バッファを開始します。この関数を呼び出した後、echoまたはhtmlを介して印刷されたものはすべて、ブラウザに送信されるのではなく、バッファーに保存されます。
ob_get_clean()は、バッファの内容を返してクリアします。含まれているファイルの内容をキャプチャするには、これら2つの機能を利用する必要があります。
このコードが実行されると、$ output変数には、jokes.html.phpテンプレートで生成されたHTMLが含まれます。
これからこのアプローチを使用します。各ページは、2つのテンプレートで構成されています:CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword'; GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';layout.html.phpには、すべてのページで必要なすべての一般的なHTMLが含まれています
その特定のページに固有のHTMLコードのみを含む一意のテンプレート
index.phpファイルを追加して、「ホーム」リンクを機能させてみましょう。このページに何でも入れることができます:最新のジョーク、今月の最高の冗談、または私たちが好きなものは何でも。ただし、今のところ、シンプルに保ち、「インターネットジョークデータベースへようこそ」というメッセージがあります。
- 完全なjokes.phpは次のようになります:
TemplatesフォルダーでHome.html.phpというファイルを作成します:
new PDO('mysql:host=hostname;dbname=database', 'username', 'password')index.phpはjokes.html.phpよりもかなり簡単です。データベースから情報が取得されないため、データベース接続は必要ありませんし、試してみる必要はありません。 。
例:mysql-listjokes-layout-3
$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser', 'mypassword');注:必要に応じてデータベースにのみ接続することをお勧めします。データベースは多くのWebサイトで最も一般的なパフォーマンスボトルネックであるため、できるだけ少ない接続を作成することが望ましいです。両方のページがブラウザで動作することをテストします。 https://v.je/jokes.phpにアクセスすると、ジョークのリストが表示され、https://v.je/jokes.phpにようこそメッセージが必要です。両方のページには、ナビゲーションとフッターが含まれている必要があります
レイアウトを修正してみてください。html.php。あなたが行う変更は両方のページに表示されます。サイトに数十ページがあった場合、レイアウトの変更はすべてのページに影響します。 データをデータベースに挿入するtry { ⋮ do something risky } catch (ExceptionType $e) { ⋮ handle the exception }このセクションでは、サイト訪問者がデータベースに自分のジョークを追加できるようにするために、ツールを自由に使用する方法を示します。サイトの訪問者に新しいジョークを入力させたい場合は、明らかにフォームが必要になります。これが請求書に適合するフォームのテンプレートです:
Templates DirectoryのAddJoke.html.phpとしてこれを保存します。
以上がWebでMySQLからのデータの表示:はじめにの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。