Rumah >pembangunan bahagian belakang >tutorial php >Memaparkan data dari MySQL di Web: Pengenalan
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.
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
Begitu jelas dan segar dalam fikiran anda, inilah yang berlaku apabila ada pelawat ke halaman di laman web anda:
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
bolehmenyambung 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
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 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:
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!
3Anda 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.
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. 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.
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.
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
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.
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.
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.
Pilih pertanyaan diperlakukan sedikit berbeza, kerana mereka dapat mengambil banyak data, dan PHP menyediakan cara untuk mengendalikan maklumat tersebut.
mengendalikan set hasil pilih
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';
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 (
Imej berikut menunjukkan apa yang kelihatan seperti ini apabila anda telah menambah beberapa jenaka ke pangkalan data.
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: 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: Sebaliknya, kita boleh menggunakan ini: 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 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 . log masuk ke laman web.
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: 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 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:
kod html footer. Manfaat ini ialah, untuk mengubah tarikh pada setiap halaman laman web, kita hanya perlu mengubahnya di satu lokasi.
Jokes.php kami menggunakan susun atur.html.php dikodkan seperti yang ditunjukkan di bawah. Contoh: mysql-listjokes-layout-1 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.
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: 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: Jokes.php lengkap kelihatan seperti ini: 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: 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 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. 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: simpan ini sebagai addjoke.html.php dalam direktori templat. Bahagian yang paling penting dari elemen
CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
new PDO('mysql:host=hostname;dbname=database', 'username',
'password')
$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
'mypassword');
try {
⋮ do something risky
}
catch (ExceptionType $e) {
⋮ handle the exception
}
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 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 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.
CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
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. $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
Mana -mana pengawal kini boleh digunakan termasuk __dir__. '/../templates/layout.html.php'; dan memberikan nilai untuk $ output dan $ tajuk.
CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
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. $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 .
CREATE USER 'ijdbuser'@'%' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON `ijdb`.* TO 'ijdbuser'@'%';
new PDO('mysql:host=hostname;dbname=database', 'username',
'password')
$pdo = new PDO('mysql:host=mysql;dbname=ijdb', 'ijdbuser',
'mypassword');
try {
⋮ do something risky
}
catch (ExceptionType $e) {
⋮ handle the exception
}
memasukkan data ke dalam 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';
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:
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!
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
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
bolehmenulis 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
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:
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:
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.
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 dicapaiDalam 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.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.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 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!