検索
ホームページバックエンド開発PHPチュートリアルWebでMySQLからのデータの表示:はじめに

WebでMySQLからのデータの表示:はじめに

次の記事は、php&mysqlからの抜粋です:Novice to Ninja、7th Edition、プロのWebアプリケーションを構築するために必要なすべてのツール、原則、およびテクニックを学習するための実践ガイドです。シリーズのこの最終チュートリアルでは、MySQLデータベースに保存されている情報を取得し、すべての人が表示されるようにWebページに表示する方法を学びます。


    docker
  • でPHP開発環境を設定します
  • PHP
  • の初心者向けガイド
  • mysqlの導入:初心者向けガイド
  • Web上のMySQLからのデータの表示:はじめに

これはそれです - あなたがサインアップしたもの!この章では、MySQLデータベースに保存されている情報を取得し、すべての人が表示されるようにWebページに表示する方法を学びます。

これまでのところ、最初のPHPコードを作成し、リレーショナルデータベースエンジンであるMySQLの基本と、サーバー側のスクリプト言語であるPHPを学びました。

ここで、これらのツールを一緒に使用して、ユーザーがデータベースからデータを表示したり、独自のデータを追加できるWebサイトを作成する方法を学ぶ準備ができています。

注:第3章のように、ここでは「mysql」を使用してデータベースプロトコルを参照しています。あなたのPHPスクリプトは同じことをします。この章には、実際にMariadBデータベースに接続しているにもかかわらず、「mysql」に書くために、PHPコードに記載されている多くの参照があります。

全体像

前進する前に、私たちの究極の目標を明確に描くために一歩後退する価値があります。 PHPスクリプト言語とMySQLデータベースエンジンという2つの強力なツールがあります。これらがどのように合うかを理解することが重要です

当社のWebサイトにMySQLを使用する目的は、データベースからコンテンツを動的にプルして、通常のブラウザで表示するためのWebページを作成できるようにすることです。したがって、システムの一端に、Webブラウザーを使用してページをリクエストするためにサイトに訪問者がいます。そのブラウザは、見返りに標準のHTMLドキュメントを受信することを期待しています。もう一方の端には、SQLクエリ(コマンド)に応答する方法のみを理解するMySQLデータベースの1つ以上のテーブルにあるサイトのコンテンツがあります。 WebでMySQLからのデータの表示:はじめに

上の画像に示されているように、PHPスクリプト言語は両方の言語を話す間の間にあります。ページリクエストを処理し、第3章でジョークのテーブルを作成するために使用したものと同じように、SQLクエリを使用してMySQLデータベースからデータを取得します。その後、ブラウザが期待する適切にフォーマットされたHTMLページとして動的に吐き出します。 >

ちょうどそれはあなたの心の中ではっきりと新鮮です、これはあなたのウェブサイトのページへの訪問者がいるときに起こることです:

  1. 訪問者のWebブラウザは、WebサーバーからWebページをリクエストします。
  2. Webサーバーソフトウェア(通常はApacheまたはNginx)は、要求されたファイルがPHPスクリプトであることを認識しているため、サーバーはPHPインタープリターを起動してファイルに含まれるコードを実行します。
  3. 特定のPHPコマンド(この章の焦点になります)は、MySQLデータベースに接続し、Webページに属するコンテンツをリクエストします。
  4. MySQLデータベースは、要求されたコンテンツをPHPスクリプトに送信することで応答します。
  5. PHPスクリプトは、コンテンツを1つ以上のPHP変数に保存し、Echoステートメントを使用してWebページの一部としてコンテンツを出力します。
  6. PHPインタープリターは、Webサーバーに作成したHTMLのコピーを手渡すことで仕上げられます。
  7. Webサーバーは、HTMLファイルからHTMLファイルから直接来る代わりに、PHPインタープリターによって提供される出力であることを除いて、HTMLをWebブラウザーに送信します。ただし、ブラウザにはこれを知る方法はありません。ブラウザに関する限り、それは他のものと同様にWebページを要求して受信しています。
  8. mySQLユーザーアカウントの作成
  9. PHPがMySQLデータベースサーバーに接続するためには、ユーザー名とパスワードを使用する必要があります。これまでのところ、ジョークデータベースに含まれているのは、多くのpithy
  10. bon mots
  11. だけですが、やがて、メールアドレスやウェブサイトのユーザーに関するその他の個人的な詳細などの機密情報が含まれている場合があります。このため、MySQLは非常に安全であるように設計されており、どの接続が受け入れられ、それらの接続が許可されているかを厳密に制御できます。
  12. docker環境には、第3章に既にMySQLユーザーが含まれています。これは、MySQLサーバーにログインするために既に使用されています。
ウェブサイトが依存するIJDBデータベースで作業するために必要な特定の特権のみを備えた新しいユーザーアカウントを作成する必要があります。今すぐやってみましょう。

ユーザーを作成するには、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に接続します

Webページに含めるためにMySQLデータベースからコンテンツを取得する前に、PHPスクリプト内からMySQLへの接続を確立する方法を知っている必要があります。これまでのところ、MySQL Workbenchというアプリケーションを使用してデータベースに接続しています。 MySQLワークベンチが実行中のMySQLサーバーに直接接続できるように、独自のPHPスクリプトもできます。 この章では、PHPからMySQLに接続することについて完全に説明していますが、実際に前の章で説明したMariaDBデータベースに接続しています。 PHPは、MySQLとMariadBが交換可能であるため、違いを確認できません。使用されるすべてのコマンドを使用してMySQLまたはMariaDBデータベースサーバーに接続できるため、データベースをMySQLと呼びます。

元のMySQLデータベースは、MySQLワークベンチやPHPなど、

クライアント

にサーバーと通信するための標準化されたメソッドを提供しました。 Mariadbはその標準をコピーし、PHPのすべてのコマンドは名前

mysql

という名前を使用しているため、物事をシンプルに保つために、この章を通して

mysql という用語を使用してデータベースを参照します。 phpからmysqlサーバーに接続する方法は3つあります: mysqlライブラリ

mysqliライブラリ

    PDOライブラリ
  • これらはすべて基本的に同じジョブを行います - データベースに接続してそれにクエリを送信します - しかし、彼らはそれを達成するために異なるコードを使用します。
  • MySQLライブラリは、データベースに接続する最も古い方法であり、PHP 2.0で導入されました。それに含まれる機能は最小限であり、PHP 5.0(2004年にリリース)時点でMySqliに取って代わられました。 古いmysqlライブラリを使用してデータベースを接続および照会するには、mysql_connect()やmysql_query()などの関数が使用されます。これらの機能は、PHP 5.5以降、PHP 7.0から完全に削除されているため、避けられるべきです。

    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つの引数が必要です

    • データベースのタイプを指定する文字列(mysql :)、サーバーのホスト名(host = hostname;)、およびデータベースの名前(dbname = database)
    • phpを使用したいmysqlユーザー名
    • そのユーザー名のmysqlパスワード
    第2章から、PHP関数は通常、呼び出されたときに値を返すことを覚えているかもしれません。この新しいPDO「関数」は、確立された接続を識別するPDOオブジェクトと呼ばれる値を返します。接続を利用するつもりなので、変数に保存してこの値を保持する必要があります。データベースに接続するために必要な値が記入された状態で、それがどのように見えるかを次に示します。

    おそらく、最後の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データベースが作成されますが、このスキーマの変更は別のサンプルを表示すると失われます。 (物事を台無しにして、別のサンプルとバックに切り替えるとリセットされますが、変更した変更を保持したい場合は、作成したスキーマにします。)

MySQL Workbenchを使用してサンプルデータをスキーマにロードする場合は、データのインポート/復元を選択してProject DirectoryからDatabase.sqlをインポートします。次に、自己完結型ファイルからインポートを選択し、Database.sqlを参照し、デフォルトのターゲットスキーマでスキーマ名を選択します。同じ名前のテーブルを作成した場合、それらは上書きされ、すべてのレコードが失われます。 オブジェクト指向プログラミングのクラッシュコース

前のセクションでは、「オブジェクト」という言葉が私の語彙に忍び込んできたことに気づいたかもしれません。 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をスローします。

次の例を考えてみましょう。これは、第3章で作成したジョークテーブルを作成しようとします

例: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サーバーから詳細なエラーメッセージを取得します。次の画像は、たとえば、ジョークテーブルがすでに存在する場合に表示されるエラーを示しています。

WebでMySQLからのデータの表示:はじめに削除、挿入、および更新クエリ(保存されたデータを変更するのに役立つ)の場合、execメソッドはクエリの影響を受けたテーブル行(エントリ)の数を返します。次のSQLコマンドを考えてみましょう。これを第3章で使用して、「プログラマー」という言葉を含むすべてのジョークの日付を設定します。

例:mysql-update

execメソッドから返された値を$ hiblectedRowsで保存することにより、テンプレートに印刷するために$ output変数の変数を使用できます。

以下の画像は、データベースに「プログラマー」ジョークが1つしかないと仮定して、この例の出力を示しています。
CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';

同じクエリを再度実行するためにページを更新する場合、次の画像に示すように、メッセージの変更が表示されます。ジョークに適用される新しい日付が既存の日付と同じであるため、行が更新されなかったことを示します。

WebでMySQLからのデータの表示:はじめに

選択クエリは、多くのデータを取得できるため、少し異なって扱われます。PHPはその情報を処理する方法を提供します。

[結果]セットの取り扱い

ほとんどのSQLクエリでは、execメソッドは正常に機能します。クエリはデータベースに何かを行い、メソッドの返品値から影響を受ける行の数(ある場合)を取得します。ただし、選択クエリには、execより少しファンシーなものが必要です。選択したクエリがデータベースに保存されたデータを表示するために使用されることを思い出してください。データベースにのみ影響する代わりに、選択したクエリに結果があります。WebでMySQLからのデータの表示:はじめに>を返す方法が必要です。

クエリメソッドは、データベースサーバーに送信される引数としてSQLクエリを受け入れるという点で、execのように見えます。ただし、返されるのはpdostatementオブジェクトです。これは、クエリから返されたすべての行(エントリ)のリストを含む結果セットを表します。

クエリの処理でエラーが発生しなかった場合、このコードは結果セット(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。

に渡すことができます。 $ Jokes変数は、ジョークのリストを保存する配列です。 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に変換される必要があります。 ;、および&&)それで、それらが正しく表示されるように。

次の画像は、データベースにいくつかのジョークを追加したら、このページがどのように見えるかを示しています。


  
    <meta charset="utf-8">
    <title>Script Output</title>
  
  
      <?php echo $output; ?>
  

コントローラーで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_start()、出力バッファを開始します。この関数を呼び出した後、echoまたはhtmlを介して印刷されたものはすべて、ブラウザに送信されるのではなく、バッファーに保存されます。
  • ob_get_clean()は、バッファの内容を返してクリアします。
おそらく推測したように、関数名の「OB」は「出力バッファー」の略です。

含まれているファイルの内容をキャプチャするには、これら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コードのみを含む一意のテンプレート
  • 完全なjokes.phpは次のようになります:
index.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としてこれを保存します。

要素の最も重要な部分は、アクション属性です。アクション属性は、フォームが送信されたら、データを送信する場所をブラウザに伝えます。これは、「addjoke.php」などのファイルの名前である可能性があります。ただし、

属性を「 "に設定して空にしたままにしておくと、ユーザーが提供するデータが現在表示されているページに送り返されます。ブラウザのURLにPageがAddjoke.phpとして表示されている場合、ユーザーが追加ボタンを押すとデータが送信されます。

このフォームを前の例に結び付けましょう。これにより、データベースにジョークのリストが表示されました。 layout.html.phpを開き、addjoke.phpに行く「新しいジョークを追加」リンクにURLを追加します:

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
layout.html.phpを開いている間、上記のように第2章のform.css styleSheetを含めます。これで、レイアウト内に表示される任意のフォームには、以前に使用したスタイルがあります。 このフォームが送信されると、リクエストには、テキスト領域に入力されたジョークのテキストを含む変数(joketext)が含まれます。この変数は、PHPによって作成された$ _POSTアレイに表示されます。

パブリックディレクトリにaddjoke.phpを作成しましょう。このコントローラーの基本的なロジックは次のとおりです

Joketext Post変数が設定されていない場合は、フォームを表示します。 それ以外の場合は、提供されたジョークをデータベースに挿入します。

このskeleton addjoke.php:
    を作成します
  • このオープニングステートメントが$ _POSTアレイにJoketextという変数が含まれているかどうかを確認します。設定されている場合、フォームが提出されています。それ以外の場合、addjoke.html.phpのフォームは、ブラウザに表示するために$ output変数にロードされます。 この時点でブラウザでaddjoke.phpを開いている場合、フォームが表示されますが、冗談を入力して追加することは機能しません。 $ _POST ['JOKETEXT']。
  • 提出されたジョークをデータベースに挿入するには、$ _POST ['joketext']に保存されている値を使用して挿入クエリを実行して、ジョークテーブルのジョークテキスト列に記入する必要があります。これにより、このようなコードを書くことにつながる可能性があります:
ただし、このコードには深刻な問題があります。$ _POST ['JOKETEXT']の内容は、フォームを提出したユーザーの制御下にあります。悪意のあるユーザーが厄介なSQLコードをフォームに入力した場合、このスクリプトは疑いなくMySQLサーバーに送ります。このタイプの攻撃はSQLインジェクション攻撃と呼ばれ、PHPの初期には、ハッカーがPHPベースのWebサイトで見つけて悪用した最も一般的なセキュリティホールの1つでした。 (多くのプログラミングニッチでは、開発者が期待していないため、SQLインジェクション攻撃は驚くほど効果的です。トラフィックカメラにデータベースをドロップさせるこの顕著な試みを考慮してください。 🎜>

ユーザーはこれをテキストボックスに入力する場合があります:

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

データベースに送信されたクエリは次のとおりです。

しかし、ユーザーが以下に入力した場合はどうなりますか:

この場合、データベースに送信されたクエリは次のとおりです。
CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';

ジョークには引用文字が含まれているため、MySQLはエラーを返します。「Get」の前に引用が表示される前に、文字列の終わりとして表示されます。 これを有効なクエリにするには、データベースに送信されたクエリが次のようになるように、テキスト内のすべての引用符を逃れる必要があります。

見積もりが含まれている場合、

データが挿入されていません。ユーザーにとっては迷惑な問題です。タイプしたものは何でも失うでしょう。しかし、悪意のあるユーザーはこれを悪用することができます。 PHPの古いバージョンでは、セミコロン(;)。

ユーザーがこれをボックスに入力した場合を想像してみてください:
new PDO('mysql:host=hostname;dbname=database', 'username',
  'password')

これにより、次のクエリがデータベースに送信されます

-MySQLの単一行のコメントなので、最後の行は無視され、挿入クエリが実行され、その後、ユーザーがボックスに入力した削除クエリが続きます。実際、ユーザーはボックスに気に入った任意のクエリを入力でき、データベースで実行されます!
$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
  'mypassword');

魔法の引用

PHPの初期の頃、SQL注入攻撃は非常に恐れられていたため、PHPの背後にあるチームが言語にSQL注入に対する組み込みの保護を追加しました。まず、複数のクエリを一度に送信する機能を無効にしました。第二に、彼らは魔法の引用と呼ばれるものを追加しました。 PHPのこの保護機能は、ブラウザによって送信されたすべての値を自動的に分析し、アポストロフィのような「危険な」文字の前にbackSlashes()を挿入しました。
try {
  ⋮ do something risky
}
catch (ExceptionType $e) {
  ⋮ handle the exception
}
魔法の引用機能の問題は、それが防止されただけ多くの問題を引き起こしたことです。まず第一に、検出したキャラクターと、それらを消毒するために使用した方法(バックスラッシュでそれらを接頭する)は、状況によっては有効でした。サイトの文字エンコードと使用していたデータベースサーバーに応じて、これらの測定値は完全に効果がない可能性があります。 2番目に、提出された値がSQLクエリを作成するよりも、他の

の目的で使用された場合、それらのバックスラッシュは本当に面倒です。魔法の引用機能は、アポストロフィが含まれている場合、ユーザーの姓に偽のバックスラッシュを挿入します。 要するに、Magic Quotesの機能は悪い考えでした。バージョン5.4からPHPから削除されたためです。ただし、PHPの年齢とそこにあるコードの量により、それについてのいくつかの言及に出くわすかもしれないので、魔法の引用機能が何をすべきかを基本的に理解する価値があります。

魔法の引用が悪い考えとして特定されたら、PHP開発者からのアドバイスはそれをオフにすることでした。しかし、これは、いくつかのWebサーバーがオフになり、他のWebサーバーがオンになっていることを意味していました。これは開発者にとって頭痛の種でした。彼らは、コードを使用してそれをオフにするためにこれまでにそれをオフにすることを指示する必要がありました - これは一部の共有サーバーでは不可能でした - またはそれを説明するために追加のコードを書きます。

ほとんどの開発者は後者を選びました、そして、あなたは次のようないくつかのコードに出くわすかもしれません:

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
このようなレガシーコードでこのようなステートメントが表示された場合、IFステートメント内のコードは最近のPHPバージョンで実行されないため、ブロック全体を安全に削除できます。

このようなコードが表示されている場合、元の開発者が魔法の引用の問題を理解し、それを防ぐために最善を尽くしていたことを意味します。 PHP 5.4(これは、サポートされていないため、決して出くわすべきではありません)の時点で、get_magic_quotes_gpc()は常にfalseを返し、コードは実行されません。

魔法の引用について本当に知る必要があるのは、それが手元の問題に対する悪い解決策だったということだけです。もちろん、魔法の引用がなければ、問題の別の解決策を見つける必要があります。幸いなことに、PDOクラスは、「準備されたステートメント」と呼ばれるものを使用して、すべてのハードワークを行うことができます。

作成されたステートメント

準備されたステートメントは、事前にデータベースサーバーに送信した特別な種類のSQLクエリであり、サーバーに実行のために準備する機会を与えますが、実際には実行しません。 .phpスクリプトを書くようなものだと考えてください。コードはそこにありますが、実際にはWebブラウザのページにアクセスするまで実行されません。準備されたステートメントのSQLコードには、クエリが実行されるクエリ

の場合に値を提供するプレースホルダーを含めることができます。これらのプレースホルダーを埋めるとき、PDOは「危険な」キャラクターを自動的に守るのに十分賢いです。

挿入クエリを準備してから、ジョークのテキストとして$ _POST ['joketext']で安全に実行する方法を次に示します。

これを分解しましょう。一度に1つのステートメントです。まず、SQLクエリをPHP文字列として記述し、通常どおり変数($ sql)に保存します。ただし、この挿入クエリで珍しいのは、Joketext列に値が指定されていないことです。代わりに、この値のプレースホルダーが含まれています(:joketext)。今、冗談のフィールドについて心配しないでください。すぐに丸みを帯びます。

次に、PDOオブジェクトの準備方法($ PDO)を呼び出し、SQLクエリを引数として渡します。これにより、クエリがMySQLサーバーに送信され、クエリを実行するように

を準備するように依頼します。 Joketext列に値がないため、MySQLはまだ実行できません。準備メソッドは、pdostatementオブジェクト(はい、選択したクエリの結果を与えるのと同じ種類のオブジェクト)を返します。

MySQLが実行のためのステートメントを作成したので、pdostatementオブジェクト($ stmt)のbindvalueメソッドを呼び出すことにより、欠損値を送信できます。このメソッドを1回提供します(この場合、1つの値(ジョークテキスト)を提供する必要があります)。 ($ _POST ['JOKETEXT'])で記入したい。 MySQLは、解析する必要があるSQLコードではなく、個別の値を送信していることを知っているため、値の文字がSQLコードとして解釈されるリスクはありません。準備されたステートメントを使用する場合、SQLインジェクションの脆弱性は不可能です!

最後に、pdostatementオブジェクトの実行方法を呼び出して、mysqlに提供した値でクエリを実行するように指示します。 (はい、このpdostatementメソッドは、execと呼ばれるPDOオブジェクトの同様の方法とは異なり、executeと呼ばれます。PHPには多くの強みがありますが、一貫性はそれらの1つではありません!)

このコードについて気付く興味深いことの1つは、ジョークテキストの周りに引用符を配置したことがないということです。 :joketextは引用符なしでクエリの内部に存在し、bindvalueを呼び出したとき、$ _postアレイからプレーンジョークテキストを渡しました。準備されたステートメントを使用する場合、データベース(この場合はMySQL)がテキストが文字列であり、クエリが実行されたときにそのように扱われるほど賢いため、引用符は必要ありません。 このコードの長引く質問は、今日の日付を冗談型フィールドに割り当てる方法です。私たちは、mysqlが必要とするyyyy-mm-dd形式で今日の日付を生成するために、いくつかの派手なphpコードを書くことができましたが、mysql自体にこれを行う機能があることがわかりました - curdate:

>

MySQL Curdate関数は、Jokedate列の値として現在の日付を割り当てるために使用されます。 MySQLには実際にはこれらの機能が数十がありますが、必要に応じてのみ紹介します。 クエリができたので、「ジョークを追加」フォームの送信を処理するために以前に開始したIFステートメントを完了することができます。

しかし、待ってください!このIFステートメントには、もう1つのトリックがあります。以前のようにPHPテンプレートを表示する代わりに、新しいジョークをデータベースに追加したら、ユーザーのブラウザをジョークのリストにリダイレクトします。そうすれば、ユーザーは新しく追加されたジョークを見ることができます。それが、上記のIFステートメントの最後にある2行がそうすることです。

望ましい結果を達成するために、最初の本能は、新しいジョークを追加してjokes.html.phpテンプレートを使用してリストを表示した後、コントローラーがデータベースからジョークのリストを単純に取得できるようにすることです。これを行うことの問題は、ブラウザの観点からジョークのリストが「ジョークを追加」フォームを提出した結果であることです。ユーザーがページを更新する場合、ブラウザはそのフォームを再送信し、新しいジョークの別のコピーがデータベースに追加されます!これはめったに望ましい動作ではありません。

代わりに、ブラウザに、ジョークの更新されたリストを、フォームを再送信せずにリロードできる通常のWebページとして扱うことを望んでいます。これを行う方法は、HTTPリダイレクトを使用してブラウザのフォームの送信に回答することです。これは、ブラウザに別のページに移動するように指示する特別な応答です。 (HTTPはHyperText Transfer Protocolの略であり、VisitorのWebブラウザーとWebサーバーの間で交換されるリクエスト/応答通信を説明する言語です。)

PHPヘッダー関数は、ブラウザに送信された応答に特定のヘッダーを挿入できるようにすることにより、このような特別なサーバー応答を送信する手段を提供します。リダイレクトを信号にするには、ブラウザを次のように指示するページのURLでロケーションヘッダーを送信する必要があります。

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
この場合、jokes.phpにブラウザを送信したいと考えています。データベースに新しいジョークを追加した後、ブラウザをコントローラーにリダイレクトする2つの行です。

以下は、addjoke.phpコントローラーの完全なコードです

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

これを確認するためにこれを確認して、すべてが理にかなっていることを確認すると、データベースクエリを実行するコードのいずれかの前に新しいPDOオブジェクトを作成してデータベースに接続するコードが来る必要があることに注意してください。ただし、「ジョークの追加」フォームを表示するには、データベース接続は必要ありません。接続は、フォームが提出されたときにのみ行われます。

これをロードして、ブラウザを介して新しいジョークをデータベースに1つまたは2つ追加します。 あなたはそれを持っています:あなたは既存のジョークを見ることができます - そしてあなたのmysqlデータベースに新しいジョークを追加します。

データベースからデータを削除します

このセクションでは、ジョークデータベースサイトを最後に強化します。 Jokesページ(jokes.php)の各ジョークの横に、削除ラベルの付いたボタンを配置します。クリックすると、データベースからそのジョークを削除し、更新されたジョークリストを表示します。
$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
  'mypassword');
挑戦が好きなら、私の解決策を見るために読む前に、自分でこの機能を書くのを刺したいかもしれません。ブランドの新しい機能を実装していますが、主にこの章の前の例で採用したものと同じツールを使用します。ここにあなたを始めるためのいくつかのヒントがあります:

  • 新しいコントローラー(deletejoke.php)が必要です。
  • SQL Deleteコマンドが必要になります。これを第3章で紹介しました。
  • コントローラーで特定のジョークを削除するには、ユニークに識別する必要があります。ジョークテーブルのID列は、この目的を果たすために作成されました。ジョークを削除するリクエストで削除するには、ジョークのIDを渡す必要があります。これを行う最も簡単な方法は、隠されたフォームフィールドを使用することです。
  • 少なくとも、これにどのようにアプローチするかを考えるには、少し時間がかかります。解決策を見る準備ができたら、読んでください!

最初に、データベースからジョークのリストを取得する選択クエリを変更する必要があります。 JokeText列に加えて、各ジョークをユニークに識別できるようにID列を取得する必要があります。

また、データベースの結果を保存するwhileループを$ jokesアレイに変更するwhileループを変更する必要があります。各ジョークのテキストを配列にアイテムとして単に保存する代わりに、各ジョークのIDとテキストの両方を保存します。これを行う1つの方法は、$ jokes配列内の各アイテムをそれ自体の配列にすることです。

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
注:既にforeachループを使用してデータベースの結果行を処理することに切り替えている場合、それも正常に機能します:

new PDO('mysql:host=hostname;dbname=database', 'username',
  'password')
このループがコースを実行すると、$ JOKESアレイがあります。各アイテムは、ジョークのIDとそのテキストの2つのアイテムを持つ連想配列です。ジョーク($ jokes [n])ごとに、ID($ jokes [n] ['id'])とそのテキスト($ jokes [n] ['text'])を取得できます。

次のステップは、jokes.html.phpテンプレートを更新して、この新しい配列構造から各ジョークのテキストを取得し、各ジョークの削除ボタンを提供することです。 この更新されたコードのハイライトは次のとおりです

  • 各ジョークはフォームで表示され、提出された場合、そのジョークを削除します。フォームのアクション属性を使用して、これを新しいコントローラーdeletejoke.phpに信号します。
  • $ jokesアレイの各ジョークは、単純な文字列の代わりに2項目アレイで表されるため、ジョークのテキストを取得するためにこの行を更新する必要があります。これは、$ joke ['text]の代わりに$ joke [' text ']を使用して行います
  • このジョークを削除するためにフォームを送信すると、削除されるジョークのIDに沿って送信します。これを行うには、ジョークのIDを含むフォームフィールドが必要ですが、このフィールドをユーザーから隠しておくことをお勧めします。そのため、非表示のフォームフィールド(入力型= "非表示")を使用します。このフィールドの名前はIDであり、その値は削除されるジョークのIDです($ joke ['id'])。ジョークのテキストとは異なり、IDはユーザーがサビザの値ではないので、 htmlspecialcharsを使用してHTML-Safeにすることを心配する必要があります。ジョークがデータベースに追加されたときにID列のMySQLによって自動的に生成されるため、それが数になることを確信できます。
  • 送信ボタン(入力タイプ= "送信")は、クリック時にフォームを提出します。その値属性は、削除のラベルを提供します。
  • 最後に、このジョークのフォームを閉じます。
  • 注:HTMLを知っている場合、引用されたテキスト(ジョーク)の一部ではないため、フォームと入力タグがブロッククロート要素の外側に属すると考えているでしょう。

厳密に言えば、それは本当です。フォームとその入力は、実際にはブロッククオートの前または後のいずれかでなければなりません。残念ながら、そのタグ構造を表示するには、この本の範囲を超えた小さなCSS(カスケードスタイルのシート)コードが明確に必要です。

PHPとMySQLに関する本の中でCSSレイアウトテクニックを教えるのではなく、この不完全なマークアップを使用することにしました。このコードを現実の世界で使用する場合は、CSSの学習に時間を費やす必要があります(または、少なくともCSSの第一人者のサービスを保護します)。そうすれば、CSSが見栄えを良くするために必要なCSSを心配することなく、HTMLマークアップを完全に制御できます。 CSSレイアウトについて詳しく知りたい場合は、CSS Master、第3版

、Tiffany Brownをご覧ください。 次のCSSをJokes.cssに追加して、ボタンをジョークの右側に表示し、それらの間に線を引くようにします。

次の画像は、削除ボタンが追加された冗談リストがどのように見えるかを示しています。

しかし、待ってください!削除ボタンの動作に進む前に、一時的に一歩下がって、この行を注意深く見てみましょう。

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
ここでは、pdostatementオブジェクトをループしています。これにより、キーIDとjoketextが対応する値を含む$ row変数が提供されます。それを使用して、同じキーと値を持つ別の配列を構築します。 🎜>

これがひどく非効率的であることにすでに気付いたかもしれません。このコードを使用して同じことを達成できました:

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

しかし、私たちが知っているように、これはforeachループでも達成できます:

new PDO('mysql:host=hostname;dbname=database', 'username',
  'password')
この例では、データベースのレコードを反復し、配列を構築するためにForeachを使用しています。次に、テンプレート内の別のforeachループを使用して、配列をループします。これを書くことができます:

$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
  'mypassword');
今、$ジョークがテンプレートで反復されると、それは配列ではなく、pdostatementオブジェクトです。ただし、それは出力に影響を与えず、コードを節約します。実際、$ result変数を完全に省略し、pdostatementオブジェクトを$ jokes変数に直接読み込むことができます。完全なjokes.phpコントローラーは、次のようになりました:

try {
  ⋮ do something risky
}
catch (ExceptionType $e) {
  ⋮ handle the exception
}
コントローラーのレコードを繰り返しすることさえありませんが、テンプレート内のレコードを直接反復し、コードを保存し、ページをわずかに速く実行するだけです。一度記録。

新しい削除ボタンに戻る:この新機能を機能させるために残っているのは、関連するdeletejoke.phpを追加してデータベースに削除クエリを発行することだけです。

更新されたjokes.phpおよびdeletejoke.phpの完全なコードは、例として入手可能です。MySQL-DeleteJoke。
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';
このコードのチャンクは、章の前半で「ジョークを追加」コードを処理するために追加したコードとまったく同じように機能します。削除するジョークIDのプレースホルダーで削除クエリを準備することから始めます。

ヒント:ジョークIDはユーザーに見えない隠されたフォームフィールドによって提供されるため、この場合、データベースをSQLインジェクション攻撃から保護するために準備されたステートメントは不要だと思うかもしれません。実際、すべてのフォームフィールド(隠されたフィールドでも)は、最終的にユーザーの制御下にあります。たとえば、広く配布されているブラウザアドオンがあります。たとえば、非表示のフォームフィールドを表示し、ユーザーが編集できるようになります。覚えておいてください:ブラウザから提出された価値は、サイトのセキュリティを保護することに関して最終的に疑わしいです。

その後、提出された値の$ _POST ['ID']をそのプレースホルダーにバインドし、クエリを実行します。そのクエリが達成されたら、PHPヘッダー関数を使用して、ブラウザに新しいリクエストを送信して、ジョークの更新リストを表示するように依頼します。

注:自分でこの例に取り組んだ場合、ジョークごとに削除ボタンを含むhtmlフォーム全体を書くのではなく、ジョークごとに削除ハイパーリンクを提供することで、最初の本能は、あなたの最初の本能があったかもしれません。ページ。確かに、このようなリンクのコードははるかに簡単になります:

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

要するに、ハイパーリンクを使用してアクションを実行してはいけません(ジョークの削除など)。それらは、いくつかの関連コンテンツへのリンクを提供するためにのみ使用する必要があります。 Method = "Get"のフォームにも同じことが言えます。これは、既存のデータのクエリを実行するためにのみ使用する必要があります。アクションは、method = "post"が送信されるフォームの結果としてのみ実行する必要があります。

この理由は、method = "post"を使用してフォームがブラウザーと関連ソフトウェアによって異なって扱われることです。 method = "post"を使用してフォームを送信してから、ブラウザの更新ボタンをクリックする場合、たとえば、ブラウザはフォームを再提出することを確認するかどうかを尋ねます。ブラウザは、methods = "get"を使用してリンクやフォームに関して再提出に対して同様の保護を持っていません。

検索エンジンやその他のWebクローラーも、サイトのすべてのリンクをフォローして、検索結果にサイトのページを表示するタイミングを作成するために、

ハイパーリンクの結果としてサイトが冗談を削除した場合、検索エンジンがサイトを見つけるたびにジョークが削除されるのを見つけることができます。 ミッションが達成されました

この章では、オブジェクトを作成して呼び出してMySQLデータベースサーバーとインターフェイスすることができる内蔵PHPクラス(PDO、PDOEXCEPTION、およびPDOSTATEMENT)のコレクションであるPHPデータオブジェクト(PDO)についてすべてを学びました。彼らが提供する方法。あなたがそれに参加している間、あなたはまた、オブジェクト指向プログラミング(OOP)の基本を取り上げました。これはPHP初心者にとっては決して偉業ではありません!

PDOオブジェクトを使用して、IJDBデータベースをオンラインで公開し、訪問者がジョークを追加および削除できるようにする最初のデータベース駆動型Webサイトを作成しました。 ある意味では、この章がこの本の記載されている使命を達成したと言えます。データベース駆動型のWebサイトを構築する方法を教えてください。もちろん、この章の例には、裸の必需品のみが含まれていました。本の残りの部分では、この章で構築することを学んだスケルトンを肉付けする方法を紹介します。 第5章では、MySQLワークベンチのSQLクエリウィンドウに戻ります。リレーショナルデータベースの原則と高度なSQLクエリを使用して、より複雑なタイプの情報を表現する方法を学び、訪問者が追加するジョークに対してクレジットを提供します!

php&mysql:初心者から忍者、第7版

からこの抜粋を楽しんだことを願っています。完全な本は、SitePoint Premiumで、お気に入りの本や電子書籍の小売業者から入手できます。

Web上にMySQLからのデータの表示に関するFAQ

Webブラウザーを使用してMySQLデータベースに接続するにはどうすればよいですか?

Webブラウザーを使用してMySQLデータベースに接続するには、PHPMyAdminなどのWebベースのインターフェイスが必要です。 PhpMyAdminは、Web上でMySQLの管理を処理することを目的としたPHPで書かれたフリーソフトウェアツールです。使用するには、サーバーにインストールしてから、サーバーのIPアドレスを入力して「/phpmyAdmin」を入力して、Webブラウザーからアクセスする必要があります。 MySQL資格情報を入力するように求められ、認証されると、ブラウザからデータベースを直接管理できます。 🎜> MySQL Shellは、MySQLの高度なクライアントおよびコードエディターです。 JavaScriptとPythonにスクリプト機能を提供し、MySQLを使用するためのAPIが含まれています。それを使用して、データクエリと更新、およびさまざまな管理操作を実行できます。 MySQLシェルはローカルマシンにインストールできます。適切な資格情報を使用してMySQLサーバーに接続できます。あなたのウェブサイト上のMySQLデータ。これは通常、PHPのようなサーバー側のスクリプト言語で行われます。 PHPスクリプトは、MySQLデータベースに接続し、クエリを実行してデータを取得し、そのデータをWebサイトに表示します。これは、ブログやニュースサイトなど、変更のコンテンツを表示する必要がある動的なWebサイトの一般的なアプローチです。

MySQLデータベースを保護するにはどうすればよいですか? 。まず、ファイアウォールやその他の適切なセキュリティ対策により、MySQLサーバーが安全な環境で実行されていることを確認します。次に、MySQLアカウントに強力で一意のパスワードを使用します。第三に、MySQLアカウントの特権を制限して、タスクを実行するために必要な権限のみがあるようにします。最後に、既知の脆弱性から保護するためにMySQLサーバーを定期的に更新してパッチを当てます。

mySQLデータベースをバックアップするにはどうすればよいですか? 。このツールは、データベースをゼロから再作成できるコマンドを備えたSQLファイルを作成します。このツールをサーバーのコマンドラインから実行して、バックアップするデータベースの名前と作成するファイルの名前を指定できます。 🎜> MySQLデータベースを最適化するには、いくつかのステップが含まれます。まず、The Optimize Tableコマンドを使用して、テーブルデータの物理ストレージを再編成し、ディスクスペースを削減できます。次に、MySQLクエリオプティマイザーを使用して、クエリの効率を向上させることができます。第三に、インデックス作成を使用して、データの検索をスピードアップできます。

MySQLデータベースにデータをインポートするにはどうすればよいですか?

Load Data Infileコマンドを使用してMySQLデータベースにデータをインポートできます。このコマンドは、テキストファイルから非常に高速でテーブルに行を読み取ります。ファイル名はリテラル文字列として指定する必要があります。

mysqlデータベースからデータをエクスポートするにはどうすればよいですか?

selectのoutfileコマンドを使用してmysqlデータベースからデータをエクスポートできます。このコマンドは、SERECTステートメントの結果をサーバーホストのファイルに書き込みます。指示。このコマンドは、テーブル内の既存の行を変更します。テーブル名、更新する列、および新しい値を指定し、更新する行を選択する句を指定します。 > deleteコマンドを使用して、MySQLデータベースからデータを削除できます。このコマンドは、既存の行をテーブルから削除します。削除する行を選択するために、テーブル名とWhere句を指定します。削除されたデータを回復できないため、このコマンドに注意してください。

以上がWebでMySQLからのデータの表示:はじめにの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
セッションを保存するためにデータベースを使用することの利点は何ですか?セッションを保存するためにデータベースを使用することの利点は何ですか?Apr 24, 2025 am 12:16 AM

データベースストレージセッションを使用することの主な利点には、持続性、スケーラビリティ、セキュリティが含まれます。 1。永続性:サーバーが再起動しても、セッションデータは変更されないままになります。 2。スケーラビリティ:分散システムに適用され、セッションデータが複数のサーバー間で同期されるようにします。 3。セキュリティ:データベースは、機密情報を保護するための暗号化されたストレージを提供します。

PHPでカスタムセッション処理をどのように実装しますか?PHPでカスタムセッション処理をどのように実装しますか?Apr 24, 2025 am 12:16 AM

PHPでのカスタムセッション処理の実装は、SessionHandlerInterfaceインターフェイスを実装することで実行できます。具体的な手順には、次のものが含まれます。1)CussentsessionHandlerなどのSessionHandlerInterfaceを実装するクラスの作成。 2)セッションデータのライフサイクルとストレージ方法を定義するためのインターフェイス(オープン、クローズ、読み取り、書き込み、破壊、GCなど)の書き換え方法。 3)PHPスクリプトでカスタムセッションプロセッサを登録し、セッションを開始します。これにより、データをMySQLやRedisなどのメディアに保存して、パフォーマンス、セキュリティ、スケーラビリティを改善できます。

セッションIDとは何ですか?セッションIDとは何ですか?Apr 24, 2025 am 12:13 AM

SessionIDは、ユーザーセッションのステータスを追跡するためにWebアプリケーションで使用されるメカニズムです。 1.ユーザーとサーバー間の複数のインタラクション中にユーザーのID情報を維持するために使用されるランダムに生成された文字列です。 2。サーバーは、ユーザーの複数のリクエストでこれらの要求を識別および関連付けるのに役立つCookieまたはURLパラメーターを介してクライアントに生成および送信します。 3.生成は通常、ランダムアルゴリズムを使用して、一意性と予測不可能性を確保します。 4.実際の開発では、Redisなどのメモリ内データベースを使用してセッションデータを保存してパフォーマンスとセキュリティを改善できます。

ステートレス環境(APIなど)でセッションをどのように処理しますか?ステートレス環境(APIなど)でセッションをどのように処理しますか?Apr 24, 2025 am 12:12 AM

APIなどのステートレス環境でのセッションの管理は、JWTまたはCookieを使用して達成できます。 1。JWTは、無国籍とスケーラビリティに適していますが、ビッグデータに関してはサイズが大きいです。 2.cookiesはより伝統的で実装が簡単ですが、セキュリティを確保するために慎重に構成する必要があります。

セッションに関連するクロスサイトスクリプティング(XSS)攻撃からどのように保護できますか?セッションに関連するクロスサイトスクリプティング(XSS)攻撃からどのように保護できますか?Apr 23, 2025 am 12:16 AM

セッション関連のXSS攻撃からアプリケーションを保護するには、次の測定が必要です。1。セッションCookieを保護するためにHTTPonlyとセキュアフラグを設定します。 2。すべてのユーザー入力のエクスポートコード。 3.コンテンツセキュリティポリシー(CSP)を実装して、スクリプトソースを制限します。これらのポリシーを通じて、セッション関連のXSS攻撃を効果的に保護し、ユーザーデータを確保できます。

PHPセッションのパフォーマンスを最適化するにはどうすればよいですか?PHPセッションのパフォーマンスを最適化するにはどうすればよいですか?Apr 23, 2025 am 12:13 AM

PHPセッションのパフォーマンスを最適化する方法は次のとおりです。1。遅延セッション開始、2。データベースを使用してセッションを保存します。これらの戦略は、高い並行性環境でのアプリケーションの効率を大幅に改善できます。

session.gc_maxlifetime構成設定とは何ですか?session.gc_maxlifetime構成設定とは何ですか?Apr 23, 2025 am 12:10 AM

thesession.gc_maxlifettinginttinginphpdethinesthelifsessessiondata、setinseconds.1)it'sconfiguredinphp.iniorviaini_set()。 2)AbalanceSneededToAvoidPerformanceIssues andunexpectedLogouts.3)php'sgarbagecollectionisisprobabilistic、影響を受けたBygc_probabi

PHPでセッション名をどのように構成しますか?PHPでセッション名をどのように構成しますか?Apr 23, 2025 am 12:08 AM

PHPでは、session_name()関数を使用してセッション名を構成できます。特定の手順は次のとおりです。1。session_name()関数を使用して、session_name( "my_session")などのセッション名を設定します。 2。セッション名を設定した後、session_start()を呼び出してセッションを開始します。セッション名の構成は、複数のアプリケーション間のセッションデータの競合を回避し、セキュリティを強化することができますが、セッション名の一意性、セキュリティ、長さ、設定タイミングに注意してください。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。