Rumah >pembangunan bahagian belakang >tutorial php >Memaparkan data dari MySQL di Web: Pengenalan

Memaparkan data dari MySQL di Web: Pengenalan

Jennifer Aniston
Jennifer Anistonasal
2025-02-08 09:45:09509semak imbas

Memaparkan data dari MySQL di Web: Pengenalan

Artikel berikut adalah petikan dari

PHP & MySQL: Novice to Ninja, Edisi ke-7 , panduan tangan untuk mempelajari semua alat, prinsip, dan teknik yang diperlukan untuk membina aplikasi web profesional. Dalam tutorial akhir ini dalam siri ini, anda akan belajar bagaimana untuk mengambil maklumat yang disimpan dalam pangkalan data MySQL dan memaparkannya di laman web untuk semua untuk dilihat.


    menyediakan persekitaran pembangunan PHP anda dengan Docker
  • Panduan Pemula untuk PHP
  • Memperkenalkan MySQL: Panduan Pemula
  • memaparkan data dari MySQL di web: Pengenalan

Ini - perkara yang anda mendaftar! Dalam bab ini, anda akan belajar bagaimana untuk mengambil maklumat yang disimpan dalam pangkalan data MySQL dan memaparkannya di laman web untuk dilihat oleh semua.

Setakat ini, anda telah menulis kod PHP pertama anda dan mempelajari asas-asas MySQL, enjin pangkalan data relasi, dan PHP, bahasa skrip sisi pelayan.

Sekarang anda sudah bersedia untuk belajar bagaimana menggunakan alat ini bersama -sama untuk membuat laman web di mana pengguna dapat melihat data dari pangkalan data dan bahkan menambah mereka sendiri.

Nota: Seperti dalam Bab 3, saya menggunakan "MySQL" di sini untuk merujuk kepada protokol pangkalan data. Skrip PHP anda akan melakukan perkara yang sama. Terdapat banyak rujukan dalam bab ini - dan dalam kod PHP yang anda akan tulis - kepada "MySQL", walaupun kita sebenarnya menyambung ke pangkalan data MariaDB.

gambar besar Memaparkan data dari MySQL di Web: Pengenalan

Sebelum kita melompat ke hadapan, ia patut mengambil langkah mundur untuk gambaran yang jelas tentang matlamat utama kita. Kami mempunyai dua alat yang berkuasa di atas pelupusan kami: bahasa skrip PHP dan enjin pangkalan data MySQL. Penting untuk memahami bagaimana ini akan sesuai bersama.

Tujuan menggunakan MySQL untuk laman web kami adalah untuk membolehkan kandungan ditarik secara dinamik dari pangkalan data untuk membuat laman web untuk dilihat dalam penyemak imbas biasa. Oleh itu, pada satu hujung sistem anda mempunyai pelawat ke laman web anda menggunakan pelayar web untuk meminta halaman. Penyemak imbas itu mengharapkan untuk menerima dokumen HTML standard sebagai balasannya. Di hujung yang lain, anda mempunyai kandungan laman web anda, yang duduk dalam satu atau lebih jadual dalam pangkalan data MySQL yang hanya memahami bagaimana untuk bertindak balas terhadap pertanyaan SQL (perintah).

Seperti yang ditunjukkan dalam imej di atas, bahasa skrip PHP adalah antara yang bercakap kedua-dua bahasa. Ia memproses permintaan halaman dan mengambil data dari pangkalan data MySQL menggunakan pertanyaan SQL seperti yang anda gunakan untuk membuat jadual jenaka dalam Bab 3. >

Begitu jelas dan segar dalam fikiran anda, inilah yang berlaku apabila ada pelawat ke halaman di laman web anda:

  1. Pelayar web pelawat meminta laman web dari pelayan web anda.
  2. Perisian pelayan web (biasanya Apache atau nginx) mengakui bahawa fail yang diminta adalah skrip PHP, jadi pelayan menyala penterjemah PHP untuk melaksanakan kod yang terkandung dalam fail.
  3. Perintah PHP tertentu (yang akan menjadi tumpuan bab ini) Sambungkan ke pangkalan data MySQL dan minta kandungan yang dimiliki dalam laman web.
  4. pangkalan data MySQL bertindak balas dengan menghantar kandungan yang diminta ke skrip php.
  5. Skrip PHP menyimpan kandungan ke dalam satu atau lebih pembolehubah PHP, kemudian menggunakan pernyataan ECHO untuk mengeluarkan kandungan sebagai sebahagian daripada laman web.
  6. penterjemah PHP selesai dengan menyerahkan salinan HTML yang telah dibuat ke pelayan web.
  7. Pelayan web menghantar HTML ke pelayar web kerana ia akan menjadi fail HTML biasa, kecuali yang bukannya datang terus dari fail HTML, halaman itu adalah output yang disediakan oleh penterjemah PHP. Walau bagaimanapun, penyemak imbas itu tidak dapat mengetahui ini. Setakat penyemak imbas, ia meminta dan menerima laman web seperti yang lain.
Membuat Akaun Pengguna MySQL

Agar PHP menyambung ke pelayan pangkalan data MySQL anda, ia perlu menggunakan nama pengguna dan kata laluan. Setakat ini, semua pangkalan data jenaka anda mengandungi beberapa pithy

Bon Mots , tetapi sebelum ini ia mungkin mengandungi maklumat sensitif seperti alamat e -mel dan butiran peribadi lain mengenai pengguna laman web anda. Atas sebab ini, MySQL direka untuk menjadi sangat selamat, memberi anda kawalan yang ketat terhadap apa yang akan diterima dan apa yang dibenarkan olehnya. Persekitaran Docker sudah mengandungi pengguna MySQL dalam Bab 3, yang telah anda gunakan untuk log masuk ke pelayan MySQL.

anda

boleh

menyambung ke pangkalan data dari skrip php anda menggunakan nama pengguna yang sama (v.je) dan kata laluan (v.je), tetapi berguna untuk membuat akaun baru - kerana jika anda mempunyai Pelayan web, anda mungkin mahu menggunakannya untuk menjadi tuan rumah lebih daripada satu laman web. Dengan memberikan setiap laman web akaun pengguna sendiri, anda akan mempunyai lebih banyak kawalan ke atas siapa yang mempunyai akses kepada data untuk mana -mana laman web yang diberikan. Jika anda bekerja dengan pemaju lain, anda boleh memberi mereka akses ke laman web yang mereka kerjakan, tetapi tidak lagi. anda harus membuat akaun pengguna baru dengan hanya keistimewaan khusus yang diperlukan untuk berfungsi pada pangkalan data IJDB yang bergantung kepada laman web anda. Mari kita buat sekarang.

Untuk membuat pengguna, buka MySQL Workbench dan sambungkan ke pelayan anda. Kemudian jalankan pertanyaan berikut:

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

pertanyaan pertama adalah penjelasan sendiri: ia mencipta pengguna yang dipanggil ijdbuser dengan kata laluan mypassword. Tanda % selepas nama pengguna menunjukkan bahawa pangkalan data boleh disambungkan dari mana -mana lokasi. Pertanyaan kedua memberikan pengguna penuh kepada skema IJDB, akibatnya pengguna ini dapat melihat dan mengubah suai semua jadual, lajur dan data dalam skema IJDB tetapi tidak mempunyai akses kepada apa -apa di luarnya.

Sekarang bahawa pengguna ijdbuser telah dibuat, kita boleh menggunakannya untuk menyambung ke pangkalan data. Ia mungkin untuk menyediakan sambungan dalam MySQL Workbench dengan pengguna ini, tetapi sejak keizinannya terhad, lebih baik untuk memastikan MySQL Workbench menggunakan akaun V.JE. Sebaliknya, kami akan menggunakan pengguna baru apabila menyambung dari skrip PHP.

menyambung ke MySQL dengan php

Sebelum anda dapat mengambil kandungan dari pangkalan data MySQL anda untuk dimasukkan ke dalam laman web, anda mesti tahu bagaimana untuk membuat sambungan ke MySQL dari dalam skrip PHP. Setakat ini, anda telah menggunakan aplikasi yang dipanggil MySQL Workbench untuk menyambung ke pangkalan data anda. Sama seperti MySQL Workbench boleh menyambung terus ke pelayan MySQL yang sedang berjalan, begitu juga skrip PHP anda sendiri.

Walaupun bab ini bercakap sepenuhnya tentang menyambung ke MySQL dari PHP, kami sebenarnya menyambung ke pangkalan data MariaDB yang dibincangkan dalam bab sebelumnya. PHP tidak dapat melihat apa -apa perbezaan antara MySQL dan MariaDB, kerana mereka boleh ditukar ganti. Saya akan merujuk kepada pangkalan data sebagai MySQL sepanjang, kerana semua arahan yang digunakan boleh digunakan untuk menyambung ke pelayan pangkalan data MySQL atau MariaDB.

Pangkalan data MySQL yang asal menyediakan kaedah piawai untuk

pelanggan seperti MySQL Workbench dan PHP untuk berkomunikasi dengan pelayan. MariaDB menyalin piawaian itu, dan semua arahan dalam PHP menggunakan nama mysql , jadi untuk menyimpan perkara yang mudah, saya akan menggunakan istilah mysql sepanjang bab ini untuk merujuk kepada pangkalan data.

Terdapat tiga kaedah menyambung ke pelayan MySQL dari PHP:

    Perpustakaan MySQL
  • Perpustakaan MySQLI
  • Perpustakaan PDO
Ini semua pada dasarnya melakukan pekerjaan yang sama - menyambung ke pangkalan data dan menghantar pertanyaan kepadanya - tetapi mereka menggunakan kod yang berbeza untuk mencapainya.

Perpustakaan MySQL adalah kaedah tertua untuk menyambung ke pangkalan data dan diperkenalkan dalam Php 2.0. Ciri -ciri yang terkandungnya adalah minimum, dan ia digantikan oleh MySQLI seperti Php 5.0 (dikeluarkan pada tahun 2004).

Untuk menyambung dan menanyakan pangkalan data menggunakan perpustakaan MySQL lama, fungsi seperti mysql_connect () dan mysql_query () digunakan. Fungsi -fungsi ini telah ditutup - bermakna mereka harus dielakkan - sejak Php 5.5, dan telah dikeluarkan dari PHP sepenuhnya sejak Php 7.0.

Walaupun kebanyakan pemaju melihat sebab perubahan itu sebaik sahaja Php 5.0 dibebaskan, masih terdapat beratus-ratus artikel dan contoh kod di web menggunakan fungsi MySql_* yang tidak wujud sekarang-walaupun fakta bahawa MySqli telah berkesan perpustakaan yang lebih disukai selama lima belas tahun.

Jika anda melihat contoh kod yang mengandungi baris mysql_connect (), periksa tarikh artikel. Ia mungkin dari awal tahun 2000 -an, dan dalam pengaturcaraan, anda tidak boleh mempercayai apa -apa yang lama. Perkara berubah sepanjang masa - itulah sebabnya buku ini berada di edisi ketujuhnya!

Dalam PHP 5.0, Perpustakaan MySQLI - berdiri untuk "MySQL Infored" - dikeluarkan untuk menangani beberapa batasan di perpustakaan MySQL yang asal. Anda boleh mengenal pasti penggunaan mysqli dengan mudah, kerana kod tersebut akan menggunakan fungsi seperti mysqli_connect () dan mysqli_query ().

Tidak lama selepas pembebasan Perpustakaan MySQLI di PHP 5.0, Php 5.1 telah dikeluarkan, dengan sejumlah besar perubahan yang membantu membentuk cara kami menulis PHP hari ini (kebanyakannya berkaitan dengan pengaturcaraan berorientasikan objek, yang anda akan lihat banyak kemudian dalam buku ini). Salah satu perubahan utama dalam PHP 5.1 ialah ia memperkenalkan perpustakaan ketiga, PDO (objek data PHP), untuk menyambung ke pangkalan data MySQL.

Terdapat beberapa perbezaan antara PDO dan MySQLI, tetapi yang utama ialah anda boleh menggunakan perpustakaan PDO untuk menyambung ke hampir mana -mana pelayan pangkalan data - seperti pelayan Oracle, atau Microsoft SQL Server. Bagi pemaju, kelebihan terbesar pendekatan generik ini ialah, apabila anda telah belajar bagaimana menggunakan perpustakaan untuk berinteraksi dengan pangkalan data MySQL, sangat mudah untuk berinteraksi dengan pelayan pangkalan data yang lain.

Boleh dikatakan, lebih mudah untuk menulis kod untuk PDO, dan terdapat beberapa nuansa yang boleh membuat kod PDO lebih mudah dibaca - parameter yang dinamakan dalam pernyataan yang disediakan sebagai manfaat utama. (Jangan risau, saya akan menerangkan apa yang dimaksudkan kemudian.)

Atas sebab -sebab ini, projek PHP yang paling terkini menggunakan perpustakaan PDO, dan ia adalah perpustakaan yang saya akan tunjukkan kepada anda cara menggunakan dalam buku ini. Untuk maklumat lanjut mengenai perbezaan, lihatlah artikel SitePoint "Pengenalan semula PDO-cara yang betul untuk mengakses pangkalan data dalam PHP".

Selepas pelajaran sejarah kecil itu, anda mungkin tidak sabar -sabar untuk kembali menulis kod. Berikut adalah cara anda menggunakan PDO untuk mewujudkan sambungan ke pelayan MySQL:

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
Buat masa ini, fikirkan PDO baru sebagai fungsi terbina dalam, sama seperti fungsi RAND yang kami gunakan dalam Bab 2. Jika anda berfikir "Hei, fungsi tidak boleh

ruang Nama! ", Anda lebih pintar daripada beruang purata, dan saya akan menerangkan dengan tepat apa yang berlaku di sini dalam seketika. Walau apa pun, ia memerlukan tiga hujah:

  • rentetan yang menyatakan jenis pangkalan data (mysql :), nama hos pelayan (host = hostname;), dan nama pangkalan data (dbName = pangkalan data)
  • nama pengguna mysql yang anda mahu php menggunakan
  • kata laluan mysql untuk nama pengguna

anda mungkin ingat dari Bab 2 bahawa fungsi PHP biasanya mengembalikan nilai apabila mereka dipanggil. "Fungsi" PDO baru ini mengembalikan nilai yang dipanggil objek PDO yang mengenal pasti sambungan yang telah ditubuhkan. Oleh kerana kami berhasrat untuk menggunakan sambungan, kami harus memegang nilai ini dengan menyimpannya dalam pembolehubah. Begini cara yang kelihatan, dengan nilai yang diperlukan untuk menyambung ke pangkalan data anda:

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

Anda mungkin dapat melihat apa yang sedang berlaku dengan dua hujah terakhir: mereka nama pengguna dan kata laluan yang anda buat sebelum ini dalam bab ini.

hujah pertama adalah sedikit lebih rumit. Bahagian DBName = IJDB memberitahu PDO untuk menggunakan pangkalan data (juga dirujuk sebagai skema ) yang dipanggil IJDB. Sebarang pertanyaan yang dijalankan dari PHP akan lalai ke jadual dalam skema itu. Pilih * dari jenaka akan memilih rekod dari jadual jenaka dalam skema IJDB.

Walaupun anda biasa dengan PHP, PDO dan MySQL sudah, tuan rumah = bahagian MySQL kelihatan mengelirukan. Biasanya, ini akan menjadi tuan rumah = localhost (merujuk kepada komputer tempatan, mesin yang sama yang menjalankan PHP) atau menunjuk kepada nama domain tertentu di mana pangkalan data dihoskan, seperti host = sitepoint.com.

kenapa host = mysql, dan apa yang dirujuk oleh MySQL di sini? Dalam Docker, setiap perkhidmatan diberi nama. Jika anda mengkaji fail docker-compose.yml yang mengkonfigurasi pelayan, perkhidmatan pangkalan data dipanggil MySQL, dan di Docker, satu perkhidmatan boleh menyambung ke yang lain menggunakan nama perkhidmatan yang lain.

Argumen mengetepikan, apa yang penting untuk dilihat di sini ialah nilai yang dikembalikan oleh PDO baru disimpan dalam pembolehubah bernama $ PDO.

Server MySQL adalah sekeping perisian yang benar -benar berasingan dari pelayan web. Oleh itu, kita mesti mempertimbangkan kemungkinan bahawa pelayan mungkin tidak tersedia atau tidak dapat diakses kerana gangguan rangkaian, atau kerana kombinasi nama pengguna/kata laluan yang anda berikan ditolak oleh pelayan, atau kerana anda hanya terlupa untuk memulakan pelayan MySQL anda! Dalam kes sedemikian, PDO baru tidak akan berjalan, dan akan membuang pengecualian PHP.

Nota: Sekurang -kurangnya secara lalai, PHP boleh dikonfigurasikan supaya tidak terkecuali dilemparkan dan ia tidak akan menyambung. Ini tidak biasanya tingkah laku yang diinginkan, kerana ia menjadikannya lebih sukar untuk menyelesaikan apa yang berlaku.

Jika anda tertanya -tanya apa yang dimaksudkan untuk "membuang pengecualian PHP", bersiaplah! Anda akan menemui lebih banyak ciri bahasa PHP.

Pengecualian PHP adalah apa yang berlaku apabila anda memberitahu PHP untuk melaksanakan tugas dan ia tidak dapat melakukannya. PHP akan cuba melakukan apa yang diberitahu, tetapi akan gagal; Dan untuk memberitahu anda tentang kegagalan, ia akan membuang pengecualian kepada anda. Pengecualian adalah sedikit lebih daripada PHP hanya terhempas dengan mesej ralat tertentu. Apabila pengecualian dilemparkan, PHP berhenti. Tiada baris kod selepas ralat akan dilaksanakan.

Sebagai pemaju yang bertanggungjawab, tugas anda untuk menangkap pengecualian itu dan melakukan sesuatu mengenainya supaya program dapat diteruskan.

NOTA: Jika anda tidak menangkap pengecualian, PHP akan berhenti menjalankan skrip PHP anda dan memaparkan mesej ralat yang hebat. Mesej ralat itu juga akan mendedahkan kod skrip anda yang melemparkan ralat. Dalam kes ini, kod itu mengandungi nama pengguna dan kata laluan MySQL anda, jadi sangat penting untuk mengelakkan mesej ralat yang dilihat oleh pengguna!

3

Anda boleh memikirkan percubaan ... menangkap pernyataan seperti jika ... pernyataan lain, kecuali bahawa blok kedua kod adalah apa yang berlaku jika blok pertama kod gagal dijalankan.
CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';

keliru? Saya tahu saya membuang (tidak ada yang dimaksudkan) banyak konsep baru pada anda, tetapi ia akan lebih masuk akal jika saya meletakkannya bersama -sama dan menunjukkan kepada anda apa yang kami ada:

Seperti yang anda lihat, kod ini adalah percubaan ... menangkap pernyataan. Di blok cuba di bahagian atas, kami cuba menyambung ke pangkalan data menggunakan PDO baru. Jika ini berjaya, kami menyimpan objek PDO yang dihasilkan dalam $ PDO supaya kami dapat bekerja dengan sambungan pangkalan data baru kami. Sekiranya sambungan berjaya, pembolehubah output $ ditetapkan ke mesej yang akan dipaparkan kemudian.
new PDO('mysql:host=hostname;dbname=database', 'username',
  'password')

yang penting, di dalam percubaan ... menangkap pernyataan, sebarang kod selepas pengecualian telah dibuang tidak akan dilaksanakan. Dalam kes ini, jika menyambung ke pangkalan data melemparkan pengecualian (mungkin kata laluan salah, atau pelayan tidak bertindak balas), pembolehubah output $ tidak akan ditetapkan ke "sambungan pangkalan data yang ditubuhkan".

Jika percubaan sambungan pangkalan data kami gagal, PHP akan membuang PDOException, yang merupakan jenis pengecualian yang dibuang PDO baru. Oleh itu, blok tangkapan kami mengatakan bahawa ia akan menangkap pdoException (dan menyimpannya dalam pembolehubah bernama $ e). Di dalam blok itu, kami menetapkan output pembolehubah $ untuk mengandungi mesej mengenai apa yang salah.

Walau bagaimanapun, mesej ralat ini tidak begitu berguna. Apa yang memberitahu kami ialah PDO tidak dapat menyambung ke pelayan pangkalan data. Lebih baik mempunyai maklumat tentang mengapa itu - sebagai contoh, kerana nama pengguna dan kata laluan tidak sah.

Pembolehubah $ e mengandungi butiran mengenai pengecualian yang berlaku, termasuk mesej ralat yang menerangkan masalah. Kami boleh menambah ini ke pemboleh ubah output menggunakan Concatenation:

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

NOTA: Pembolehubah $ e bukan rentetan, tetapi objek. Kami akan datang kepada apa yang dimaksudkan tidak lama lagi. Buat masa ini, semua yang anda perlu tahu ialah kod $ e-> getMessage () mendapat mesej ralat berdasarkan pengecualian khusus yang berlaku.

seperti jika ... pernyataan lain, salah satu daripada dua cabang percubaan ... Catch pernyataan dijamin untuk dijalankan. Sama ada kod dalam blok percubaan akan berjaya dilaksanakan, atau kod di blok tangkapan akan dijalankan. Tidak kira sama ada sambungan pangkalan data berjaya, akan ada mesej dalam pembolehubah output $ - sama ada mesej ralat, atau mesej yang mengatakan sambungan itu berjaya.

Akhirnya, tanpa mengira sama ada blok percubaan berjaya, atau blok tangkapan berjalan, output templat.html.php dimasukkan. Ini adalah templat generik yang hanya memaparkan beberapa teks ke halaman:

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

Kod lengkap boleh didapati dalam Contoh: MySQL-Connect.

Apabila templat dimasukkan, ia akan memaparkan mesej ralat atau mesej "sambungan pangkalan data yang ditubuhkan".

Saya harap kod yang disebutkan di atas kini masuk akal kepada anda. Jangan ragu untuk kembali ke permulaan bahagian ini dan baca lagi jika anda hilang, kerana terdapat beberapa konsep rumit di sana. Sebaik sahaja anda mempunyai cengkaman yang kukuh pada kod, bagaimanapun, anda mungkin akan menyedari bahawa saya masih meninggalkan satu misteri yang tidak dapat dijelaskan: PDOS. Apa sebenarnya PDO baru, dan apabila saya berkata ia mengembalikan "objek PDO", apa sebenarnya objek?

Nota: Semua kod sampel yang dimuat turun termasuk skema yang dipanggil ijdb_sample dan pengguna yang dipanggil ijdb_sample, supaya anda dapat menjalankannya tanpa mengira apa yang anda panggil skema dan pengguna anda. Fail yang mengandungi pangkalan data disediakan sebagai pangkalan data.sql, yang boleh anda import.

Jika anda menggunakan penonton kod sampel berasaskan web yang disediakan, pangkalan data IDBJ_Sample akan dibuat semasa anda memuat sampel, tetapi sebarang perubahan pada skema ini akan hilang apabila anda melihat sampel lain. (Anda boleh merosakkan perkara, dan beralih ke sampel dan belakang yang lain akan menetapkannya semula, tetapi jika anda ingin menyimpan apa -apa perubahan yang anda buat, buatnya dalam skema yang anda buat.) Jika anda ingin memuatkan data sampel ke dalam skema anda menggunakan MySQL Workbench, Import Database.sql dari direktori projek dengan memilih import/memulihkan data. Kemudian pilih import dari fail mandiri, semak imbas ke pangkalan data.sql, dan pilih nama skema anda dalam skema sasaran lalai. Jika anda telah membuat jadual dengan nama yang sama, mereka akan ditimpa dan semua rekod hilang.

kursus kemalangan dalam pengaturcaraan berorientasikan objek

anda mungkin melihat perkataan "objek" yang mula merayap ke dalam perbendaharaan kata saya di bahagian sebelumnya. PDO adalah data php

objek

lanjutan, dan PDO baru mengembalikan objek PDO

. Dalam bahagian ini, saya ingin menerangkan objek apa yang berlaku.

Mungkin anda telah melihat istilah pengaturcaraan berorientasikan objek (OOP) dalam penerokaan PHP sendiri atau pengaturcaraan secara umum. OOP adalah gaya pengaturcaraan yang sangat sesuai untuk membina program yang sangat kompleks dengan banyak bahagian. Kebanyakan bahasa pengaturcaraan dalam penggunaan aktif hari ini menyokong OOP. Sesetengah daripada mereka walaupun memerlukan anda bekerja dalam gaya OOP. PHP sedikit lebih mudah mengenainya, dan meninggalkannya kepada pemaju untuk memutuskan sama ada atau tidak untuk menulis skrip mereka dalam gaya OOP.

Setakat ini, kami telah menulis kod PHP kami dalam gaya yang lebih mudah yang dipanggil pengaturcaraan prosedur, dan kami akan terus melakukannya buat masa ini, dengan melihat lebih terperinci objek kemudian. Gaya prosedur sangat sesuai dengan projek -projek yang agak mudah yang kita sedang menangani pada masa ini. Walau bagaimanapun, hampir semua projek kompleks yang anda akan dapati menggunakan OOP, dan saya akan menutupnya dengan lebih terperinci kemudian dalam buku ini.

yang mengatakan, lanjutan PDO yang akan kami gunakan untuk menyambung dan bekerja dengan pangkalan data MySQL direka dalam gaya pengaturcaraan berorientasikan objek. Ini bermakna, bukan hanya memanggil fungsi untuk menyambung ke MySQL dan kemudian memanggil fungsi lain yang menggunakan sambungan itu, kita mesti terlebih dahulu membuat objek PDO yang akan mewakili sambungan pangkalan data kami, dan kemudian menggunakan ciri -ciri objek itu berfungsi dengan pangkalan data.

Membuat objek adalah seperti memanggil fungsi. Malah, anda sudah melihat bagaimana untuk melakukannya:

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

Kata kunci baru memberitahu PHP bahawa anda ingin membuat objek baru. Anda kemudian meninggalkan ruang dan tentukan nama kelas, yang memberitahu PHP jenis objek yang ingin anda buat. Kelas adalah satu set arahan yang akan diikuti oleh PHP untuk membuat objek. Anda boleh memikirkan kelas sebagai resipi, seperti untuk kek, dan objek menjadi kek sebenar yang dihasilkan dari mengikuti resipi. Kelas yang berbeza boleh menghasilkan objek yang berbeza, sama seperti resipi yang berbeza boleh menghasilkan hidangan yang berbeza.

Sama seperti PHP dilengkapi dengan sekumpulan fungsi terbina dalam yang boleh anda panggil, PHP dilengkapi dengan perpustakaan kelas yang boleh anda buat objek dari. Oleh itu, PDO baru memberitahu PHP untuk membuat objek PDO baru-iaitu objek baru kelas PDO terbina dalam.

Dalam PHP, objek adalah nilai, seperti rentetan, nombor, atau array. Anda boleh menyimpan objek dalam pembolehubah atau lulus ke fungsi sebagai hujah - semua perkara yang sama yang boleh anda lakukan dengan nilai PHP yang lain. Objek, bagaimanapun, mempunyai beberapa ciri tambahan yang berguna.

Pertama sekali, objek bertindak seperti array, kerana ia bertindak sebagai bekas untuk nilai -nilai lain. Seperti yang kita lihat dalam Bab 2, anda boleh mengakses nilai di dalam array dengan menentukan indeksnya (contohnya, $ ulang tahun ['Kevin']). Ketika datang ke objek, konsep -konsepnya sama tetapi nama dan kodnya berbeza. Daripada mengakses nilai yang disimpan dalam indeks array, kami mengatakan bahawa kami mengakses harta objek. Daripada menggunakan kurungan persegi untuk menentukan nama harta yang kami mahu akses, kami menggunakan notasi anak panah (->)-misalnya, $ myObject-> someproperty:

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

sedangkan tatasusunan biasanya digunakan untuk menyimpan senarai yang serupa nilai (seperti pelbagai hari lahir), objek digunakan untuk menyimpan senarai yang berkaitan nilai (contohnya, sifat sambungan pangkalan data). Namun, jika itu semua objek dilakukan, tidak akan ada banyak perkara kepada mereka: kita mungkin juga menggunakan array untuk menyimpan nilai -nilai ini, bukan? Sudah tentu, objek melakukan lebih banyak.

Selain menyimpan koleksi sifat dan nilai mereka, objek boleh mengandungi sekumpulan fungsi yang direka untuk membawa kita lebih banyak ciri berguna. Fungsi yang disimpan dalam objek dipanggil kaedah (salah satu nama yang lebih mengelirukan dalam dunia pengaturcaraan, jika anda bertanya kepada saya). Kaedah hanyalah fungsi di dalam kelas. Lebih membingungkan, apabila kita menulis kelas kita sendiri, kaedah ditakrifkan menggunakan kata kunci fungsi! Malah pemaju yang berpengalaman sering menggunakan fungsi dan kaedah

secara bergantian.

Untuk memanggil kaedah, kami sekali lagi menggunakan notasi anak panah-$ myObject-> somemethod ():
new PDO('mysql:host=hostname;dbname=database', 'username',
  'password')

Sama seperti fungsi mandiri, kaedah boleh mengambil argumen dan pulangan nilai.

Pada peringkat ini, ini mungkin semua terdengar sedikit rumit dan sia-sia, tetapi percayalah: menarik bersama koleksi pembolehubah (sifat) dan fungsi (kaedah) ke dalam bundle kecil yang disebut objek menghasilkan banyak tidier dan mudah dibaca Kod untuk tugas -tugas tertentu - Bekerja dengan pangkalan data hanya salah satu daripada mereka. Suatu hari, anda mungkin mahu membangunkan kelas tersuai yang boleh anda gunakan untuk membuat objek yang anda buat sendiri.

Buat masa ini, bagaimanapun, kami akan berpegang dengan kelas yang disertakan dengan PHP. Mari terus bekerja dengan objek PDO yang telah kami buat, dan lihat apa yang boleh kami lakukan dengan memanggil salah satu kaedahnya.

Mengkonfigurasi sambungan

Setakat ini, saya telah menunjukkan kepada anda bagaimana untuk membuat objek PDO untuk mewujudkan sambungan dengan pangkalan data MySQL anda, dan bagaimana untuk memaparkan mesej ralat yang bermakna apabila ada yang salah:
$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
  'mypassword');

Dengan mengandaikan sambungan berjaya, walaupun, anda perlu mengkonfigurasi sebelum digunakan. Anda boleh mengkonfigurasi sambungan anda dengan memanggil beberapa kaedah objek PDO baru anda.

Sebelum menghantar pertanyaan ke pangkalan data, kami perlu mengkonfigurasi pengekodan aksara sambungan pangkalan data kami. Seperti yang saya nyatakan secara ringkas dalam Bab 2, anda harus menggunakan teks yang dikodkan UTF-8 di laman web anda untuk memaksimumkan pelbagai watak pengguna yang ada di dalam pelupusan mereka semasa mengisi borang di laman web anda. Secara lalai, apabila PHP menghubungkan ke MySQL, ia menggunakan pengekodan ISO-8859-1 (atau Latin-1) yang lebih mudah dan bukannya UTF-8. Sekiranya kita meninggalkannya seperti itu, kita tidak akan dapat memasukkan watak-watak Cina, Arab atau yang paling bukan bahasa Inggeris.

Walaupun anda 100% yakin bahawa laman web anda hanya akan digunakan oleh penceramah bahasa Inggeris, terdapat masalah lain yang disebabkan oleh tidak menetapkan set aksara. Jika laman web anda tidak ditetapkan ke UTF-8, anda akan menghadapi masalah apabila orang menulis watak-watak tertentu seperti Petikan Curly "ke dalam kotak teks, kerana mereka akan muncul dalam pangkalan data sebagai watak yang berbeza.

Oleh itu, kita kini perlu menetapkan objek PDO baru kita untuk menggunakan pengekodan UTF-8.

Kami boleh mengarahkan PHP untuk menggunakan UTF-8 apabila menanyakan pangkalan data dengan memasuki; charset = UTF8MB4 ke rentetan sambungan. Tidak ada kelemahan untuk melakukan ini, dengan syarat skrip PHP anda juga dihantar ke penyemak imbas sebagai UTF-8 (yang merupakan lalai dalam versi PHP baru-baru ini):

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

Nota: Jika anda pergi mencari, anda akan mencari cara yang berbeza untuk menetapkan charset, dan edisi terdahulu buku ini mengarahkan anda untuk menggunakan kod ini:

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

Ini kerana, sehingga Php 5.3.6, pilihan charset tidak digunakan dengan betul oleh PHP. Oleh kerana ini ditetapkan dalam mana -mana versi PHP yang sebenarnya anda akan gunakan, menetapkan charset sebagai sebahagian daripada rentetan sambungan adalah pilihan pilihan.

Kod lengkap yang kami gunakan untuk menyambung ke MySQL dan kemudian konfigurasikan sambungan itu, oleh itu, ditunjukkan di bawah.

Contoh: MySQL-Connect-Complete

$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
  'mypassword');
api contoh ini dalam penyemak imbas anda. (Jika anda telah meletakkan kod pangkalan data anda di index.php di dalam direktori awam dan fail output.html.php dalam direktori templat, URL untuk halaman akan menjadi https://v.je/.)

Jika pelayan anda berjalan dan berjalan, dan semuanya berfungsi dengan baik, anda harus melihat mesej yang menunjukkan kejayaan.

Jika PHP tidak dapat menyambung ke pelayan MySQL anda, atau jika nama pengguna dan kata laluan yang anda berikan tidak betul, anda akan melihat skrin yang sama dengan yang ditunjukkan di bawah. Untuk memastikan kod pengendalian ralat anda berfungsi dengan baik, anda mungkin ingin salah kata laluan anda dengan sengaja untuk mengujinya. Memaparkan data dari MySQL di Web: Pengenalan

Terima kasih kepada blok tangkapan kami, mesej ralat dari pangkalan data telah dimasukkan ke dalam halaman:

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

kaedah getMessage () mengembalikan mesej yang menerangkan pengecualian yang berlaku. Terdapat beberapa kaedah lain - termasuk getFile () dan getLine () - untuk mengembalikan nama fail dan nombor baris yang pengecualian dibuang. Anda boleh menghasilkan mesej ralat yang sangat terperinci seperti ini:

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

Ini sangat berguna jika anda mempunyai laman web yang besar dengan berpuluh -puluh termasuk fail. Mesej ralat akan memberitahu anda dengan tepat fail mana yang hendak dilihat dan yang mana ralat berlaku pada.

Jika anda ingin tahu, cuba memasukkan beberapa kesilapan lain dalam kod sambungan pangkalan data anda (contohnya, nama pangkalan data yang salah eja) dan perhatikan mesej ralat terperinci yang dihasilkan. Apabila anda selesai, dan sambungan pangkalan data anda berfungsi dengan betul, kembali ke mesej ralat mudah. Dengan cara ini, pelawat anda tidak akan dibombardir dengan gobbledygook teknikal jika masalah tulen muncul dengan pelayan pangkalan data anda.

Dengan sambungan yang ditubuhkan dan pangkalan data yang dipilih, anda sudah bersedia untuk mula menggunakan data yang disimpan dalam pangkalan data.

Anda mungkin tertanya -tanya apa yang berlaku kepada sambungan dengan pelayan MySQL selepas skrip selesai. Jika anda benar -benar mahu, anda boleh memaksa PHP untuk memutuskan sambungan dari pelayan dengan membuang objek PDO yang mewakili sambungan anda. Anda melakukan ini dengan menetapkan pembolehubah yang mengandungi objek ke NULL:

$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
  'mypassword');

yang mengatakan, PHP secara automatik akan menutup sebarang sambungan pangkalan data terbuka apabila selesai menjalankan skrip anda, jadi anda biasanya boleh membiarkan PHP membersihkan selepas anda. menghantar pertanyaan SQL dengan php

Dalam Bab 3, kami menyambung ke pelayan pangkalan data MySQL menggunakan MySQL Workbench, yang membolehkan kami menaip pertanyaan SQL (perintah) dan melihat hasil pertanyaan tersebut dengan segera. Objek PDO menawarkan mekanisme yang sama - kaedah EXEC:

di sini, $ query adalah rentetan yang mengandungi apa -apa pertanyaan SQL yang anda mahu laksanakan.
try {
  ⋮ do something risky
}
catch (ExceptionType $e) {
  ⋮ handle the exception
}

Seperti yang anda ketahui, jika ada masalah yang melaksanakan pertanyaan (contohnya, jika anda membuat kesilapan menaip dalam pertanyaan SQL anda), kaedah ini akan membuang pDOException untuk anda menangkap.

pertimbangkan contoh berikut, yang cuba menghasilkan jadual jenaka yang kami buat dalam Bab 3.

Contoh: mysql-create

Perhatikan bahawa kami menggunakan Teknik Pernyataan Cuba yang sama ... untuk mengendalikan kemungkinan kesilapan yang dihasilkan oleh pertanyaan. Adalah mungkin untuk menggunakan pelbagai cuba ... menangkap blok untuk memaparkan mesej ralat yang berbeza - satu untuk sambungan dan satu untuk pertanyaan - tetapi ini boleh menghasilkan sejumlah besar kod tambahan.

Sebaliknya, saya telah memilih untuk menggunakan pernyataan cuba yang sama untuk mengandungi kedua -dua sambungan dan pertanyaan. Cuba ... blok tangkapan akan berhenti melaksanakan kod sebaik sahaja ralat berlaku, jadi jika ralat berlaku semasa sambungan pangkalan data, garis $ pdo-> exec ($ run) tidak akan dijalankan, memastikan bahawa, jika pertanyaan dihantar ke pangkalan data , Sambungan mesti ditubuhkan.
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';

Pendekatan ini memberi kita sedikit kawalan ke atas mesej ralat yang dipaparkan, tetapi menjimatkan menaip ... pernyataan tangkapan untuk setiap operasi pangkalan data. Kemudian dalam buku ini, kami akan memecahkannya ke dalam blok yang berbeza, tetapi buat masa ini, simpan semua operasi pangkalan data dalam blok percubaan yang sama.

Contoh ini juga menggunakan kaedah getMessage untuk mendapatkan mesej ralat terperinci dari pelayan MySQL. Imej berikut menunjukkan ralat yang dipaparkan ketika, sebagai contoh, jadual jenaka sudah ada.

Memaparkan data dari MySQL di Web: Pengenalan

Untuk memadam, memasukkan, dan mengemas kini pertanyaan (yang berfungsi untuk mengubah suai data yang disimpan), kaedah EXEC mengembalikan bilangan baris jadual (penyertaan) yang dipengaruhi oleh pertanyaan. Pertimbangkan perintah SQL berikut, yang kami gunakan dalam Bab 3 untuk menetapkan tarikh semua jenaka yang mengandungi perkataan "Programmer".

Contoh: mysql-update

3
CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
Imej di bawah menunjukkan output contoh ini, dengan mengandaikan hanya ada satu jenaka "pengaturcara" dalam pangkalan data anda.

Jika anda menyegarkan halaman untuk menjalankan pertanyaan yang sama sekali lagi, anda harus melihat perubahan mesej, seperti yang ditunjukkan dalam imej berikut. Ia menunjukkan bahawa tiada baris dikemas kini, kerana tarikh baru yang digunakan untuk jenaka adalah sama dengan tarikh yang ada.

Memaparkan data dari MySQL di Web: Pengenalan

Pilih pertanyaan diperlakukan sedikit berbeza, kerana mereka dapat mengambil banyak data, dan PHP menyediakan cara untuk mengendalikan maklumat tersebut.

mengendalikan set hasil pilih Memaparkan data dari MySQL di Web: Pengenalan

Untuk kebanyakan pertanyaan SQL, kaedah EXEC berfungsi dengan baik. Pertanyaan melakukan sesuatu ke pangkalan data anda, dan anda mendapat bilangan baris yang terjejas (jika ada) dari nilai pulangan kaedah. Pilih pertanyaan, bagaimanapun, memerlukan sesuatu yang sedikit lebih menarik daripada eksekutif. Anda akan ingat bahawa pertanyaan pilih digunakan untuk melihat data yang disimpan dalam pangkalan data. Daripada hanya menjejaskan pangkalan data, pilih pertanyaan mempunyai hasil - dan kami memerlukan kaedah untuk mengembalikannya.

Kaedah pertanyaan kelihatan seperti EXEC, kerana ia menerima pertanyaan SQL sebagai hujah yang akan dihantar ke pelayan pangkalan data. Walau bagaimanapun, apa yang dikembalikan adalah objek pdostatement, yang mewakili set hasil yang mengandungi senarai semua baris (penyertaan) yang dikembalikan dari pertanyaan:

Dengan syarat bahawa tiada ralat yang ditemui dalam memproses pertanyaan, kod ini akan menyimpan set hasil (dalam bentuk objek pdostatement) ke dalam hasil pembolehubah $. Set hasil ini mengandungi teks semua jenaka yang disimpan dalam meja jenaka. Oleh kerana tidak ada had praktikal pada bilangan jenaka dalam pangkalan data, set hasilnya boleh menjadi agak besar.

Saya menyebut kembali dalam Bab 2 bahawa gelung sementara adalah struktur kawalan yang berguna apabila kita perlu gelung tetapi tidak tahu berapa kali. Kita tidak boleh menggunakan gelung untuk, kerana kita tidak tahu berapa banyak rekod pertanyaan yang dikembalikan. Sesungguhnya, anda boleh menggunakan gelung sementara di sini untuk memproses baris dalam hasil yang ditetapkan satu demi satu:

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

Keadaan untuk gelung sementara mungkin berbeza dari keadaan yang anda gunakan, jadi saya jelaskan bagaimana ia berfungsi. Pertimbangkan keadaan sebagai pernyataan dengan sendirinya:

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

Kaedah pengambilan objek pdostatement mengembalikan baris seterusnya dalam hasil yang ditetapkan sebagai array (kami membincangkan array dalam Bab 2). Apabila tidak ada lagi baris dalam set hasil, ambil pulangan palsu sebaliknya. (Ini adalah satu kes di mana meminta objek PDO untuk melakukan sesuatu yang tidak dapat dilakukan - seperti yang diambil tidak boleh mengembalikan baris seterusnya apabila tidak ada baris yang tersisa dalam set hasil - akan tidak membuang pDOException Sekiranya ia berlaku, kami tidak dapat menggunakan kaedah Fetch dalam keadaan gelung sementara cara kami lakukan di sini.)

Sekarang, pernyataan di atas memberikan nilai kepada pemboleh ubah baris $, tetapi, pada masa yang sama, pernyataan secara keseluruhan mengambil nilai yang sama. Inilah yang membolehkan anda menggunakan pernyataan sebagai syarat dalam gelung sementara. Sejak beberapa gelung akan terus gelung sehingga keadaannya menilai palsu, gelung ini akan berlaku seberapa banyak kali terdapat baris dalam set hasil, dengan $ baris mengambil nilai baris seterusnya setiap kali gelung dijalankan. Semua yang tersisa untuk difikirkan adalah bagaimana untuk mengambil nilai daripada pembolehubah baris $ setiap kali gelung berjalan.

baris set hasil yang dikembalikan oleh Fetch diwakili sebagai array bersekutu, dengan indeks yang dinamakan selepas lajur jadual dalam set hasil. Jika $ baris adalah baris dalam set keputusan kami, $ row ['joketext'] adalah nilai dalam lajur joketext baris itu.

Matlamat kami dalam kod ini adalah untuk menyimpan teks semua jenaka supaya kami dapat memaparkannya dalam templat PHP. Cara terbaik untuk melakukan ini adalah menyimpan setiap jenaka sebagai item baru dalam array, $ jenaka:

$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
  'mypassword');

Dengan lelucon yang ditarik keluar dari pangkalan data, kita kini boleh menyampaikannya kepada jenama templat php.html.php.

untuk meringkaskan, inilah kod pengawal untuk contoh ini setakat ini:

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

Pembolehubah $ lelucon adalah array yang menyimpan senarai jenaka. Jika anda menulis kandungan array di PHP, ia akan kelihatan seperti ini:

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';
Walau bagaimanapun, data telah diambil dari pangkalan data dan bukannya ditaip secara manual dalam kod.

anda akan menyedari bahawa terdapat dua pembolehubah yang berbeza yang ditetapkan - $ jenaka dan $ ralat - bergantung kepada sama ada blok percubaan yang dilaksanakan dengan jayanya.

Dalam template jenaka.html.php, kita perlu memaparkan kandungan array jenaka $ atau mesej ralat yang terkandung dalam pembolehubah ralat $.

Untuk memeriksa sama ada pembolehubah telah diberikan nilai, kita boleh menggunakan fungsi ISSET yang kami gunakan sebelum ini untuk memeriksa jika borang telah diserahkan. Templat ini boleh memasukkan pernyataan jika untuk menentukan sama ada untuk memaparkan ralat atau senarai jenaka:

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

Tidak ada yang baru di sini, tetapi untuk memaparkan jenaka, kita perlu memaparkan kandungan array $ jenaka. Tidak seperti pembolehubah lain yang telah kami gunakan sehingga ke tahap ini, array jenaka $ mengandungi lebih daripada sekadar satu nilai.

Cara yang paling biasa untuk memproses array dalam PHP adalah menggunakan gelung. Kami sudah melihat semasa gelung dan gelung. Gelung Foreach sangat berguna untuk pemprosesan array:

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

Daripada syarat, kurungan di bahagian atas gelung foreach mengandungi array, diikuti dengan kata kunci sebagai, dan kemudian nama pembolehubah baru yang akan digunakan untuk menyimpan setiap item array pada gilirannya. Badan gelung kemudian dilaksanakan sekali untuk setiap item dalam array. Setiap kali item itu disimpan dalam pemboleh ubah yang ditentukan, supaya kod itu dapat mengaksesnya secara langsung.

Adalah biasa untuk menggunakan gelung foreach dalam templat PHP untuk memaparkan setiap item array pada gilirannya. Begini bagaimana ini dapat mencari array lelucon $ kami:

$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
  'mypassword');

Dengan campuran kod PHP ini untuk menerangkan kod gelung dan HTML untuk memaparkannya, kod itu kelihatan agak tidak kemas. Oleh kerana itu, adalah perkara biasa untuk menggunakan cara alternatif untuk menulis gelung foreach apabila ia digunakan dalam templat:

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

Kedua -dua keping kod adalah sama dengan fungsional, tetapi yang terakhir kelihatan lebih mesra apabila dicampur dengan kod HTML. Begini bagaimana bentuk kod ini kelihatan dalam templat:

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';

Perkara yang sama boleh dilakukan dengan pernyataan IF, menjadikannya lebih baik untuk melihat di dalam templat HTML dengan mengelakkan pendakap:

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';

Dengan alat -alat baru ini, kami boleh menulis templat kami untuk memaparkan senarai jenaka.

Contoh: mysql-listjokes

<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Script Output</title>
  </head>
  <body>
      <?php echo $output; ?>
  </body>
</html>

sama ada teks ralat $ dipaparkan pada halaman atau setiap jenaka dipaparkan dalam perenggan (

) yang terkandung dalam petikan blok (), kerana kami secara efektif mengutip pengarang setiap jenaka dalam ini halaman.

kerana lelucon mungkin membayangkan mengandungi watak -watak yang boleh ditafsirkan sebagai kod HTML (contohnya, , atau &), kita mesti menggunakan htmlspecialchars untuk memastikan ia diterjemahkan ke dalam entiti watak HTML (iaitu, & lt;, & gt ;, dan & amp;) supaya mereka dipaparkan dengan betul.

Imej berikut menunjukkan apa yang kelihatan seperti ini apabila anda telah menambah beberapa jenaka ke pangkalan data.

Memaparkan data dari MySQL di Web: Pengenalan

Ingat bagaimana kami menggunakan gelung sementara dalam pengawal kami untuk mengambil baris keluar dari hasil pdostatement yang ditetapkan satu pada satu masa?

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

Ternyata objek pdostatement direka untuk berkelakuan seperti array apabila anda lulus ke gelung foreach. Oleh itu, anda boleh sedikit memudahkan kod pemprosesan pangkalan data anda menggunakan gelung foreach dan bukannya gelung sementara:

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

Saya akan menggunakan borang foreach ini di seluruh buku ini.

Satu lagi tawaran PHP alat yang kemas adalah cara tersendiri untuk memanggil perintah echo - yang, seperti yang telah anda lihat, kita perlu menggunakan kerap. Kenyataan Echo kami kelihatan seperti ini:

$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
  'mypassword');

Sebaliknya, kita boleh menggunakan ini:

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

Ini sama dengan perkara yang sama. = bermaksud echo dan memberi anda cara yang lebih pendek untuk mencetak pembolehubah. Terdapat batasan untuk ini, walaupun: Jika anda menggunakan =, Anda hanya boleh mencetak. Anda tidak boleh memasukkan jika kenyataan, untuk pernyataan, dan sebagainya, walaupun anda boleh menggunakan penggabungan, dan ia boleh diikuti dengan panggilan fungsi.

Berikut adalah templat yang dikemas kini menggunakan echo shorthand.

Contoh: mysql-listjokes-shorthand

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';

Saya akan menggunakan notasi singkat apabila ia terpakai dari titik ini.

Nota: Dalam versi PHP sebelum 5.4, notasi singkat ini memerlukan tetapan PHP yang agak tidak biasa untuk diaktifkan, jadi ia tidak digalakkan untuk alasan keserasian. Menggunakan notasi singkat mungkin menyebabkan kod anda berhenti bekerja apabila bergerak dari pelayan yang membolehkannya menjadi yang tidak.

Sehingga Php 5.4 (jadi versi yang anda secara realistik akan menemui hari ini), Echo Shorthand berfungsi tanpa mengira tetapan PHP, jadi anda boleh menggunakannya dengan selamat tanpa bimbang bahawa ia mungkin tidak berfungsi pada semua pelayan .

Berfikir ke depan

Dalam contoh yang kami lihat, kami membuat templat, jenaka.html.php, yang mengandungi semua HTML yang diperlukan untuk memaparkan halaman. Walau bagaimanapun, apabila laman web kami berkembang, kami akan menambah lebih banyak halaman. Kami pasti mahu halaman untuk orang dapat menambah jenaka ke laman web, dan kami juga memerlukan halaman rumah dengan beberapa teks pengenalan, halaman dengan butiran hubungan pemilik, dan, sebagai laman web ini, mungkin juga halaman di mana orang boleh

log masuk ke laman web.

Saya melompat ke hadapan sedikit di sini, tetapi ia sentiasa patut dipertimbangkan bagaimana projek akan berkembang. Sekiranya kita menggunakan pendekatan yang kami gunakan untuk jenaka.html.php ke seluruh templat - addjoke.html.php, home.html.php, contact.html.php, login.html.php dan sebagainya - kami ' akan berakhir dengan banyak kod berulang.

Setiap halaman di laman web akan memerlukan templat yang akan kelihatan seperti ini:

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';
Sebagai pengaturcara, mengulangi kod adalah salah satu perkara paling buruk yang boleh anda lakukan. Malah, pengaturcara sering merujuk kepada prinsip kering, yang bermaksud "jangan ulangi diri anda". Sekiranya anda mendapati diri anda mengulangi bahagian kod, hampir pasti penyelesaian yang lebih baik.

Semua pengaturcara terbaik adalah malas, dan mengulangi kod bermakna mengulangi kerja. Menggunakan pendekatan salinan/tampal ini untuk templat menjadikan laman web sangat sukar untuk dikekalkan. Mari kita bayangkan ada footer dan seksyen navigasi yang kita mahu muncul di setiap halaman. Templat kami sekarang akan kelihatan seperti ini:

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

Kami akan menghadapi masalah pada tahun 2022! Jika templat untuk semua halaman di laman web - contohnya, jokes.html.php addjoke.html.php, home.html.php, contact.html.php andlogin.html.php - mengandungi kod dalam struktur di atas, Kemas kini tahun dalam notis hak cipta kepada "2022" anda perlu membuka setiap templat dan tukar tarikh.

kita boleh pandai dan mempunyai tarikh dibaca secara dinamik dari jam pelayan (echo date ('y'); jika anda ingin tahu!) Untuk mengelakkan masalah ini, tetapi bagaimana jika kita mahu menambah tag yang dimasukkan ke dalam setiap halaman? Atau tambahkan pautan baru ke menu? Kami masih perlu membuka setiap fail templat dan menukarnya!

Mengubah lima atau enam templat mungkin sedikit menjengkelkan, tetapi ia tidak akan menimbulkan banyak masalah. Walau bagaimanapun, bagaimana jika laman web tumbuh kepada berpuluh -puluh atau beratus -ratus halaman? Setiap kali anda ingin menambah pautan ke menu, anda perlu membuka setiap templat tunggal dan menukarnya.

Masalah ini boleh diselesaikan dengan satu siri termasuk pernyataan. Contohnya:

new PDO('mysql:host=hostname;dbname=database', 'username',
  'password')
Tetapi kaedah ini memerlukan clairvoyance: kita perlu menjangkakan dengan tepat apa perubahan yang perlu dibuat pada masa akan datang dan menggunakan relevan termasuk pernyataan di tempat yang kita meramalkan perubahan akan berlaku.

Dalam contoh di atas, sebagai contoh, mudah untuk menambah entri menu baru dengan menambahkannya ke nav.html.php, tetapi menambah tag ke setiap halaman, atau bahkan sesuatu yang remeh sebagai menambah kelas CSS ke Unsur NAV, masih bermakna membuka setiap templat untuk membuat perubahan.

Tidak ada cara untuk meramalkan dengan tepat semua perubahan yang mungkin diperlukan sepanjang hayat laman web, jadi pendekatan yang saya tunjukkan pada permulaan bab ini sebenarnya lebih baik:

$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
  'mypassword');
Jika kita selalu memasukkan templat ini, yang akan kita panggil susun atur.html.php, mungkin untuk menetapkan pemboleh ubah output $ ke beberapa

kod html footer. Manfaat ini ialah, untuk mengubah tarikh pada setiap halaman laman web, kita hanya perlu mengubahnya di satu lokasi.

Saya juga telah meraih pemboleh ubah tajuk $ sehingga setiap pengawal dapat menentukan nilai yang muncul di antara tag dan bersama -sama dengan beberapa CSS (tersedia sebagai jenaka.css dalam kod sampel) untuk membuat Halaman sedikit lebih cantik.

Memaparkan data dari MySQL di Web: Pengenalan Mana -mana pengawal kini boleh digunakan termasuk __dir__. '/../templates/layout.html.php'; dan memberikan nilai untuk $ output dan $ tajuk.

Jokes.php kami menggunakan susun atur.html.php dikodkan seperti yang ditunjukkan di bawah.

Contoh: mysql-listjokes-layout-1

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

tapi tunggu! Apa yang berlaku dengan output $ di blok cuba? Pembolehubah output $ sebenarnya mengandungi beberapa kod HTML: gelung membina rentetan yang mengandungi kod HTML untuk senarai jenaka.

Pada dasarnya, inilah yang kita mahu berlaku: pemboleh ubah output $ mengandungi kod HTML yang akan dimasukkan antara navigasi dan footer dalam susun atur.html.php, tetapi saya fikir anda akan bersetuju dengan kod itu Sangat hodoh.

Saya sudah menunjukkan kepada anda bagaimana untuk mengelakkan pencampuran kod HTML dan PHP melalui pernyataan termasuk. Seperti yang kita lakukan sebelum ini, adalah baik untuk memindahkan HTML untuk memaparkan jenaka ke failnya sendiri - tetapi kali ini, hanya kod HTML yang unik untuk halaman senarai jenaka.

jokes.html.php dalam direktori templat harus mengandungi kod ini:

new PDO('mysql:host=hostname;dbname=database', 'username',
  'password')
yang penting, ini hanya kod untuk memaparkan jenaka. Ia tidak mengandungi navigasi, footer, tag atau apa sahaja yang kita mahu diulang pada setiap halaman; Ia hanya kod HTML yang unik untuk halaman senarai jenaka.

Untuk menggunakan templat ini, anda mungkin mencuba yang berikut:

$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
  'mypassword');
atau jika anda sangat pandai:

try {
  ⋮ do something risky
}
catch (ExceptionType $e) {
  ⋮ handle the exception
}
Dengan pendekatan ini, logik anda akan menjadi sangat baik. Kita perlu memasukkan jenaka.html.php. Malangnya, pernyataan termasuk hanya melaksanakan kod dari fail yang disertakan pada titik yang dipanggil. Jika anda menjalankan kod di atas, output sebenarnya akan menjadi seperti ini:

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';
Kerana jenaka.html.php disertakan terlebih dahulu, ia dihantar ke pelayar terlebih dahulu. Apa yang perlu kita lakukan ialah memuatkan jenaka.html.php, tetapi bukannya menghantar output terus ke penyemak imbas, kita perlu menangkapnya dan menyimpannya dalam pembolehubah output $ supaya ia dapat digunakan kemudian dengan susun atur.html.php .

penyataan termasuk tidak mengembalikan nilai, jadi $ output = termasuk 'jenaka.html.php'; Tidak mempunyai kesan yang diingini, dan PHP tidak mempunyai pernyataan alternatif untuk melakukannya. Walau bagaimanapun, itu tidak bermakna bahawa ia tidak mungkin.

PHP mempunyai ciri berguna yang dipanggil "buffer output". Ia mungkin terdengar rumit, tetapi konsepnya sebenarnya sangat mudah: apabila anda menggunakan Echo untuk mencetak sesuatu, atau termasuk untuk memasukkan fail yang mengandungi HTML, biasanya ia dihantar terus ke penyemak imbas. Dengan menggunakan buffer output, bukannya output dihantar terus ke penyemak imbas, kod HTML disimpan pada pelayan dalam "penampan", yang pada dasarnya hanya rentetan yang mengandungi semua yang telah dicetak setakat ini.

lebih baik, PHP membolehkan anda menghidupkan penampan dan membaca kandungannya pada bila -bila masa.

Terdapat dua fungsi yang kita perlukan:

  • ob_start (), yang memulakan penampan output. Selepas memanggil fungsi ini, apa -apa yang dicetak melalui ECHO atau HTML yang dicetak melalui termasuk akan disimpan dalam penampan dan bukannya dihantar ke penyemak imbas.
  • ob_get_clean (), yang mengembalikan kandungan penampan dan membersihkannya.

seperti yang anda mungkin meneka, "ob" dalam nama fungsi bermaksud "penampan output".

Untuk menangkap kandungan fail yang disertakan, kita hanya perlu menggunakan kedua -dua fungsi ini:

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

Apabila kod ini berjalan, pembolehubah output $ akan mengandungi HTML yang dihasilkan dalam template jenaka.html.php.

Kami akan menggunakan pendekatan ini dari sekarang. Setiap halaman akan terdiri daripada dua templat:

  • Layout.html.php, yang mengandungi semua html biasa yang diperlukan oleh setiap halaman
  • Templat unik yang mengandungi hanya kod HTML yang unik untuk halaman tertentu

Jokes.php lengkap kelihatan seperti ini:

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

Mari buat kerja pautan "rumah" dengan menambah fail index.php. Kami boleh meletakkan apa -apa di halaman ini: jenaka terkini, jenaka terbaik bulan ini, atau apa sahaja yang kami suka. Buat masa ini, kami akan memastikan ia mudah dan hanya mempunyai mesej yang mengatakan "Selamat Datang ke Pangkalan Data Jenaka Internet".

Buat fail yang dipanggil home.html.php dalam folder templat:

$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
  'mypassword');

index.php kami jauh lebih mudah daripada jenaka.html.php. Ia tidak mendapat sebarang maklumat dari pangkalan data, jadi ia tidak memerlukan sambungan pangkalan data dan kami tidak perlu mencuba ... pernyataan tangkapan, jadi kami hanya akan memuatkan dua templat dan menetapkan $ title dan $ output pembolehubah .

Contoh: mysql-listjokes-layout-3

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

NOTA: Amalan yang baik untuk hanya menyambung ke pangkalan data jika anda perlu. Pangkalan data adalah kesesakan prestasi yang paling biasa di banyak laman web, jadi membuat sedikit sambungan yang mungkin lebih disukai.

Uji bahawa kedua -dua halaman berfungsi dalam penyemak imbas anda. Anda harus mempunyai senarai jenaka yang dapat dilihat apabila anda melawat https://v.je/jokes.php dan mesej selamat datang di https://v.je/jokes.php. Kedua -dua halaman harus mengandungi navigasi dan footer.

cuba meminda susun atur.html.php. Perubahan yang anda buat akan muncul di kedua -dua halaman. Sekiranya laman web ini mempunyai puluhan halaman, perubahan kepada susun atur akan menjejaskan setiap halaman.

memasukkan data ke dalam pangkalan data

Dalam bahagian ini, saya akan menunjukkan cara menggunakan alat yang anda gunakan untuk membolehkan pelawat tapak menambah jenaka mereka sendiri ke pangkalan data.

Jika anda ingin membiarkan pelawat laman web anda memasuki jenaka baru, anda pasti memerlukan borang. Berikut adalah templat untuk bentuk yang sesuai dengan rang undang -undang:

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';

simpan ini sebagai addjoke.html.php dalam direktori templat.

Bahagian yang paling penting dari elemen

adalah atribut tindakan. Atribut tindakan memberitahu penyemak imbas di mana hendak menghantar data sebaik sahaja borang dikemukakan. Ini boleh menjadi nama fail, seperti "addjoke.php".

Walau bagaimanapun, jika anda meninggalkan atribut kosong dengan menetapkannya kepada "", data yang disediakan oleh pengguna akan dihantar kembali ke halaman yang sedang anda lihat. Jika URL penyemak imbas menunjukkan halaman sebagai addjoke.php, itu data akan dihantar apabila pengguna menekan butang Tambah.

mari kita mengikat borang ini ke dalam contoh terdahulu, yang memaparkan senarai jenaka dalam pangkalan data. Buka susun atur.html.php dan tambahkan url ke pautan "Tambah Joke Baru" yang pergi ke Addjoke.php:

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
Semasa anda mempunyai susun atur.html.php terbuka, sertakan form.css stylesheet dari Bab 2 seperti yang saya ada di atas. Sekarang, apa -apa bentuk yang dipaparkan di dalam susun atur akan mempunyai gaya yang kami gunakan sebelum ini.

Apabila borang ini diserahkan, permintaan itu akan termasuk pembolehubah - joketext - yang mengandungi teks jenaka seperti yang ditaip ke kawasan teks. Pembolehubah ini kemudiannya akan muncul dalam array $ _post yang dibuat oleh php.

mari kita buat addjoke.php dalam direktori awam. Logik asas untuk pengawal ini ialah:

    Jika tiada pembolehubah pos joketext ditetapkan, paparkan borang.
  • Jika tidak, masukkan jenaka yang dibekalkan ke dalam pangkalan data.
Buat rangka ini addjoke.php:

new PDO('mysql:host=hostname;dbname=database', 'username',
  'password')
Pembukaan ini jika pernyataan memeriksa jika array $ _post mengandungi pembolehubah yang dipanggil joketext. Jika ia ditetapkan, borang telah dikemukakan. Jika tidak, borang dari addjoke.html.php dimuatkan ke dalam pembolehubah output $ untuk memaparkan dalam penyemak imbas.

3 $ _Post ['Joketext'].

Untuk memasukkan jenaka yang dikemukakan ke dalam pangkalan data, kita mesti melaksanakan pertanyaan sisipan menggunakan nilai yang disimpan dalam $ _post ['joketext'] untuk mengisi lajur joketext jadual jenaka. Ini mungkin membawa anda menulis beberapa kod seperti ini:

Terdapat masalah yang serius dengan kod ini, bagaimanapun: kandungan $ _post ['joketext'] sepenuhnya di bawah kawalan pengguna yang menyerahkan borang tersebut. Sekiranya pengguna berniat jahat menaip beberapa kod SQL yang jahat ke dalam borang, skrip ini akan memberi makan kepada pelayan MySQL anda tanpa soalan. Serangan jenis ini dipanggil serangan suntikan SQL, dan pada hari-hari awal PHP ia adalah salah satu lubang keselamatan yang paling biasa yang dijumpai dan dieksploitasi di laman web berasaskan PHP. (Dalam banyak niche pengaturcaraan, serangan suntikan SQL masih menghairankan berkesan, kerana pemaju tidak mengharapkannya. Pertimbangkan percubaan yang luar biasa ini untuk menyebabkan kamera lalu lintas menjatuhkan pangkalan data mereka: "Plat lesen suntikan SQL berharap untuk menggagalkan kamera trafik Euro".) 🎜>
$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
  'mypassword');
Pengguna mungkin menaip ini ke dalam kotak teks:

pertanyaan yang dihantar ke pangkalan data adalah seperti berikut:

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

Tetapi bagaimana jika pengguna jenis dalam berikut:

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';

Dalam kes ini, pertanyaan yang dihantar ke pangkalan data akan menjadi:

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

Kerana jenaka itu mengandungi watak petikan, MySQL akan mengembalikan ralat, kerana ia akan melihat petikan sebelum "mendapatkan" sebagai akhir rentetan.

Untuk membuat pertanyaan yang sah ini, kita perlu melepaskan semua petikan dalam teks supaya pertanyaan yang dihantar ke pangkalan data menjadi ini:

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

Data tidak dimasukkan jika ia mengandungi petikan adalah masalah yang menjengkelkan bagi pengguna. Mereka akan kehilangan apa sahaja yang mereka taipkan. Tetapi pengguna berniat jahat dapat menyalahgunakannya. Dalam versi lama PHP, adalah mungkin untuk menjalankan pelbagai pertanyaan dari PHP dengan memisahkannya dengan titik koma (;).

Bayangkan jika pengguna menaip ini ke dalam kotak:

$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
  'mypassword');

Ini akan menghantar pertanyaan berikut ke pangkalan data:

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

- adalah satu komen baris tunggal di MySQL, jadi baris terakhir akan diabaikan, dan pertanyaan sisipan akan dijalankan, diikuti dengan pertanyaan padam pengguna telah menaip ke dalam kotak. Malah, pengguna boleh menaip sebarang pertanyaan yang mereka suka ke dalam kotak dan ia akan dijalankan pada pangkalan data!

Petikan Magic

Pada hari-hari awal PHP, serangan suntikan SQL sangat takut bahawa pasukan di belakang PHP menambah beberapa perlindungan terbina dalam suntikan SQL kepada bahasa. Pertama, mereka melumpuhkan keupayaan untuk menghantar pelbagai pertanyaan sekaligus. Kedua, mereka menambah sesuatu yang dipanggil petikan sihir. Ciri perlindungan PHP secara automatik menganalisis semua nilai yang dikemukakan oleh penyemak imbas dan memasukkan backslashes () di hadapan mana -mana watak "berbahaya" seperti apostrophes - yang boleh menyebabkan masalah jika mereka dimasukkan ke dalam pertanyaan SQL secara tidak sengaja.

Masalah dengan ciri Petikan Magic adalah bahawa ia menyebabkan banyak masalah seperti yang dicegah. Pertama sekali, watak -watak yang dikesannya, dan kaedah yang digunakan untuk membersihkannya (prefixing mereka dengan backslash), hanya sah dalam beberapa keadaan. Bergantung pada pengekodan aksara laman web anda dan pelayan pangkalan data yang anda gunakan, langkah -langkah ini boleh sepenuhnya tidak berkesan.

Kedua, apabila nilai yang dikemukakan digunakan untuk tujuan tertentu lain -lain daripada membuat pertanyaan SQL, backslashes tersebut boleh benar -benar mengganggu. Ciri -ciri Petikan Magic akan memasukkan backslash palsu ke dalam nama terakhir pengguna jika ia mengandungi apostrophe.

Singkatnya, ciri Petikan Magic adalah idea yang buruk - sehingga ia dikeluarkan dari PHP dari versi 5.4. Walau bagaimanapun, disebabkan oleh usia PHP dan jumlah kod di luar sana, anda mungkin dapat melihat beberapa rujukan kepadanya, jadi ia bernilai mempunyai pemahaman asas tentang ciri -ciri Magic Quotes yang sepatutnya dilakukan.

Sebaik sahaja petikan sihir dikenal pasti sebagai idea yang buruk, nasihat dari pemaju PHP adalah untuk mematikannya. Walau bagaimanapun, ini bermakna terdapat beberapa pelayan web dengan itu dimatikan dan yang lain dengannya dihidupkan. Ini adalah sakit kepala bagi pemaju: mereka sama ada perlu mengarahkan semua orang yang akan menggunakan kod mereka untuk mematikannya - yang tidak mungkin pada beberapa pelayan bersama - atau menulis kod tambahan untuk menjelaskannya.

Kebanyakan pemaju memilih yang terakhir, dan anda mungkin dapat melihat beberapa kod seperti ini:

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

Jika anda melihat pernyataan jika ini dalam kod warisan yang anda telah diberikan untuk bekerja dengan, anda boleh memadam keseluruhan blok, kerana tiada kod di dalam pernyataan IF akan dilaksanakan pada versi PHP baru -baru ini.

Jika anda melihat kod seperti ini, ini bermakna pemaju asal memahami masalah dengan petikan sihir dan melakukan yang terbaik untuk mencegahnya. Sehingga PHP 5.4 (yang anda tidak boleh jumpa, kerana ia tidak lagi disokong), get_magic_quotes_gpc () akan sentiasa kembali palsu dan kod itu tidak akan dilaksanakan.

semua yang anda perlu tahu mengenai petikan sihir adalah bahawa ia adalah penyelesaian yang tidak baik untuk masalah yang dihadapi. Sudah tentu, tanpa petikan sihir, anda perlu mencari penyelesaian yang berbeza untuk masalah ini. Nasib baik, kelas PDO boleh melakukan semua kerja keras untuk anda, dengan menggunakan sesuatu yang disebut "penyataan yang disediakan".

Penyataan yang disediakan

Kenyataan yang disediakan adalah jenis pertanyaan SQL khas yang telah anda hantar ke pelayan pangkalan data anda lebih awal, memberikan pelayan peluang untuk menyediakannya untuk pelaksanaan - tetapi sebenarnya tidak melaksanakannya. Fikirkan ia seperti menulis skrip .php. Kod ada di sana, tetapi ia tidak benar -benar dijalankan sehingga anda melawat halaman dalam penyemak imbas web anda. Kod SQL dalam pernyataan yang disediakan boleh mengandungi ruang letak yang anda akan membekalkan nilai untuk kemudian, apabila pertanyaan

adalah untuk dilaksanakan. Apabila mengisi ruang letak ini, PDO cukup pintar untuk menjaga watak -watak "berbahaya" secara automatik.

Berikut adalah cara menyediakan pertanyaan sisipan dan kemudian laksanakan dengan selamat dengan $ _post ['joketext'] sebagai teks jenaka:

new PDO('mysql:host=hostname;dbname=database', 'username',
  'password')
mari kita pecahkan ini, satu pernyataan pada satu masa. Pertama, kami menulis pertanyaan SQL kami sebagai rentetan PHP dan menyimpannya dalam pembolehubah ($ SQL) seperti biasa. Apa yang luar biasa mengenai pertanyaan sisipan ini, bagaimanapun, adalah bahawa tiada nilai ditentukan untuk lajur JokeText. Sebaliknya, ia mengandungi pemegang tempat untuk nilai ini (: joketext). Jangan risau tentang bidang jokedate sekarang; Kami akan melingkari kembali dalam seketika.

Seterusnya, kami memanggil kaedah menyediakan objek PDO kami ($ PDO), menyampaikan pertanyaan SQL kami sebagai hujah. Ini menghantar pertanyaan kepada pelayan MySQL, meminta untuk

menyediakan untuk menjalankan pertanyaan. MySQL tidak dapat menjalankannya lagi, kerana tidak ada nilai untuk lajur JokeText. Kaedah Sediakan mengembalikan objek pdostatement (ya, jenis objek yang sama yang memberi kita hasil dari pertanyaan pilih), yang kami simpan dalam $ stmt.

Sekarang bahawa MySQL telah menyediakan pernyataan kami untuk pelaksanaan, kami boleh menghantar nilai yang hilang dengan memanggil kaedah bindValue objek PDostatement kami ($ STMT). Kami memanggil kaedah ini sekali untuk setiap nilai yang akan dibekalkan (dalam kes ini, kita hanya perlu membekalkan satu nilai - teks jenaka), lulus sebagai argumen pemegang tempat yang kita mahu isi (': joketext') dan nilai kita mahu mengisinya dengan ($ _post ['joketext']). Kerana MySQL tahu kami menghantarnya nilai diskret, bukannya kod SQL yang perlu dihuraikan, tidak ada risiko aksara dalam nilai yang ditafsirkan sebagai kod SQL. Apabila menggunakan kenyataan yang disediakan, kelemahan suntikan SQL semata -mata tidak mungkin!

Akhirnya, kami panggil kaedah pelaksanaan objek PDostatement untuk memberitahu MySQL untuk melaksanakan pertanyaan dengan nilai yang telah kami sediakan. (Ya, kaedah pdostatement ini dipanggil melaksanakan, tidak seperti kaedah objek PDO yang sama, yang dipanggil Exec. PHP mempunyai banyak kekuatan, tetapi konsistensi bukanlah salah satu daripada mereka!)

Satu perkara yang menarik yang akan anda perhatikan mengenai kod ini ialah kami tidak pernah meletakkan petikan di sekitar teks jenaka. : JokeText wujud di dalam pertanyaan tanpa sebarang petikan, dan apabila kami memanggil BindValue, kami meluluskannya teks jenaka biasa dari array $ _post. Apabila menggunakan pernyataan yang disediakan, anda tidak memerlukan petikan kerana pangkalan data (dalam kes kami, MySQL) cukup pintar untuk mengetahui bahawa teks itu adalah rentetan dan ia akan diperlakukan seperti itu apabila pertanyaan dilaksanakan.

Soalan yang berlarutan dalam kod ini adalah cara menetapkan tarikh hari ini ke medan Jokedate. Kami

boleh

menulis beberapa kod PHP mewah untuk menjana tarikh hari ini dalam format YYYY-MM-DD yang diperlukan oleh MySQL, tetapi ternyata MySQL sendiri mempunyai fungsi untuk melakukan ini-curdate:

Fungsi MySQL Curdate digunakan di sini untuk menetapkan tarikh semasa sebagai nilai lajur Jokedate. MySQL sebenarnya mempunyai berpuluh -puluh fungsi ini, tetapi saya akan memperkenalkannya hanya seperti yang diperlukan.
CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';

Sekarang bahawa kami mempunyai pertanyaan kami, kami dapat melengkapkan pernyataan jika kami bermula lebih awal untuk mengendalikan penyerahan borang "Tambah Joke":

tapi tunggu! Ini jika pernyataan mempunyai satu lagi trik di atas lengannya. Sebaik sahaja kami telah menambahkan jenaka baru ke pangkalan data, bukannya memaparkan templat PHP seperti sebelumnya, kami ingin mengalihkan pelayar pengguna kembali ke senarai jenaka. Dengan cara itu, pengguna dapat melihat jenaka yang baru ditambah di kalangan mereka. Itulah yang kedua -dua baris pada akhir pernyataan IF di atas.
new PDO('mysql:host=hostname;dbname=database', 'username',
  'password')

Untuk mencapai hasil yang dikehendaki, naluri pertama anda mungkin untuk membolehkan pengawal hanya mengambil senarai jenaka dari pangkalan data selepas menambah jenaka baru dan memaparkan senarai menggunakan templat jenaka.html.php seperti biasa. Masalahnya dengan melakukan ini ialah senarai jenaka, dari perspektif penyemak imbas, akan menjadi hasil daripada mengemukakan borang "tambah jenaka". Sekiranya pengguna kemudian menyegarkan halaman, penyemak imbas akan menghantar semula bentuk itu, menyebabkan satu lagi salinan jenaka baru ditambah ke pangkalan data! Ini jarang tingkah laku yang dikehendaki.

Sebaliknya, kami mahu penyemak imbas merawat senarai jenaka yang dikemas kini sebagai laman web biasa yang dapat dimuat semula tanpa menyerahkan borang. Cara untuk melakukan ini adalah untuk menjawab penyerahan borang penyemak imbas dengan Redirect HTTP - respons khas yang memberitahu penyemak imbas untuk menavigasi ke halaman yang berbeza. (HTTP bermaksud protokol pemindahan hiperteks, dan merupakan bahasa yang menggambarkan komunikasi permintaan/tindak balas yang ditukar antara pelayar web pelawat dan pelayan web anda.)

Fungsi Header PHP menyediakan cara menghantar respons pelayan khas seperti ini, dengan membiarkan anda memasukkan tajuk khusus ke dalam respons yang dihantar kepada penyemak imbas. Untuk menandakan pengalihan, anda mesti menghantar tajuk lokasi dengan URL halaman yang anda mahu mengarahkan penyemak imbas ke:

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
Dalam kes ini, kami mahu menghantar penyemak imbas ke Jokes.php. Berikut adalah dua baris yang mengalihkan penyemak imbas kembali ke pengawal kami selepas menambah jenaka baru ke pangkalan data:

new PDO('mysql:host=hostname;dbname=database', 'username',
  'password')
di bawah adalah kod lengkap pengawal addjoke.php.

Contoh: mysql-addjoke

$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
  'mypassword');
Semasa anda mengkaji ini untuk memastikan semuanya masuk akal kepada anda, ambil perhatian bahawa kod yang menghubungkan ke pangkalan data dengan membuat objek PDO baru mesti datang sebelum mana -mana kod yang menjalankan pertanyaan pangkalan data. Tetapi sambungan pangkalan data tidak diperlukan untuk memaparkan borang "Tambah Joke". Sambungan hanya dibuat apabila borang telah diserahkan.

Muatkan ini dan tambahkan jenaka baru atau dua ke pangkalan data melalui penyemak imbas anda.

Di sana anda memilikinya: Anda dapat melihat jenaka sedia ada - dan tambahkan jenaka baru ke - pangkalan data MySQL anda.

Menghapus data dari pangkalan data

Dalam bahagian ini, kami akan membuat satu peningkatan akhir ke laman pangkalan data jenaka kami. Di sebelah setiap lelucon di halaman jenaka (Jokes.php), kami akan meletakkan butang yang dilabelkan padam. Apabila diklik, ia akan mengeluarkan jenaka itu dari pangkalan data dan memaparkan senarai jenaka yang dikemas kini.

Jika anda suka cabaran, anda mungkin ingin menikam menulis ciri ini sendiri sebelum anda membaca untuk melihat penyelesaian saya. Walaupun kami melaksanakan ciri baru, kami akan menggunakan alat yang sama seperti yang digunakan dalam contoh sebelumnya dalam bab ini. Berikut adalah beberapa petunjuk untuk memulakan anda:

  • anda memerlukan pengawal baru (deleteJoke.php).
  • Perintah padam SQL akan diperlukan, yang saya diperkenalkan dalam Bab 3.
  • Untuk memadam jenaka tertentu dalam pengawal anda, anda perlu mengenalinya secara unik. Lajur ID dalam jadual jenaka dicipta untuk memenuhi tujuan ini. Anda perlu lulus ID jenaka untuk dipadam dengan permintaan untuk memadamkan jenaka. Cara paling mudah untuk melakukan ini ialah menggunakan medan bentuk tersembunyi.

sekurang -kurangnya, luangkan beberapa saat untuk berfikir tentang bagaimana anda akan mendekati ini. Apabila anda sudah bersedia untuk melihat penyelesaiannya, baca!

Untuk memulakan, kita perlu mengubah suai pertanyaan pilih yang mengambil senarai jenaka dari pangkalan data. Sebagai tambahan kepada lajur JokeText, kita juga mesti mengambil lajur ID supaya kita dapat mengenal pasti setiap jenaka secara unik:

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

kita juga perlu mengubah suai gelung sementara yang menyimpan hasil pangkalan data ke dalam array $ jenaka. Daripada hanya menyimpan teks setiap jenaka sebagai item dalam array, kami menyimpan kedua -dua ID dan teks setiap jenaka. Salah satu cara untuk melakukan ini adalah membuat setiap item dalam array $ jenaka dengan haknya sendiri:

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

NOTA: Jika anda sudah bertukar menggunakan gelung foreach untuk memproses baris hasil pangkalan data anda, yang akan berfungsi dengan baik juga:

$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
  'mypassword');

Sebaik sahaja gelung ini berjalan, kami akan mempunyai array $ jenaka, setiap item yang merupakan array bersekutu dengan dua item: id jenaka dan teksnya. Untuk setiap jenaka ($ jenaka [n]), oleh itu kita boleh mengambil ID ($ jenaka [n] ['id']) dan teksnya ($ jenaka [n] ['teks']).

Langkah seterusnya adalah untuk mengemas kini templat jenaka.html.php untuk mengambil teks setiap jenaka dari struktur array baru ini, serta memberikan butang padam untuk setiap jenaka:

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

Berikut adalah sorotan kod terkini ini:

  • Setiap jenaka akan dipaparkan dengan borang, yang, jika diserahkan, akan memadamkan jenaka itu. Kami memberi isyarat ini kepada pengawal baru, DeleteJoke.php, menggunakan atribut tindakan borang.
  • Oleh kerana setiap jenaka dalam array $ jenaka kini diwakili oleh array dua item dan bukannya rentetan mudah, kita mesti mengemas kini baris ini untuk mengambil teks jenaka. Kami melakukan ini menggunakan $ jenaka ['teks'] bukan hanya $ jenaka.
  • Apabila kami menyerahkan borang untuk memadamkan jenaka ini, kami menghantar id jenaka untuk dipadamkan. Untuk melakukan ini, kita memerlukan medan borang yang mengandungi ID jenaka, tetapi kami lebih suka menyimpan bidang ini tersembunyi dari pengguna; Itulah sebabnya kami menggunakan medan borang tersembunyi (jenis input = "tersembunyi"). Nama medan ini adalah ID, dan nilainya adalah id jenaka yang akan dipadam ($ jenaka ['id']). Perlu bimbang untuk menjadikannya html-selamat dengan htmlspecialchars. Kita boleh yakin ia akan menjadi nombor, kerana ia secara automatik dihasilkan oleh MySQL untuk lajur ID apabila jenaka ditambah ke pangkalan data.
  • Butang Hantar (input Type = "Hantar") Mengemukakan borang apabila diklik. Atribut nilainya memberikan label padam.
  • Akhirnya, kami menutup borang untuk jenaka ini.

Nota: Jika anda tahu HTML anda, anda mungkin memikirkan bentuk dan tag input di luar elemen blockquote, kerana mereka bukan sebahagian daripada teks yang disebutkan (jenaka).

dengan tegas, itu benar: bentuk dan inputnya sepatutnya sama ada sebelum atau selepas blockquote. Malangnya, membuat paparan struktur tag dengan jelas memerlukan kod CSS (Cascading Style Helaian) yang benar -benar di luar skop buku ini.

Daripada mengajar anda teknik susun atur CSS dalam buku mengenai PHP dan MySQL, saya telah memutuskan untuk pergi dengan markup yang tidak sempurna ini. Jika anda bercadang untuk menggunakan kod ini di dunia nyata, anda harus melabur sedikit masa untuk belajar CSS (atau sekurang -kurangnya menjamin perkhidmatan CSS Guru). Dengan cara itu, anda boleh mengawal markup HTML anda tanpa bimbang tentang CSS yang diperlukan untuk menjadikannya kelihatan bagus. Jika anda ingin mengetahui lebih lanjut mengenai susun atur CSS, lihat CSS Master, edisi ke -3 , oleh Tiffany Brown.

Tambahkan CSS berikut untuk jenaka.css untuk membuat butang kelihatan di sebelah kanan lelucon dan lukis garis di antara mereka:

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
Imej berikut menunjukkan senarai jenaka dengan butang padam ditambah.

Memaparkan data dari MySQL di Web: Pengenalan tapi tunggu! Sebelum kita beralih untuk membuat butang padam kerja, mari kita mundur secara ringkas dan lihatlah dengan berhati -hati pada baris ini:

di sini, kami melengkapkan objek pdostatement, yang memberi kami pembolehubah baris $ yang mengandungi ID Kunci dan JokeText bersama -sama dengan nilai yang sepadan, dan kami menggunakannya untuk membina array lain dengan kekunci dan nilai yang sama. new PDO('mysql:host=hostname;dbname=database', 'username', 'password')

Anda mungkin telah menyedari ini sangat tidak cekap. Kami dapat mencapai perkara yang sama menggunakan kod ini:

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

Tetapi seperti yang kita ketahui, ini juga boleh dicapai dengan gelung foreach:

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

Dalam hal ini, kami menggunakan Foreach untuk melelehkan rekod dari pangkalan data dan membina array. Kami kemudian melengkung di atas array dengan gelung foreach yang lain dalam templat. Kami hanya boleh menulis ini:

$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
  'mypassword');

Sekarang, apabila $ lelucon diluluskan di dalam templat, ia bukan array tetapi objek pdostatement. Walau bagaimanapun, itu tidak memberi kesan kepada output dan menjimatkan kod kita. Malah, kita boleh meninggalkan pembolehubah hasil $ sama sekali dan memuatkan objek pdostatement terus ke dalam pembolehubah $ lelucon. Pengawal Lengkap.php lengkap kini kelihatan seperti ini:

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

Sekarang kita bahkan tidak mempunyai gelung sementara meleset ke atas rekod dalam pengawal, tetapi hanya melelehkan rekod secara langsung dalam templat, menyimpan beberapa kod dan membuat halaman dilaksanakan sedikit lebih cepat, kerana kini hanya gelung di atasnya Rekod sekali.

Kembali ke butang Delete baru kami: Semua yang tetap membuat kerja ciri baru ini adalah untuk menambah deleteJoke.php yang relevan untuk mengeluarkan pertanyaan padam ke pangkalan data:

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';
kod lengkap untuk jokes.php dan deletejoke.php yang dikemas kini boleh didapati sebagai contoh: MySql-Deletejoke.

Kod ini berfungsi sama seperti yang kami tambahkan untuk memproses kod "tambah jenaka" lebih awal dalam bab. Kami mulakan dengan menyediakan pertanyaan padam dengan pemegang tempat untuk ID jenaka yang kami mahu padamkan.

Tip: Anda mungkin berfikir bahawa pernyataan yang disediakan tidak perlu dalam hal ini untuk melindungi pangkalan data kami dari serangan suntikan SQL, kerana ID jenaka disediakan oleh medan bentuk tersembunyi yang tidak dapat dilihat oleh pengguna. Malah, semua bidang bentuk - walaupun tersembunyi - akhirnya di bawah kawalan pengguna. Terdapat tambahan penyemak imbas yang diedarkan secara meluas, sebagai contoh, yang akan menjadikan medan bentuk tersembunyi kelihatan dan tersedia untuk diedit oleh pengguna. Ingat: Sebarang nilai yang dikemukakan oleh penyemak imbas akhirnya disyaki ketika melindungi keselamatan laman web anda.

Kami kemudian mengikat nilai yang dikemukakan $ _post ['id'] kepada pemegang tempat itu dan melaksanakan pertanyaan. Sebaik sahaja pertanyaan itu dicapai, kami menggunakan fungsi header PHP untuk meminta penyemak imbas untuk menghantar permintaan baru untuk melihat senarai jenaka yang dikemas kini.

Nota: Jika anda menangani contoh ini sendiri, naluri pertama anda mungkin memberikan hyperlink hapus untuk setiap jenaka, bukannya pergi ke masalah menulis keseluruhan borang HTML yang mengandungi butang padam untuk setiap jenaka halaman. Sesungguhnya, kod untuk pautan sedemikian akan lebih mudah:

CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
Singkatnya, hiperpautan tidak boleh digunakan untuk melakukan tindakan (seperti memadam jenaka). Mereka hanya boleh digunakan untuk menyediakan pautan ke beberapa kandungan yang berkaitan. Begitu juga dengan borang dengan kaedah = "mendapatkan", yang hanya boleh digunakan untuk melakukan pertanyaan data sedia ada. Tindakan hanya perlu dilakukan sebagai hasil daripada borang dengan kaedah = "pos" yang dikemukakan.

Alasan ini ialah bentuk dengan kaedah = "pos" dirawat secara berbeza oleh pelayar dan perisian yang berkaitan. Jika anda menghantar borang dengan kaedah = "Pos" dan kemudian klik butang Refresh dalam penyemak imbas anda, sebagai contoh, penyemak imbas akan bertanya jika anda pasti anda ingin menghantar semula borang tersebut. Pelayar tidak mempunyai perlindungan yang sama terhadap penyerahan semula ketika datang ke pautan dan bentuk dengan kaedah = "get".

Enjin carian dan crawler web lain juga akan mengikuti semua pautan di laman web anda untuk bersenam bila untuk menunjukkan halaman laman web anda dalam hasil carian.

Jika laman web anda memadamkan jenaka sebagai hasil daripada hiperpautan yang diikuti, anda dapat mencari lelucon anda dipadamkan setiap kali enjin carian mencari laman web anda.

Misi dicapai

Dalam bab ini, anda mempelajari semua mengenai objek data PHP (PDO), koleksi kelas PHP terbina dalam (PDO, PDOException, dan PDostatement) yang membolehkan anda bersambung dengan pelayan pangkalan data MySQL dengan membuat objek dan kemudian memanggil kaedah yang mereka sediakan. Semasa anda berada di sana, anda juga mengambil asas-asas pengaturcaraan berorientasikan objek (OOP)-yang tidak bermakna untuk pemula PHP!

Menggunakan objek PDO, anda membina laman web yang didorong oleh pangkalan data pertama anda, yang menerbitkan pangkalan data IJDB dalam talian dan membenarkan pelawat menambah dan memadam lelucon.

dengan cara, anda boleh mengatakan bab ini mencapai misi yang dinyatakan dalam buku ini: untuk mengajar anda bagaimana untuk membina laman web yang didorong oleh pangkalan data. Sudah tentu, contoh dalam bab ini hanya mengandungi keperluan penting. Di seluruh buku, saya akan menunjukkan kepada anda bagaimana untuk memakan kerangka yang anda pelajari untuk membina dalam bab ini.

Dalam Bab 5, kami akan kembali ke tetingkap pertanyaan SQL di MySQL Workbench. Kami akan belajar bagaimana menggunakan prinsip pangkalan data relasi dan pertanyaan SQL maju untuk mewakili jenis maklumat yang lebih kompleks, dan memberi kredit pelawat kami untuk jenaka yang mereka tambah!

kami berharap anda telah menikmati petikan ini dari

php & mysql: Novice to ninja, edisi ke -7

. Buku penuh boleh didapati di SitePoint Premium dan dari peruncit buku dan ebook kegemaran anda.

Soalan Lazim Mengenai Memaparkan Data Dari MySQL Di Web

Bagaimana saya boleh menyambung ke pangkalan data MySQL menggunakan pelayar web? Phpmyadmin adalah alat perisian percuma yang ditulis dalam PHP, yang bertujuan untuk mengendalikan pentadbiran MySQL melalui web. Untuk menggunakannya, anda perlu memasangnya pada pelayan anda, kemudian mengaksesnya melalui pelayar web anda dengan menaip alamat IP pelayan anda diikuti oleh "/phpmyadmin". Anda akan diminta untuk memasuki kelayakan MySQL anda, dan sebaik sahaja disahkan, anda akan dapat menguruskan pangkalan data anda secara langsung dari penyemak imbas anda. 🎜> MySQL Shell adalah pelanggan lanjutan dan editor kod untuk MySQL. Ia menyediakan keupayaan skrip untuk JavaScript dan Python dan termasuk API untuk bekerja dengan MySQL. Anda boleh menggunakannya untuk melakukan pertanyaan dan kemas kini data, serta pelbagai operasi pentadbiran. Shell mysql boleh dipasang di mesin tempatan anda, dan anda boleh menyambungkannya ke pelayan MySQL anda menggunakan kelayakan yang sesuai. Data MySQL di laman web anda. Ini biasanya dilakukan melalui bahasa skrip sisi pelayan seperti PHP. Skrip PHP anda akan menyambung ke pangkalan data MySQL anda, melakukan pertanyaan untuk mendapatkan data, dan kemudian memaparkan data tersebut di laman web anda. Ini adalah pendekatan yang biasa untuk laman web dinamik yang perlu memaparkan kandungan yang berubah, seperti blog atau laman berita. . Pertama, pastikan pelayan MySQL anda berjalan dalam persekitaran yang selamat, dengan firewall dan langkah -langkah keselamatan yang sesuai. Kedua, gunakan kata laluan yang kuat dan unik untuk akaun MySQL anda. Ketiga, hadkan keistimewaan akaun MySQL anda supaya mereka hanya mempunyai keizinan yang mereka perlukan untuk melaksanakan tugas mereka. Akhirnya, kerap mengemas kini dan tampalkan pelayan MySQL anda untuk melindungi daripada kelemahan yang diketahui. . Alat ini mencipta fail SQL dengan arahan yang boleh mencipta semula pangkalan data dari awal. Anda boleh menjalankan alat ini dari baris arahan pelayan anda, menyatakan nama pangkalan data yang anda ingin sandarkan dan nama fail yang ingin anda buat. 🎜> Mengoptimumkan pangkalan data MySQL anda boleh melibatkan beberapa langkah. Pertama, anda boleh menggunakan arahan jadual Optimize untuk menyusun semula penyimpanan fizikal data jadual dan mengurangkan ruang cakera. Kedua, anda boleh menggunakan pengoptimuman pertanyaan MySQL untuk meningkatkan kecekapan pertanyaan anda. Ketiga, anda boleh menggunakan pengindeksan untuk mempercepat pengambilan data.

Bagaimana saya boleh mengimport data ke dalam pangkalan data MySQL saya?

Anda boleh mengimport data ke dalam pangkalan data MySQL anda menggunakan arahan Infile Data Load. Perintah ini membaca baris dari fail teks ke dalam jadual pada kelajuan yang sangat tinggi. Nama fail mesti diberikan sebagai rentetan literal.

Bagaimana saya boleh mengeksport data dari pangkalan data MySQL saya? Perintah ini menulis hasil pernyataan pilih ke fail pada hos pelayan.

Bagaimana saya boleh mengemas kini data dalam pangkalan data MySQL saya? perintah. Perintah ini mengubah baris sedia ada dalam jadual. Anda menentukan nama jadual, lajur yang akan dikemas kini, dan nilai baru, bersama -sama dengan klausa WHERE untuk memilih baris mana yang hendak dikemas kini. > Anda boleh memadam data dari pangkalan data MySQL anda menggunakan arahan padam. Perintah ini menghilangkan baris sedia ada dari meja. Anda menentukan nama jadual dan klausa WHERE untuk memilih baris mana yang hendak dipadam. Berhati -hati dengan arahan ini, kerana data yang dipadam tidak dapat dipulihkan.

Atas ialah kandungan terperinci Memaparkan data dari MySQL di Web: Pengenalan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn