Artikel berikut adalah kutipan dari PHP & MySQL. Novice to Ninja, 7th Edition, panduan praktis untuk mempelajari semua alat, prinsip, dan teknik yang diperlukan untuk membuat aplikasi web profesional. Dalam tutorial terakhir dalam seri ini, Anda akan belajar cara mengambil informasi yang disimpan dalam database MySQL dan menampilkannya di halaman web untuk dilihat semua orang Show
Ini dia — hal-hal yang Anda daftarkan. Dalam bab ini, Anda akan mempelajari cara mengambil informasi yang disimpan dalam database MySQL dan menampilkannya di halaman web untuk dilihat semua orang Sejauh ini, Anda telah menulis kode PHP pertama Anda dan mempelajari dasar-dasar MySQL, mesin basis data relasional, dan PHP, bahasa skrip sisi server Now you’re ready to learn how to use these tools together to create a website where users can view data from the database and even add their own Note. as in Chapter 3, I’m using “MySQL” here to refer to the database protocol. Your PHP scripts will do the same. There are numerous references in this chapter — and in the PHP code you’ll write — to “MySQL”, even though we’re actually connecting to a MariaDB database The Big PictureBefore we leap forward, it’s worth taking a step back for a clear picture of our ultimate goal. We have two powerful tools at our disposal. the PHP scripting language and the MySQL database engine. It’s important to understand how these will fit together The purpose of using MySQL for our website is to allow the content to be pulled dynamically from the database to create web pages for viewing in a regular browser. So, at one end of the system you have a visitor to your site using a web browser to request a page. That browser expects to receive a standard HTML document in return. At the other end you have the content of your site, which sits in one or more tables in a MySQL database that only understands how to respond to SQL queries (commands) As shown in the image above, the PHP scripting language is the go-between that speaks both languages. It processes the page request and fetches the data from the MySQL database using SQL queries just like those you used to create a table of jokes in Chapter 3. It then spits it out dynamically as the nicely formatted HTML page that the browser expects Just so it’s clear and fresh in your mind, this is what happens when there’s a visitor to a page on your website
Creating a MySQL User AccountIn order for PHP to connect to your MySQL database server, it will need to use a username and password. So far, all that your joke database contains is a number of pithy bon mots, but before long it may contain sensitive information like email addresses and other private details about the users of your website. For this reason, MySQL is designed to be very secure, giving you tight control over what connections it will accept and what those connections are allowed to do The Docker environment already contains a MySQL user in Chapter 3, which you’ve already used to log in to the MySQL server You could connect to the database from your PHP script using the same username ( 2) and password ( 2), but it’s useful to create a new account — because if you have a web server, you may want to use it to host more than one website. By giving each website its own user account, you’ll have more control over who has access to the data for any given site. If you’re working with other developers, you can give them access to the sites they’re working on, but no moreYou should create a new user account with only the specific privileges it needs to work on the 4 database that your website depends upon. Let’s do that nowUntuk membuat pengguna, buka MySQL Workbench dan sambungkan ke server Anda. Then run the following queries
The first query is fairly self explanatory. It creates a user called 5 with the password 6. The 7 sign after the username indicates that the database can be connected to from any location. The second query gives the user full acces to the 4 schema, as a result this user can see and modify all the tables, columns and data in the 4 schema but has no access to anything outside itNow that the user 5 has been created, we can use it to connect to the database. It’s possible to set up a connection in MySQL Workbench with this user, but since the permissions are limited, it’s better to keep MySQL Workbench using the 2 account. Instead, we’re going to use the new user when connecting from a PHP scriptConnecting to MySQL with PHPBefore you can retrieve content from your MySQL database for inclusion in a web page, you must know how to establish a connection to MySQL from inside a PHP script. So far, you’ve used an application called MySQL Workbench to connect to your database. Just as MySQL Workbench can connect directly to a running MySQL server, so too can your own PHP scripts Although this chapter talks entirely about connecting to MySQL from PHP, we’re actually connecting to the MariaDB database discussed in the previous chapter. PHP can’t see any difference between MySQL and MariaDB, as they’re interchangeable. I’ll refer to the database as MySQL throughout, because all of the commands used could be used to connect to a MySQL or MariaDB database server The original MySQL database provided a standardized method for clients such as MySQL Workbench and PHP to communicate with the server. MariaDB copied that standard, and all the commands in PHP use the name MySQL, so to keep things simple, I’ll use the term MySQL throughout this chapter to refer to the database There are three methods of connecting to a MySQL server from PHP
These all essentially do the same job — connecting to the database and sending queries to it — but they use different code to achieve it The MySQL library is the oldest method of connecting to the database and was introduced in PHP 2. 0. The features it contains are minimal, and it was superseded by MySQLi as of PHP 5. 0 (released in 2004) To connect and query the database using the old MySQL library, functions such as 2 and 3 are used. These functions have been deprecated — meaning they should be avoided — since PHP 5. 5, and have been removed from PHP entirely since PHP 7. 0Although most developers saw the reason for the change as soon as PHP 5. 0 was released, there are still hundreds of articles and code examples on the Web using these now non-existent 4 functions — despite the fact that MySQLi has effectively been the preferred library for fifteen yearsIf you come across a code example that contains the line 2, check the date of the article. It’s probably from the early 2000s, and in programming, you should never trust anything that old. Banyak hal berubah setiap saat — itulah sebabnya buku ini ada di edisi ketujuhDi PHP5. 0, the MySQLi library — standing for “MySQL Improved” — was released to address some of the limitations in the original MySQL library. Anda dapat dengan mudah mengidentifikasi penggunaan MySQLi, karena kode akan menggunakan fungsi seperti 6 dan 7Tak lama setelah rilis perpustakaan MySQLi di PHP 5. 0, PHP5. 1 dirilis, dengan sejumlah besar perubahan yang membantu membentuk cara kita menulis PHP hari ini (kebanyakan berkaitan dengan pemrograman berorientasi objek, yang akan Anda lihat nanti di buku ini). Salah satu perubahan besar dalam PHP 5. 1 was that it introduced a third library, PDO (PHP Data Objects), for connecting to MySQL databases Ada beberapa perbedaan antara PDO dan MySQLi, tetapi yang utama adalah Anda dapat menggunakan pustaka PDO untuk terhubung ke hampir semua server basis data — seperti server Oracle, atau Microsoft SQL Server. Untuk pengembang, keuntungan terbesar dari pendekatan generik ini adalah, setelah Anda mempelajari cara menggunakan pustaka untuk berinteraksi dengan database MySQL, sangat mudah untuk berinteraksi dengan server database lain. Bisa dibilang, menulis kode untuk PDO lebih mudah, dan ada beberapa nuansa yang dapat membuat kode PDO lebih mudah dibaca — parameter bernama dalam pernyataan yang disiapkan menjadi manfaat utama. (Don’t worry, I’ll explain what that means later on. ) For these reasons, most recent PHP projects use the PDO library, and it’s the library I’m going to show you how to use in this book. For more information on the differences, take a look at the SitePoint article “Re-introducing PDO – the Right Way to Access Databases in PHP” After that little history lesson, you’re probably eager to get back to writing code. Here’s how you use PDO to establish a connection to a MySQL server
For now, think of 8 as a built-in function, just like the 9 function we used in Chapter 2. If you’re thinking “Hey, functions can’t have spaces in their names. ”, you’re smarter than the average bear, and I’ll explain exactly what’s going on here in a moment. Bagaimanapun, dibutuhkan tiga argumen
You may remember from Chapter 2 that PHP functions usually return a value when they’re called. This 8 “function” returns a value called a 04 object that identifies the connection that’s been established. Since we intend to make use of the connection, we should hold onto this value by storing it in a variable. Here’s how that looks, with the necessary values filled in to connect to your database
You can probably see what’s going on with the last two arguments. they’re the username and password you created earlier in this chapter The first argument is a little more complicated. The 05 part tells PDO to use the database (also referred to as a schema) called 4. Any query run from PHP will default to tables in that schema. 07 will select records from the 08 table in the 4 schemaEven if you’re familiar with PHP, PDO and MySQL already, the 10 part looks confusing. Normally, this would be 11 (referring to the local computer, the same machine running PHP) or pointing to a specific domain name where the database is hosted, such as 12Why is it 10, and what does 14 refer to here? In Docker, each service is given a name. If you examine the 15 file that configures the server, the database service is called 14, and in Docker, one service can connect to another using the other service’s nameArguments aside, what’s important to see here is that the value returned by 8 is stored in a variable named 18The MySQL server is a completely separate piece of software from the web server. Therefore, we must consider the possibility that the server may be unavailable or inaccessible due to a network outage, or because the username/password combination you provided is rejected by the server, or because you just forgot to start your MySQL server. In such cases, 8 won’t run, and will throw a PHP exceptionNote. at least by default, PHP can be configured so that no exception is thrown and it simply won’t connect. This isn’t generally desirable behavior, as it makes it much more difficult to work out what went wrong If you’re wondering what it means to “throw a PHP exception”, brace yourself. You’re about to discover some more features of the PHP language A PHP exception is what happens when you tell PHP to perform a task and it’s unable to do it. PHP will try to do what it’s told, but will fail; and in order to tell you about the failure, it will throw an exception at you. An exception is little more than PHP just crashing with a specific error message. When an exception is thrown, PHP stops. No lines of code after the error will be executed As a responsible developer, it’s your job to catch that exception and do something about it so the program can continue Note. if you don’t catch an exception, PHP will stop running your PHP script and display a spectacularly ugly error message. That error message will even reveal the code of your script that threw the error. In this case, that code contains your MySQL username and password, so it’s especially important to avoid the error message being seen by users To catch an exception, you should surround the code that might throw an exception with a 20 statement
You can think of a 20 statement like an 22 statement, except that the second block of code is what happens if the first block of code fails to runConfused yet? I know I’m throwing (no pun intended) a lot of new concepts at you, but it will make more sense if I put it all together and show you what we have
As you can see, this code is a 20 statement. In the 24 block at the top, we attempt to connect to the database using 8. If this succeeds, we store the resulting PDO object in 18 so that we can work with our new database connection. If the connection is successful, the 27 variable is set to a message that will be displayed laterImportantly, inside a 20 statement, any code after an exception has been thrown won’t get executed. In this case, if connecting to the database throws an exception (maybe the password is wrong, or the server isn’t responding), the 27 variable will never get set to “Database connection established”If our database connection attempt fails, PHP will throw a 30, which is the type of exception that 8 throws. Our 32 block, therefore, says that it will catch a PDOException (and store it in a variable named 33). Inside that block, we set the variable 27 to contain a message about what went wrongHowever, this error message isn’t particularly useful. All it tells us is that PDO couldn’t connect to the database server. It would be better to have some information about why that was — for example, because the username and password were invalid The 33 variable contains details about the exception that occurred, including an error message describing the problem. We can add this to the output variable using concatenation
Catatan. the 33 variable isn’t a string, but an object. We’ll come to what that means shortly. For now, though, all you need to know is that the code 37 gets the error message based on the specific exception that occurredLike an 22 statement, one of the two branches of a 20 statement is guaranteed to run. Either the code in the 24 block will execute successfully, or the code in the 32 block will run. Regardless of whether the database connection was successful, there will be a message in the 27 variable — either the error message, or the message saying the connection was successfulFinally, regardless of whether the 24 block was successful, or the 32 block runs, the template 45 is included. This is a generic template that just displays some text to the page
The complete code can be found in Example. MySQL-Connect When the template is included, it will display either the error message or the “Database connection established” message I hope the aforementioned code is now making some sense to you. Feel free to go back to the start of this section and read it all again if you’re lost, as there were some tricky concepts in there. Once you have a firm grip on the code, however, you’ll probably realize that I’ve still left one mystery unexplained. PDOs. Just what exactly is 8, and when I said it returns a “PDO object”, just what exactly is an object?Note. all downloaded sample code includes a schema called 47 and a user called 47, so that you’re able to run it regardless of what you called your schema and user. A file containing the database is provided as 49, which you can importIf you use the web-based sample code viewer provided, the 50 database will be created as you load a sample, but any changes to this schema will be lost when you view another sample. (You can mess things up, and switching to another sample and back will reset it, but if you want to keep any changes you make, make them in the schema you created. )If you want to load the sample data into your schema using MySQL Workbench, import 49 from the 52 directory by selecting Data Import/Restore. Then select Import from self-contained file, browse to 49, and select your schema name in default target schema. If you have created any tables with the same name, they’ll be overwritten and all records lostA Crash Course in Object-oriented ProgrammingYou may have noticed the word “object” beginning to creep into my vocabulary in the previous section. PDO adalah ekstensi Objek Data PHP, dan 8 mengembalikan objek PDO. In this section, I’d like to explain what objects are all aboutPerhaps you’ve come across the term object-oriented programming (OOP) in your own explorations of PHP or of programming in general. OOP is an advanced style of programming that’s especially suited to building really complex programs with a lot of parts. Most programming languages in active use today support OOP. Some of them even require you to work in an OOP style. PHP is a little more easygoing about it, and leaves it up to the developer to decide whether or not to write their scripts in the OOP style So far, we’ve written our PHP code in a simpler style called procedural programming, and we’ll continue to do so for now, with a more detailed look at objects later on. Gaya prosedural sangat cocok untuk proyek yang relatif sederhana yang sedang kami tangani saat ini. Namun, hampir semua proyek kompleks yang Anda temui menggunakan OOP, dan saya akan membahasnya lebih detail nanti di buku ini. Konon, ekstensi PDO yang akan kita gunakan untuk terhubung dan bekerja dengan database MySQL dirancang dengan gaya pemrograman berorientasi objek. Artinya, daripada sekadar memanggil fungsi untuk terhubung ke MySQL dan kemudian memanggil fungsi lain yang menggunakan koneksi itu, pertama-tama kita harus membuat objek PDO yang akan mewakili koneksi database kita, lalu menggunakan fitur objek tersebut untuk bekerja dengan Membuat objek sangat mirip dengan memanggil fungsi. Faktanya, Anda sudah melihat cara melakukannya
Kata kunci _55 memberi tahu PHP bahwa Anda ingin membuat objek baru. Anda kemudian meninggalkan spasi dan menentukan nama kelas, yang memberi tahu PHP jenis objek apa yang ingin Anda buat. Kelas adalah sekumpulan instruksi yang akan diikuti PHP untuk membuat objek. Anda dapat menganggap kelas sebagai resep, seperti kue, dan objek sebagai kue sebenarnya yang dihasilkan dari mengikuti resep. Kelas yang berbeda dapat menghasilkan objek yang berbeda, seperti halnya resep yang berbeda dapat menghasilkan masakan yang berbedaSama seperti PHP hadir dengan banyak fungsi bawaan yang dapat Anda panggil, PHP hadir dengan pustaka kelas tempat Anda dapat membuat objek. 8, oleh karena itu, memberi tahu PHP untuk membuat objek 04 baru — yaitu, objek baru dari kelas 04 bawaanIn PHP, an object is a value, just like a string, number, or array. You can store an object in a variable or pass it to a function as an argument — all the same stuff you can do with other PHP values. Objects, however, have some useful additional features First of all, an object behaves a lot like an array, in that it acts as a container for other values. As we saw in Chapter 2, you can access a value inside an array by specifying its index (for example, 59). When it comes to objects, the concepts are similar but the names and code are different. Rather than accessing the value stored in an array index, we say that we’re accessing a property of the object. Instead of using square brackets to specify the name of the property we want to access, we use arrow notation ( 60) — for instance, 61
Whereas arrays are normally used to store a list of similar values (such as an array of birthdays), objects are used to store a list of related values (for example, the properties of a database connection). Still, if that’s all objects did, there wouldn’t be much point to them. we might just as well use an array to store these values, right? Of course, objects do more In addition to storing a collection of properties and their values, objects can contain a group of functions designed to bring us more useful features. A function stored in an object is called a method (one of the more confusing names in the programming world, if you ask me). Metode hanyalah fungsi di dalam kelas. Lebih membingungkan lagi, ketika kita mulai menulis kelas kita sendiri, metode ditentukan menggunakan kata kunci 62. Bahkan pengembang berpengalaman sering salah menggunakan fungsi dan metode secara bergantianUntuk memanggil metode, kami kembali menggunakan notasi panah — 63
Sama seperti fungsi mandiri, metode dapat menerima argumen dan mengembalikan nilai Pada tahap ini, ini mungkin terdengar agak rumit dan tidak berguna, tapi percayalah. menyatukan kumpulan variabel (properti) dan fungsi (metode) ke dalam bundel kecil yang disebut objek menghasilkan kode yang jauh lebih rapi dan lebih mudah dibaca untuk tugas tertentu — bekerja dengan database hanyalah salah satunya. Suatu hari, Anda bahkan mungkin ingin mengembangkan kelas khusus yang dapat Anda gunakan untuk membuat objek rancangan Anda sendiri Namun, untuk saat ini, kami akan tetap menggunakan kelas yang disertakan dengan PHP. Mari terus bekerja dengan objek _04 yang telah kita buat, dan lihat apa yang dapat kita lakukan dengan memanggil salah satu metodenyaKonfigurasi KoneksiSejauh ini, saya telah menunjukkan kepada Anda cara membuat objek 04 untuk membuat koneksi dengan database MySQL Anda, dan cara menampilkan pesan kesalahan yang berarti ketika terjadi kesalahan _0Namun, dengan asumsi koneksi berhasil, Anda perlu mengonfigurasinya sebelum digunakan. You can configure your connection by calling some methods of your new 04 objectSebelum mengirim kueri ke database, kita harus mengonfigurasi pengkodean karakter koneksi database kita. Seperti yang saya sebutkan secara singkat di Bab 2, Anda harus menggunakan teks berenkode UTF-8 di situs web Anda untuk memaksimalkan rentang karakter yang dimiliki pengguna saat mengisi formulir di situs Anda. Secara default, ketika PHP terhubung ke MySQL, ia menggunakan pengkodean ISO-8859-1 (atau Latin-1) yang lebih sederhana daripada UTF-8. Jika kita membiarkannya apa adanya, kita tidak akan dapat dengan mudah memasukkan karakter China, Arab, atau sebagian besar non-Inggris Meskipun Anda 100% yakin bahwa situs web Anda hanya akan digunakan oleh penutur bahasa Inggris, ada masalah lain yang disebabkan karena tidak mengatur rangkaian karakter. Jika halaman web Anda tidak disetel ke UTF-8, Anda akan mengalami masalah saat orang menulis karakter tertentu seperti kutipan keriting 67 ke dalam kotak teks, karena karakter tersebut akan muncul di database sebagai karakter yang berbedaOleh karena itu, kita sekarang perlu menyetel objek ________18______04 baru kita untuk menggunakan pengkodean UTF-8 Kita dapat menginstruksikan PHP untuk menggunakan UTF-8 saat menanyakan database dengan menambahkan 69 ke string koneksi. Tidak ada kerugian untuk melakukan ini, asalkan skrip PHP Anda juga dikirim ke browser sebagai 70 (yang merupakan default di versi PHP terbaru) _1Catatan. jika Anda mencari, Anda akan menemukan berbagai cara untuk menyetel rangkaian karakter, dan edisi sebelumnya dari buku ini menginstruksikan Anda untuk menggunakan kode ini _2Ini karena, hingga PHP 5. 3. 6, opsi charset tidak diterapkan dengan benar oleh PHP. Karena ini diperbaiki dalam versi PHP apa pun yang sebenarnya akan Anda gunakan, menyetel charset sebagai bagian dari string koneksi adalah pilihan yang lebih disukai Kode lengkap yang kami gunakan untuk terhubung ke MySQL dan kemudian mengkonfigurasi koneksi itu, oleh karena itu, ditampilkan di bawah ini Contoh. MySQL-Connect-Lengkap _3Jalankan contoh ini di browser Anda. (Jika Anda telah menempatkan kode basis data Anda di 71 di dalam direktori 72 dan file 45 di dalam direktori 74, URL untuk halaman tersebut adalah 75. )Jika server Anda aktif dan berjalan, dan semuanya berfungsi dengan baik, Anda akan melihat pesan yang menunjukkan keberhasilan Jika PHP tidak dapat terhubung ke server MySQL Anda, atau jika nama pengguna dan kata sandi yang Anda berikan salah, Anda malah akan melihat layar yang mirip dengan yang ditunjukkan di bawah ini. Untuk memastikan kode penanganan kesalahan Anda berfungsi dengan baik, Anda mungkin ingin salah mengeja kata sandi untuk mengujinya Berkat blok _32 kami, pesan kesalahan dari database telah disertakan di halaman _4Metode _77 mengembalikan pesan yang menjelaskan pengecualian yang terjadi. Ada beberapa metode lain — termasuk _78 dan 79 — untuk mengembalikan nama file dan nomor baris tempat pengecualian dilemparkan. Anda dapat menghasilkan pesan kesalahan yang sangat mendetail seperti ini _5Ini sangat berguna jika Anda memiliki situs web besar dengan lusinan file penyertaan. Pesan kesalahan akan memberi tahu Anda file mana yang harus dicari dan di baris mana kesalahan terjadi Jika Anda penasaran, coba masukkan beberapa kesalahan lain dalam kode koneksi basis data Anda (misalnya, nama basis data yang salah eja) dan amati pesan kesalahan mendetail yang dihasilkan. Setelah selesai, dan koneksi database Anda berfungsi dengan benar, kembali ke pesan kesalahan sederhana. Dengan cara ini, pengunjung Anda tidak akan dibombardir dengan gobbledygook teknis jika masalah nyata muncul dengan server database Anda Dengan koneksi dibuat dan database dipilih, Anda siap untuk mulai menggunakan data yang disimpan dalam database Anda mungkin bertanya-tanya apa yang terjadi pada koneksi dengan server MySQL setelah skrip selesai dijalankan. Jika Anda benar-benar menginginkannya, Anda dapat memaksa PHP untuk memutuskan sambungan dari server dengan membuang objek 04 yang mewakili koneksi Anda. Anda melakukan ini dengan menyetel variabel yang berisi objek ke 81 _6Yang mengatakan, PHP akan secara otomatis menutup semua koneksi database yang terbuka ketika selesai menjalankan skrip Anda, sehingga Anda biasanya dapat membiarkan PHP membersihkan setelah Anda Mengirim Query SQL dengan PHPDi Bab 3, kita terhubung ke server database MySQL menggunakan MySQL Workbench, yang memungkinkan kita mengetik kueri SQL (perintah) dan melihat hasil kueri tersebut dengan segera. Objek _04 menawarkan mekanisme serupa — metode exec _7Di sini, _83 adalah string yang berisi kueri SQL apa pun yang ingin Anda jalankanSeperti yang Anda ketahui, jika ada masalah dalam mengeksekusi kueri (misalnya, jika Anda membuat kesalahan pengetikan dalam kueri SQL), metode ini akan menampilkan 30 untuk Anda tangkapPerhatikan contoh berikut, yang mencoba membuat tabel lelucon yang kita buat di Bab 3 Contoh. MySQL-Buat _8Perhatikan bahwa kami menggunakan teknik pernyataan _20 yang sama untuk menangani kemungkinan kesalahan yang dihasilkan oleh kueri. Dimungkinkan untuk menggunakan beberapa blok _20 untuk menampilkan pesan kesalahan yang berbeda — satu untuk koneksi dan satu lagi untuk kueri — tetapi ini dapat menghasilkan kode tambahan yang cukup banyakSebagai gantinya, saya telah memilih untuk menggunakan pernyataan 24 yang sama untuk memuat koneksi dan kueri. Blok _20 akan berhenti mengeksekusi kode setelah terjadi kesalahan, jadi jika terjadi kesalahan selama koneksi database, baris 89 tidak akan pernah berjalan, memastikan bahwa, jika kueri dikirim ke database, koneksi harus dibuatPendekatan ini memberi kita sedikit kontrol atas pesan kesalahan yang ditampilkan, tetapi menghemat pengetikan pernyataan 20 untuk setiap operasi basis data. Nanti di buku ini, kita akan membaginya menjadi blok-blok yang berbeda, tetapi untuk saat ini, pertahankan semua operasi basis data di blok 24 yang samaContoh ini juga menggunakan metode _92 untuk mengambil pesan kesalahan mendetail dari server MySQL. Gambar berikut menunjukkan kesalahan yang ditampilkan saat, misalnya, tabel lelucon sudah adaUntuk kueri _93, 94, dan 95 (yang berfungsi untuk memodifikasi data yang disimpan), metode 96 mengembalikan jumlah baris tabel (entri) yang dipengaruhi oleh kueri. Pertimbangkan perintah SQL berikut, yang kami gunakan di Bab 3 untuk mengatur tanggal semua lelucon yang berisi kata "programmer"Contoh. Pembaruan MySQL _9Dengan menyimpan nilai yang dikembalikan dari metode exec di 97, kita dapat menggunakan variabel dalam variabel 27 untuk dicetak di templateGambar di bawah menunjukkan output dari contoh ini, dengan asumsi hanya ada satu lelucon "programmer" di database Anda Jika Anda me-refresh halaman untuk menjalankan kueri yang sama lagi, Anda akan melihat perubahan pesan, seperti yang diperlihatkan dalam gambar berikut. Ini menunjukkan bahwa tidak ada baris yang diperbarui, karena tanggal baru yang diterapkan pada lelucon sama dengan tanggal yang ada _99 kueri diperlakukan sedikit berbeda, karena dapat mengambil banyak data, dan PHP menyediakan cara untuk menangani informasi tersebutPenanganan new PDO('mysql:host=hostname;dbname=database', 'username', 'password') _99 Kumpulan HasilUntuk sebagian besar kueri SQL, metode _96 berfungsi dengan baik. Kueri melakukan sesuatu ke database Anda, dan Anda mendapatkan jumlah baris yang terpengaruh (jika ada) dari nilai pengembalian metode. _99 kueri, bagaimanapun, membutuhkan sesuatu yang sedikit lebih menarik daripada 96. Anda akan ingat bahwa _99 kueri digunakan untuk melihat data yang disimpan dalam database. Alih-alih hanya memengaruhi database, _99 kueri memiliki hasil — dan kami memerlukan metode untuk mengembalikannyaMetode kueri terlihat seperti _96, yang menerima kueri SQL sebagai argumen untuk dikirim ke server basis data. Apa yang dikembalikan, bagaimanapun, adalah objek _07, yang mewakili kumpulan hasil yang berisi daftar semua baris (entri) yang dikembalikan dari kueri 0Asalkan tidak ada kesalahan yang ditemukan dalam memproses kueri, kode ini akan menyimpan kumpulan hasil (dalam bentuk objek 07) ke dalam variabel 09. Kumpulan hasil ini berisi teks dari semua lelucon yang disimpan di tabel 08. Karena tidak ada batasan praktis untuk jumlah lelucon dalam basis data, kumpulan hasil bisa sangat besarSaya sebutkan kembali di Bab 2 bahwa _11 loop adalah struktur kontrol yang berguna ketika kita perlu mengulang tetapi tidak tahu berapa kali. Kami tidak dapat menggunakan _12 loop, karena kami tidak tahu berapa banyak rekaman yang dikembalikan kueri. Memang, Anda bisa menggunakan _11 loop di sini untuk memproses baris dalam kumpulan hasil satu per satu 1Kondisi untuk loop _11 mungkin berbeda dari kondisi yang biasa Anda gunakan, jadi izinkan saya menjelaskan cara kerjanya. Pertimbangkan kondisi sebagai pernyataan dengan sendirinya 2The 15 method of the 07 object returns the next row in the result set as an array (we discussed arrays in Chapter 2). Ketika tidak ada lagi baris di set hasil, 15 mengembalikan 18 sebagai gantinya. (Ini adalah satu kasus di mana meminta objek PDO untuk melakukan sesuatu yang tidak dapat dilakukan — karena 15 tidak dapat mengembalikan baris berikutnya ketika tidak ada baris yang tersisa di set hasil — tidak akan melempar 30. Jika ya, kami tidak dapat menggunakan metode 15 dalam kondisi loop 11 seperti yang kami lakukan di sini. )Sekarang, pernyataan di atas memberikan nilai ke variabel 23, tetapi, pada saat yang sama, pernyataan secara keseluruhan mengambil nilai yang sama. Inilah yang memungkinkan Anda menggunakan pernyataan sebagai kondisi dalam 11 loop. Karena perulangan _11 akan terus berulang hingga kondisinya bernilai 18, perulangan ini akan terjadi sebanyak jumlah baris dalam kumpulan hasil, dengan 23 mengambil nilai baris berikutnya setiap kali perulangan dijalankan. Yang tersisa untuk diketahui adalah bagaimana mengambil nilai dari variabel 23 setiap kali loop berjalanBaris dari kumpulan hasil yang dikembalikan oleh 15 direpresentasikan sebagai larik asosiatif, dengan indeks yang dinamai sesuai kolom tabel di kumpulan hasil. Jika _23 adalah baris dalam himpunan hasil kita, 31 adalah nilai dalam kolom 32 dari baris tersebutTujuan kami dalam kode ini adalah untuk menyimpan teks dari semua lelucon sehingga kami dapat menampilkannya dalam template PHP. Cara terbaik untuk melakukannya adalah dengan menyimpan setiap lelucon sebagai item baru dalam array, 33 3Dengan lelucon yang ditarik dari database, sekarang kita dapat meneruskannya ke template PHP 34Untuk meringkas, inilah kode pengontrol untuk contoh ini sejauh ini 4Variabel _33 adalah larik yang menyimpan daftar lelucon. Jika Anda menulis isi array dalam PHP, akan terlihat seperti ini 5Namun, data telah diambil dari database daripada diketik secara manual dalam kode Anda akan menyadari bahwa ada dua variabel berbeda yang ditetapkan — 33 dan 37 — bergantung pada berhasil atau tidaknya blok 24Dalam templat _34, kita perlu menampilkan konten larik ________26______33 atau pesan kesalahan yang terkandung dalam variabel 37Untuk memeriksa apakah suatu variabel telah diberi nilai atau tidak, kita dapat menggunakan fungsi 42 yang kita gunakan sebelumnya untuk memeriksa apakah suatu formulir telah dikirimkan. Templat dapat menyertakan pernyataan _43 untuk menentukan apakah akan menampilkan kesalahan atau daftar lelucon 6Tidak ada yang baru di sini, tetapi untuk menampilkan lelucon, kita perlu menampilkan konten larik 33. Tidak seperti variabel lain yang telah kami gunakan hingga saat ini, larik 33 berisi lebih dari sekadar satu nilaiCara paling umum untuk memproses array di PHP adalah dengan menggunakan loop. Kami telah melihat _11 loop dan 12 loop. Loop _48 sangat membantu untuk memproses array 7Alih-alih kondisi, tanda kurung di bagian atas loop 48 berisi larik, diikuti dengan kata kunci 50, lalu nama variabel baru yang akan digunakan untuk menyimpan setiap item larik secara bergantian. Badan perulangan kemudian dieksekusi sekali untuk setiap item dalam larik. Setiap kali item tersebut disimpan dalam variabel yang ditentukan, sehingga kode dapat mengaksesnya secara langsungAdalah umum untuk menggunakan _48 loop dalam template PHP untuk menampilkan setiap item dari array secara bergantian. Begini cara mencari array ________26______33 kami 8Dengan perpaduan kode PHP untuk mendeskripsikan loop dan kode HTML untuk menampilkannya, kode tersebut terlihat agak tidak rapi. Oleh karena itu, biasanya menggunakan cara penulisan alternatif 48 loop saat digunakan dalam template _9Kedua potongan kode tersebut secara fungsional identik, tetapi yang terakhir terlihat lebih bersahabat bila dicampur dengan kode HTML. Beginilah bentuk kode ini terlihat di template 0Hal yang sama dapat dilakukan dengan 43 pernyataan, membuatnya lebih baik untuk melihat di dalam template HTML dengan menghindari kawat gigi 1Dengan alat baru ini, kita dapat menulis template kita untuk menampilkan daftar lelucon Contoh. MySQL-ListJokes 2Baik teks _37 ditampilkan di halaman atau setiap lelucon ditampilkan dalam satu paragraf ( 56) yang terkandung dalam kutipan blok ( 57), karena kami secara efektif mengutip penulis setiap lelucon di halaman iniKarena lelucon mungkin berisi karakter yang dapat ditafsirkan sebagai kode HTML (misalnya, ________26______58, 59, atau 60), kita harus menggunakan 61 untuk memastikan bahwa lelucon tersebut diterjemahkan ke dalam entitas karakter HTML (yaitu, 62, 63, dan ________66) Gambar berikut menunjukkan tampilan halaman ini setelah Anda menambahkan beberapa lelucon ke database Ingat bagaimana kami menggunakan _11 loop di controller kami untuk mengambil baris dari hasil 07 yang ditetapkan satu per satu? 3Ternyata 07 objek dirancang untuk berperilaku seperti array saat Anda meneruskannya ke 48 loop. Oleh karena itu, Anda dapat sedikit menyederhanakan kode pemrosesan database Anda menggunakan 48 loop alih-alih 11 loop 4Saya akan menggunakan formulir ________26______48 yang lebih rapi ini di sisa buku ini Alat bagus lainnya yang ditawarkan PHP adalah cara singkat untuk memanggil perintah 1 — yang, seperti yang telah Anda lihat, perlu sering kita gunakan. Pernyataan _1 kami terlihat seperti ini 5Sebagai gantinya, kita bisa menggunakan ini 6Ini melakukan hal yang persis sama. 74 berarti 1 dan memberi Anda cara yang sedikit lebih pendek untuk mencetak variabel. Namun, ada batasan untuk ini. jika Anda menggunakan _74, Anda hanya dapat mencetak. Anda tidak dapat menyertakan pernyataan _43, pernyataan 12, dan seterusnya, meskipun Anda dapat menggunakan gabungan, dan dapat diikuti dengan pemanggilan fungsiIni adalah template yang diperbarui menggunakan gema steno Contoh. MySQL-ListJokes-Singkatan 7Saya akan menggunakan notasi steno jika sudah berlaku sejak saat ini Catatan. dalam versi PHP sebelum 5. 4, notasi steno ini membutuhkan pengaturan PHP yang tidak umum untuk diaktifkan, sehingga tidak disarankan karena alasan kompatibilitas. Menggunakan notasi steno dapat menyebabkan kode Anda berhenti berfungsi saat berpindah dari server yang mengaktifkannya ke server yang tidak mengaktifkannya Mulai dari PHP5. 4 (jadi versi apa pun yang secara realistis akan Anda temui hari ini), gema steno berfungsi terlepas dari pengaturan PHP, sehingga Anda dapat menggunakannya dengan aman tanpa khawatir itu mungkin tidak berfungsi di semua server Berpikir ke depanPada contoh yang baru saja kita lihat, kita membuat template, 34, yang berisi semua HTML yang diperlukan untuk menampilkan halaman. Namun, seiring pertumbuhan situs web kami, kami akan menambahkan lebih banyak halaman. Kami pasti menginginkan halaman agar orang-orang dapat menambahkan lelucon ke situs web, dan kami juga memerlukan halaman beranda dengan beberapa teks pengantar, halaman dengan detail kontak pemilik, dan, seiring pertumbuhan situs, bahkan mungkin Saya sedikit melompat ke depan di sini, tetapi selalu ada baiknya mempertimbangkan bagaimana sebuah proyek akan tumbuh. Jika kita menerapkan pendekatan yang baru saja kita gunakan untuk 34 ke template lainnya — 81, 82, 83, 84 dan seterusnya — kita akan mendapatkan banyak kode berulangSetiap halaman di situs web akan membutuhkan template yang akan terlihat seperti ini 8Sebagai seorang programmer, mengulang kode adalah salah satu hal terburuk yang dapat Anda lakukan. Faktanya, programmer sering mengacu pada prinsip KERING, yang merupakan singkatan dari "Jangan ulangi dirimu sendiri". Jika Anda mendapati diri Anda mengulang bagian kode, hampir pasti ada solusi yang lebih baik Semua pemrogram terbaik itu malas, dan mengulang kode berarti mengulang pekerjaan. Menggunakan pendekatan salin/tempel untuk templat ini membuat situs web sangat sulit dipelihara. Bayangkan ada bagian footer dan navigasi yang ingin kita tampilkan di setiap halaman. Template kami sekarang akan terlihat seperti ini _9Kami akan mengalami masalah di tahun 2022. Jika template untuk semua halaman di situs web — misalnya, 34 81, 82, 83 dan 84 — berisi kode dalam struktur di atas, untuk memperbarui tahun dalam pemberitahuan hak cipta menjadi “2022”, Anda harus membuka setiap Kita bisa pintar dan membuat tanggal secara dinamis dibaca dari jam server ( 90 jika Anda penasaran. ) untuk menghindari masalah ini, tetapi bagaimana jika kami ingin menambahkan tag 91 yang disertakan di setiap laman? Mengubah lima atau enam templat mungkin sedikit mengganggu, tetapi tidak akan menimbulkan banyak masalah. Namun, bagaimana jika website bertambah hingga puluhan atau ratusan halaman? Masalah ini dapat diselesaikan dengan serangkaian 92 pernyataan. Sebagai contoh _0Tetapi metode ini membutuhkan kewaskitaan. kita perlu mengantisipasi dengan tepat perubahan apa yang mungkin perlu dilakukan di masa mendatang dan menggunakan pernyataan 92 yang relevan di tempat yang kita perkirakan akan terjadi perubahanDalam contoh di atas, misalnya, mudah untuk menambahkan entri menu baru dengan menambahkannya ke 94, tetapi menambahkan tag 91 ke setiap halaman, atau bahkan sesuatu yang sepele seperti menambahkan kelas CSS ke elemen 96, tetap berarti membuka setiap template Tidak ada cara untuk memprediksi secara akurat semua perubahan yang mungkin diperlukan selama masa hidup situs web, jadi pendekatan yang saya tunjukkan di awal bab ini sebenarnya lebih baik _1Jika kami selalu menyertakan template ini, yang akan kami sebut 97, variabel 27 dapat disetel ke beberapa kode HTML dan menampilkannya di halaman dengan navigasi dan footer. Manfaatnya adalah, untuk mengubah tanggal di setiap halaman situs web, kita hanya perlu mengubahnya di satu lokasiSaya juga menyelinap dalam variabel 99 sehingga setiap pengontrol dapat menentukan nilai yang muncul antara 00 dan 01 tag bersama dengan beberapa CSS (tersedia sebagai 02 dalam kode contoh) untuk membuat halaman sedikit lebih cantikPengontrol apa pun sekarang dapat menggunakan 03 dan memberikan nilai untuk 27 dan 99 _06 kami menggunakan 97 diberi kode seperti yang ditunjukkan di bawah iniContoh. MySQL-ListJokes-Layout-1 _2Tapi tunggu. Apa yang terjadi dengan _27 di blok 24? . loop membuat string yang berisi kode HTML untuk daftar leluconPada prinsipnya, inilah yang kami inginkan terjadi. variabel _27 berisi kode HTML yang akan disisipkan di antara navigasi dan footer di 97, tapi saya pikir Anda akan setuju bahwa kodenya sangat jelekSaya sudah menunjukkan cara menghindari pencampuran kode HTML dan PHP melalui pernyataan 92. Seperti yang kita lakukan sebelumnya, sebaiknya pindahkan HTML untuk menampilkan lelucon ke filenya sendiri — tetapi kali ini, hanya kode HTML yang unik untuk halaman daftar lelucon 34 di 74 direktori harus berisi kode ini _3Yang penting, ini hanya kode untuk menampilkan lelucon. Itu tidak berisi navigasi, footer, 16 tag atau apa pun yang kita ingin diulang pada setiap halaman; Untuk menggunakan templat ini, Anda dapat mencoba yang berikut ini _4Atau jika Anda sangat pintar _5Dengan pendekatan ini, logika Anda akan sepenuhnya masuk akal. Kita perlu menyertakan _34. Sayangnya, pernyataan _92 hanya mengeksekusi kode dari file yang disertakan pada titik yang disebut. Jika Anda menjalankan kode di atas, hasilnya akan menjadi seperti ini _6Karena 34 disertakan terlebih dahulu, dikirim ke browser terlebih dahulu. Apa yang perlu kita lakukan adalah memuat _34, tetapi alih-alih mengirim output langsung ke browser, kita perlu menangkapnya dan menyimpannya dalam variabel 27 sehingga dapat digunakan nanti oleh 97Pernyataan _92 tidak mengembalikan nilai, jadi 24 tidak memiliki efek yang diinginkan, dan PHP tidak memiliki pernyataan alternatif untuk melakukannya. Namun, itu tidak berarti bahwa itu tidak mungkinPHP memang memiliki fitur berguna yang disebut "buffer output". Mungkin terdengar rumit, tetapi konsepnya sebenarnya sangat sederhana. when you use 1 to print something, or 92 to include a file that contains HTML, usually it’s sent directly to the browser. Dengan memanfaatkan buffering keluaran, alih-alih mengirim keluaran langsung ke browser, kode HTML disimpan di server dalam "buffer", yang pada dasarnya hanyalah sebuah string yang berisi semua yang telah dicetak sejauh ini.Lebih baik lagi, PHP memungkinkan Anda mengaktifkan buffer dan membaca isinya kapan saja Ada dua fungsi yang kita butuhkan
Seperti yang mungkin sudah Anda duga, "ob" pada nama fungsi adalah singkatan dari "output buffer" Untuk menangkap konten dari file yang disertakan, kita hanya perlu menggunakan kedua fungsi ini _7Saat kode ini berjalan, variabel 27 akan berisi HTML yang dibuat di template 34Kami akan menggunakan pendekatan ini mulai sekarang. Setiap halaman akan terdiri dari dua template
_06 lengkap terlihat seperti ini _8Mari buat tautan "Beranda" berfungsi dengan menambahkan file 71. Kami bisa meletakkan apa saja di halaman ini. lelucon terbaru, lelucon terbaik bulan ini, atau apapun yang kita suka. Untuk saat ini, kami akan tetap sederhana dan hanya memiliki pesan yang mengatakan "Selamat datang di Internet Joke Database"Buat file bernama _82 di folder 74 _9 _71 kami jauh lebih sederhana daripada 34. Itu tidak mendapatkan informasi apa pun dari database, jadi tidak memerlukan koneksi database dan kami tidak memerlukan pernyataan 20, jadi kami hanya akan memuat dua templat dan mengatur variabel 99 dan 27Contoh. MySQL-ListJokes-Layout-3 0Catatan. itu praktik yang baik untuk hanya terhubung ke database jika Anda perlu. Basis data adalah hambatan kinerja yang paling umum di banyak situs web, jadi sebaiknya buat koneksi sesedikit mungkin Uji apakah kedua halaman berfungsi di browser Anda. Anda harus memiliki daftar lelucon yang terlihat saat Anda mengunjungi 43 dan pesan selamat datang di 43. Kedua halaman harus berisi navigasi dan footerCoba ubah _97. Perubahan yang Anda buat akan muncul di kedua halaman. Jika situs memiliki lusinan halaman, perubahan tata letak akan memengaruhi setiap halamanMemasukkan Data ke dalam DatabaseDi bagian ini, saya akan mendemonstrasikan cara menggunakan alat yang Anda inginkan untuk memungkinkan pengunjung situs menambahkan lelucon mereka sendiri ke database Jika Anda ingin membiarkan pengunjung situs Anda memasukkan lelucon baru, Anda jelas memerlukan formulir. Ini adalah template untuk formulir yang sesuai dengan tagihan _1Simpan ini sebagai _81 di direktori 74Bagian terpenting dari elemen _48 adalah atribut 49. Atribut _49 memberi tahu browser ke mana mengirim data setelah formulir dikirimkan. Ini bisa menjadi nama file, seperti 51Namun, jika Anda mengosongkan atribut dengan menyetelnya ke 52, data yang diberikan oleh pengguna akan dikirim kembali ke halaman yang sedang Anda lihat. Jika URL browser menunjukkan halaman sebagai 53, itu adalah data yang akan dikirim saat pengguna menekan tombol AddMari kaitkan formulir ini dengan contoh sebelumnya, yang menampilkan daftar lelucon di database. Buka _97 dan tambahkan URL ke tautan "Tambahkan Lelucon baru" yang mengarah ke 53 _2Meskipun Anda memiliki _97 terbuka, sertakan lembar gaya 57 dari Bab 2 seperti yang saya miliki di atas. Sekarang, setiap form yang ditampilkan di dalam layout akan memiliki style yang kita gunakan sebelumnyaSaat formulir ini dikirimkan, permintaan akan menyertakan variabel — 32 — yang berisi teks lelucon seperti yang diketik di area teks. Variabel ini kemudian akan muncul di array 59 yang dibuat oleh PHPMari buat _53 di direktori 72. Logika dasar untuk pengontrol ini adalah
Buat kerangka ini _53 _3Pernyataan 43 pembuka ini memeriksa apakah array 59 berisi variabel bernama 32. Jika disetel, formulir telah dikirimkan. Jika tidak, formulir dari _81 dimuat ke dalam variabel 27 untuk ditampilkan di browserJika Anda membuka _53 di browser Anda saat ini, Anda akan melihat formulirnya, tetapi mengetik lelucon dan menekan Tambah tidak akan berfungsi, karena kami belum melakukan apa pun dengan data yang terkandung di 70Untuk memasukkan lelucon yang dikirimkan ke dalam database, kita harus mengeksekusi kueri 94 menggunakan nilai yang disimpan di 70 untuk mengisi kolom 32 dari tabel 08. Ini mungkin mengarahkan Anda untuk menulis beberapa kode seperti ini _4Namun, ada masalah serius dengan kode ini. isi 70 sepenuhnya berada di bawah kendali pengguna yang mengirimkan formulir. Jika pengguna jahat mengetikkan beberapa kode SQL jahat ke dalam formulir, skrip ini akan memasukkannya ke server MySQL Anda tanpa pertanyaan. Jenis serangan ini disebut serangan injeksi SQL, dan pada masa awal PHP ini adalah salah satu lubang keamanan paling umum yang ditemukan dan dieksploitasi oleh peretas di situs web berbasis PHP. (Di banyak ceruk pemrograman, serangan injeksi SQL masih sangat efektif, karena pengembang tidak mengharapkannya. Pertimbangkan upaya luar biasa ini untuk menyebabkan kamera lalu lintas menjatuhkan basis data mereka. “Plat Nomor Injeksi SQL Berharap untuk Menggagalkan Kamera Lalu Lintas Euro”. )Seorang pengguna mungkin mengetik ini ke dalam kotak teks _5Kueri yang dikirim ke database adalah sebagai berikut _6Tetapi bagaimana jika pengguna mengetik berikut ini _7Dalam hal ini, kueri yang dikirim ke database adalah ini _8Karena lelucon berisi karakter kutipan, MySQL akan mengembalikan kesalahan, karena akan melihat kutipan sebelum "mendapatkan" sebagai akhir dari string Untuk menjadikan ini kueri yang valid, kita perlu meng-escape semua tanda kutip dalam teks sehingga kueri yang dikirim ke database menjadi this _9Data tidak dimasukkan jika berisi kutipan merupakan masalah yang mengganggu bagi pengguna. Mereka akan kehilangan apa pun yang mereka ketik. Tetapi pengguna jahat dapat menyalahgunakan ini. Di versi PHP yang lebih lama, dimungkinkan untuk menjalankan beberapa kueri dari PHP dengan memisahkannya dengan titik koma ( 76)Bayangkan jika pengguna mengetik ini ke dalam kotak 0Ini akan mengirimkan kueri berikut ke database 1 77 adalah satu baris komentar di MySQL, jadi baris terakhir akan diabaikan, dan kueri 94 akan dijalankan, diikuti dengan kueri 93 yang telah diketik pengguna ke dalam kotak. Faktanya, pengguna dapat mengetik kueri apa pun yang mereka suka ke dalam kotak dan kueri tersebut akan dijalankan di databaseKutipan AjaibPada hari-hari awal PHP, serangan injeksi SQL sangat ditakuti sehingga tim di belakang PHP menambahkan beberapa perlindungan bawaan terhadap injeksi SQL ke bahasa tersebut. Pertama, mereka menonaktifkan kemampuan untuk mengirim banyak kueri sekaligus. Kedua, mereka menambahkan sesuatu yang disebut kutipan ajaib. Fitur pelindung PHP ini secara otomatis menganalisis semua nilai yang dikirimkan oleh browser dan menyisipkan garis miring terbalik ( 80) di depan karakter "berbahaya" seperti apostrof — yang dapat menyebabkan masalah jika disertakan dalam kueri SQL secara tidak sengajaMasalah dengan fitur kutipan ajaib adalah menyebabkan banyak masalah seperti yang dicegah. Pertama-tama, karakter yang terdeteksi, dan metode yang digunakan untuk membersihkannya (mengawalinya dengan garis miring terbalik), hanya valid dalam beberapa keadaan. Bergantung pada pengkodean karakter situs Anda dan server basis data yang Anda gunakan, langkah-langkah ini bisa jadi sama sekali tidak efektif Kedua, ketika nilai yang dikirimkan digunakan untuk beberapa tujuan selain membuat kueri SQL, garis miring terbalik tersebut bisa sangat mengganggu. Fitur kutipan ajaib akan menyisipkan garis miring terbalik palsu ke nama belakang pengguna jika berisi apostrof Singkatnya, fitur kutipan ajaib adalah ide yang buruk — sedemikian rupa sehingga dihapus dari PHP dari versi 5. 4. Namun, karena usia PHP dan jumlah kode di luar sana, Anda mungkin menemukan beberapa referensi untuk itu, jadi ada baiknya memiliki pemahaman dasar tentang apa yang seharusnya dilakukan oleh fitur kutipan ajaib. Setelah kutipan ajaib diidentifikasi sebagai ide yang buruk, saran dari pengembang PHP adalah untuk mematikannya. Namun, ini berarti bahwa ada beberapa server web yang dimatikan dan yang lainnya dihidupkan. Ini memusingkan para pengembang. mereka harus menginstruksikan semua orang yang akan menggunakan kode mereka untuk mematikannya — yang tidak mungkin dilakukan di beberapa server bersama — atau menulis kode tambahan untuk memperhitungkannya Sebagian besar pengembang memilih yang terakhir, dan Anda mungkin menemukan beberapa kode seperti ini 2Jika Anda melihat pernyataan _43 seperti ini di kode lawas yang telah diberikan kepada Anda untuk dikerjakan, Anda dapat menghapus seluruh blok dengan aman, karena tidak ada kode di dalam pernyataan 43 yang akan dieksekusi pada versi PHP terbaruJika Anda melihat kode seperti ini, itu berarti pengembang asli memahami masalah kutipan ajaib dan melakukan yang terbaik untuk mencegahnya. Mulai dari PHP5. 4 (yang tidak boleh Anda temukan, karena tidak lagi didukung), 83 akan selalu mengembalikan 18 dan kode tidak akan pernah dieksekusiYang benar-benar perlu Anda ketahui tentang kutipan ajaib adalah bahwa itu adalah solusi yang buruk untuk masalah yang dihadapi. Tentu saja, tanpa kutipan ajaib, Anda perlu mencari solusi berbeda untuk masalah tersebut. Untungnya, kelas PDO dapat melakukan semua kerja keras untuk Anda, dengan menggunakan sesuatu yang disebut “prepared statements” Pernyataan yang DisiapkanPernyataan yang disiapkan adalah jenis kueri SQL khusus yang telah Anda kirimkan ke server basis data Anda sebelumnya, memberi server kesempatan untuk mempersiapkannya untuk dieksekusi — tetapi tidak benar-benar mengeksekusinya. Anggap saja seperti menulis skrip ________43______85. Kode ada di sana, tetapi tidak benar-benar dijalankan sampai Anda mengunjungi halaman di browser web Anda. Kode SQL dalam pernyataan yang disiapkan dapat berisi placeholder yang akan Anda berikan nilainya nanti, saat kueri akan dieksekusi. Saat mengisi tempat penampung ini, PDO cukup pintar untuk menjaga dari karakter "berbahaya" secara otomatis Inilah cara menyiapkan kueri _94 dan kemudian menjalankannya dengan aman dengan 70 sebagai teks lelucon 3Mari kita uraikan ini, satu pernyataan pada satu waktu. Pertama, kami menulis kueri SQL kami sebagai string PHP dan menyimpannya dalam variabel ( 88) seperti biasa. Namun, yang tidak biasa tentang kueri _94 ini adalah tidak ada nilai yang ditentukan untuk kolom 32. Sebagai gantinya, ini berisi placeholder untuk nilai ini ( 91). Jangan khawatir tentang bidang 92 tadi; Selanjutnya, kita memanggil metode persiapan objek PDO kita ( 18), meneruskan kueri SQL kita sebagai argumen. Ini mengirimkan kueri ke server MySQL, memintanya bersiap untuk menjalankan kueri. MySQL belum dapat menjalankannya, karena tidak ada nilai untuk kolom ________26______32. Metode _95 mengembalikan objek 07 (ya, jenis objek yang sama yang memberi kita hasil dari kueri 99), yang kita simpan di 98Sekarang MySQL telah menyiapkan pernyataan kami untuk dieksekusi, kami dapat mengirimkannya nilai yang hilang dengan memanggil metode ________43______99 dari objek 07 kami ( 98). Kami memanggil metode ini satu kali untuk setiap nilai yang akan diberikan (dalam hal ini, kami hanya perlu menyediakan satu nilai — teks lelucon), memberikan argumen sebagai placeholder yang ingin kami isi ( 02) dan nilai yang ingin kami isi . Karena MySQL tahu kami mengirimkannya nilai diskrit, bukan kode SQL yang perlu diuraikan, tidak ada risiko karakter dalam nilai ditafsirkan sebagai kode SQL. Saat menggunakan pernyataan yang disiapkan, kerentanan injeksi SQL tidak mungkin terjadiAkhirnya, kami memanggil metode _07 objek 05 untuk memberi tahu MySQL untuk mengeksekusi kueri dengan nilai yang kami berikan. (Ya, metode _07 ini disebut 05, tidak seperti metode serupa dari objek 04, yang disebut 96. PHP memiliki banyak kekuatan, tetapi konsistensi bukanlah salah satunya. )Satu hal menarik yang akan Anda perhatikan tentang kode ini adalah kami tidak pernah memberi tanda kutip di sekitar teks lelucon. 91 ada di dalam kueri tanpa tanda kutip, dan ketika kami memanggil 99 kami memberikannya teks lelucon biasa dari larik 59. Saat menggunakan pernyataan yang disiapkan, Anda tidak memerlukan tanda kutip karena database (dalam kasus kami, MySQL) cukup cerdas untuk mengetahui bahwa teks adalah string dan akan diperlakukan seperti itu saat kueri dijalankanPertanyaan yang tersisa dalam kode ini adalah bagaimana menetapkan tanggal hari ini ke bidang 92. Kita bisa menulis beberapa kode PHP mewah untuk menghasilkan tanggal hari ini dalam format 14 yang dibutuhkan MySQL, tetapi ternyata MySQL sendiri memiliki fungsi untuk melakukan ini — 15 4Fungsi MySQL 15 digunakan di sini untuk menetapkan tanggal saat ini sebagai nilai kolom 92. MySQL sebenarnya memiliki lusinan fungsi ini, tetapi saya akan memperkenalkannya hanya sesuai kebutuhanSekarang setelah kami memiliki pertanyaan, kami dapat melengkapi pernyataan 43 yang kami mulai sebelumnya untuk menangani pengiriman formulir "Tambahkan Lelucon" 5Tapi tunggu. Pernyataan _43 ini memiliki satu trik lagi. Setelah kami menambahkan lelucon baru ke database, alih-alih menampilkan template PHP seperti sebelumnya, kami ingin mengarahkan browser pengguna kembali ke daftar lelucon. Dengan begitu, pengguna dapat melihat lelucon yang baru ditambahkan di antara mereka. Itulah yang dilakukan oleh dua baris di akhir pernyataan 43 di atasUntuk mencapai hasil yang diinginkan, insting pertama Anda mungkin memungkinkan pengontrol mengambil daftar lelucon dari database setelah menambahkan lelucon baru dan menampilkan daftar menggunakan templat ________26______34 seperti biasa. Masalah dengan melakukan ini adalah bahwa daftar lelucon, dari sudut pandang browser, akan menjadi hasil dari mengirimkan formulir "Tambahkan Lelucon". If the user were then to refresh the page, the browser would resubmit that form, causing another copy of the new joke to be added to the database. Ini jarang merupakan perilaku yang diinginkan Alih-alih, kami ingin browser memperlakukan daftar lelucon yang diperbarui sebagai halaman web biasa yang dapat dimuat ulang tanpa mengirimkan ulang formulir. Cara melakukannya adalah dengan menjawab pengiriman formulir browser dengan pengalihan HTTP — respons khusus yang memberi tahu browser untuk menavigasi ke halaman lain. (HTTP adalah singkatan dari HyperText Transfer Protocol, dan merupakan bahasa yang menjelaskan komunikasi permintaan/respons yang dipertukarkan antara browser web pengunjung dan server web Anda. ) Fungsi PHP _22 menyediakan cara untuk mengirim respons server khusus seperti ini, dengan memungkinkan Anda memasukkan tajuk khusus ke dalam respons yang dikirim ke browser. Untuk menandakan pengalihan, Anda harus mengirim 23 header dengan URL halaman yang ingin Anda arahkan ke browser 6Dalam hal ini, kami ingin mengirim browser ke 06. Berikut adalah dua baris yang mengarahkan browser kembali ke pengontrol kami setelah menambahkan lelucon baru ke database 7Di bawah ini adalah kode lengkap dari pengontrol 53Contoh. MySQL-AddJoke 8Saat Anda meninjau ini untuk memastikan semuanya masuk akal bagi Anda, perhatikan bahwa kode yang terhubung ke database dengan membuat objek 8 harus ada sebelum kode apa pun yang menjalankan kueri database. Tetapi koneksi database tidak diperlukan untuk menampilkan formulir "Tambahkan Lelucon". Koneksi hanya dilakukan ketika formulir telah dikirimkanMuat ini dan tambahkan satu atau dua lelucon baru ke database melalui browser Anda Itu dia. Anda dapat melihat lelucon yang ada di — dan menambahkan lelucon baru ke — database MySQL Anda Menghapus Data dari DatabaseDi bagian ini, kami akan membuat satu peningkatan terakhir pada situs basis data lelucon kami. Di sebelah setiap lelucon di halaman lelucon ( 06), kami akan menempatkan tombol berlabel Hapus. Saat diklik, itu akan menghapus lelucon itu dari database dan menampilkan daftar lelucon yang diperbaruiJika Anda menyukai tantangan, Anda mungkin ingin mencoba menulis fitur ini sendiri sebelum membaca untuk melihat solusi saya. Meskipun kami menerapkan fitur baru, kami terutama akan menggunakan alat yang sama seperti yang digunakan pada contoh sebelumnya di bab ini. Berikut beberapa petunjuk untuk memulai
Paling tidak, luangkan waktu sejenak untuk memikirkan bagaimana Anda akan melakukan pendekatan ini. Saat Anda siap untuk melihat solusinya, baca terus Untuk memulainya, kita perlu mengubah kueri ________18______99 yang mengambil daftar lelucon dari database. Selain kolom _32, kita juga harus mengambil kolom 30 agar kita dapat mengidentifikasi setiap lelucon secara unik _9Kita juga harus memodifikasi loop _11 yang menyimpan hasil database ke dalam array 33. Alih-alih hanya menyimpan teks dari setiap lelucon sebagai item dalam larik, kami menyimpan ID dan teks dari setiap lelucon. Salah satu cara untuk melakukan ini adalah membuat setiap item dalam larik 33 menjadi larik dengan caranya sendiri 0Catatan. jika Anda sudah beralih menggunakan 48 loop untuk memproses baris hasil database Anda, itu juga akan berfungsi dengan baik 1Setelah loop ini berjalan dengan sendirinya, kita akan memiliki larik 33, yang setiap itemnya merupakan larik asosiatif dengan dua item. ID lelucon dan teksnya. Untuk setiap lelucon ( 40), oleh karena itu kami dapat mengambil ID-nya ( 41) dan teksnya ( 42)Langkah kita selanjutnya adalah memperbarui templat _34 untuk mengambil setiap teks lelucon dari struktur larik baru ini, serta menyediakan tombol Hapus untuk setiap lelucon 2Berikut adalah sorotan dari kode yang diperbarui ini
Catatan. jika Anda tahu HTML Anda, Anda mungkin berpikir form dan input tag berada di luar elemen blockquote, karena itu bukan bagian dari teks yang dikutip (lelucon) Sebenarnya, itu benar. formulir dan inputnya harus benar-benar sebelum atau sesudah blockquote. Sayangnya, membuat struktur tag tersebut terlihat jelas membutuhkan sedikit kode CSS (cascading style sheets) yang benar-benar di luar cakupan buku ini. Daripada mengajari Anda teknik tata letak CSS dalam buku tentang PHP dan MySQL, saya memutuskan untuk menggunakan markup yang tidak sempurna ini. Jika Anda berencana untuk menggunakan kode ini di dunia nyata, Anda harus menginvestasikan waktu untuk mempelajari CSS (atau setidaknya mendapatkan layanan dari ahli CSS). Dengan begitu, Anda dapat mengambil kendali penuh atas markup HTML Anda tanpa mengkhawatirkan CSS yang diperlukan agar terlihat bagus. Jika Anda ingin mempelajari lebih lanjut tentang tata letak CSS, lihat CSS Master, Edisi ke-3, oleh Tiffany Brown Tambahkan CSS berikut ke _02 untuk membuat tombol muncul di sebelah kanan lelucon dan buat garis di antaranya 3Gambar berikut menunjukkan seperti apa daftar lelucon dengan tombol Hapus yang ditambahkan Tapi tunggu. Sebelum kita melanjutkan untuk membuat tombol Hapus berfungsi, mari mundur sebentar dan perhatikan baik-baik baris ini 4Di sini, kami mengulangi objek _07, yang memberi kami variabel 23 yang berisi kunci 30 dan 32 bersama dengan nilai yang sesuai, dan kami menggunakannya untuk membuat larik lain dengan kunci dan nilai yang samaAnda mungkin sudah menyadari bahwa ini sangat tidak efisien. Kami dapat mencapai hal yang sama menggunakan kode ini 5Tapi seperti yang kita tahu, ini juga bisa dicapai dengan 48 loop 6Dalam contoh ini, kami menggunakan _48 untuk mengulangi catatan dari database dan membuat larik. Kami kemudian mengulang array dengan 48 loop lainnya di template. Kami hanya bisa menulis ini 7Sekarang, ketika 33 diulangi di dalam template, itu bukan array tetapi objek 07. Namun, itu tidak berpengaruh pada output dan menghemat beberapa kode. In fact, we can omit the 09 variable altogether and load the 07 object directly into the 33 variable. Pengontrol _06 lengkap sekarang terlihat seperti ini 8Sekarang kita bahkan tidak memiliki 11 loop iterasi pada record di controller, tetapi hanya iterasi pada record secara langsung di template, menyimpan beberapa kode dan membuat halaman dieksekusi sedikit lebih cepat, karena sekarang hanya loop pada record sekaliKembali ke tombol Hapus baru kami. yang tersisa untuk membuat fitur baru ini berfungsi adalah menambahkan 28 yang relevan untuk mengeluarkan kueri 93 ke database _9Kode lengkap untuk _06 dan 28 yang diperbarui tersedia sebagai Contoh. MySQL-DeleteJokePotongan kode ini berfungsi persis seperti yang kami tambahkan untuk memproses kode "Tambahkan Lelucon" sebelumnya di bab ini. Kita mulai dengan menyiapkan kueri _93 dengan placeholder untuk ID lelucon yang ingin kita hapusTip. Anda mungkin berpikir bahwa pernyataan yang disiapkan tidak diperlukan dalam contoh ini untuk melindungi database kami dari serangan injeksi SQL, karena ID lelucon disediakan oleh bidang formulir tersembunyi yang tidak terlihat oleh pengguna. Faktanya, semua bidang formulir — bahkan yang tersembunyi — pada akhirnya berada di bawah kendali pengguna. Ada add-on browser yang didistribusikan secara luas, misalnya, yang akan membuat bidang formulir tersembunyi terlihat dan tersedia untuk diedit oleh pengguna. Ingat. nilai apa pun yang dikirimkan oleh browser pada akhirnya dicurigai dalam hal melindungi keamanan situs Anda Kami kemudian mengikat nilai yang dikirimkan dari _75 ke placeholder tersebut dan menjalankan kueri. Setelah kueri itu tercapai, kami menggunakan fungsi PHP _______46_______22 untuk meminta browser mengirim permintaan baru untuk melihat daftar lelucon yang diperbaruiCatatan. jika Anda menangani sendiri contoh ini, insting pertama Anda mungkin adalah menyediakan hyperlink Hapus untuk setiap lelucon, alih-alih bersusah payah menulis seluruh formulir HTML yang berisi tombol Hapus untuk setiap lelucon di halaman. Memang, kode untuk tautan semacam itu akan jauh lebih sederhana 0Singkatnya, hyperlink tidak boleh digunakan untuk melakukan tindakan (seperti menghapus lelucon). Mereka hanya boleh digunakan untuk menyediakan tautan ke beberapa konten terkait. Hal yang sama berlaku untuk formulir dengan _77, yang seharusnya hanya digunakan untuk melakukan kueri data yang ada. Tindakan hanya boleh dilakukan sebagai hasil dari formulir dengan 78 yang dikirimkanAlasannya adalah karena formulir dengan _78 diperlakukan berbeda oleh browser dan perangkat lunak terkait. Jika Anda mengirimkan formulir dengan _78 lalu mengklik tombol segarkan di browser Anda, misalnya, browser akan menanyakan apakah Anda yakin ingin mengirim ulang formulir. Peramban tidak memiliki perlindungan serupa terhadap pengiriman ulang terkait tautan dan formulir dengan 77Mesin telusur dan perayap web lainnya juga akan mengikuti semua tautan di situs Anda untuk mengetahui kapan harus menampilkan laman situs Anda di hasil penelusuran Jika situs Anda menghapus lelucon karena hyperlink diikuti, Anda dapat menemukan lelucon Anda dihapus setiap kali mesin pencari menemukan situs Anda Misi selesaiDi bab ini, Anda mempelajari semua tentang PHP Data Objects (PDO), kumpulan kelas PHP bawaan ( 04, 30, dan 07) yang memungkinkan Anda untuk berinteraksi dengan server database MySQL dengan membuat objek dan kemudian memanggil metode yang mereka gunakan. . Saat Anda melakukannya, Anda juga mempelajari dasar-dasar pemrograman berorientasi objek (OOP) — yang bukan prestasi berarti bagi pemula PHPDengan menggunakan objek PDO, Anda membangun situs web berbasis database pertama Anda, yang menerbitkan 4 database secara online dan memungkinkan pengunjung untuk menambah dan menghapus leluconDi satu sisi, Anda bisa mengatakan bab ini mencapai misi yang dinyatakan dalam buku ini. untuk mengajari Anda cara membangun situs web berbasis database. Tentu saja, contoh dalam bab ini hanya berisi hal-hal yang sangat penting. Di sisa buku ini, saya akan menunjukkan cara menyempurnakan kerangka yang Anda pelajari untuk dibuat di bab ini In Chapter 5, we’ll return to the SQL Query window in MySQL Workbench. We’ll learn how to use relational database principles and advanced SQL queries to represent more complex types of information, and give our visitors credit for the jokes they add We hope you’ve enjoyed this excerpt from PHP & MySQL. Novice to Ninja, 7th Edition. The full book is available on SitePoint Premium and from your favorite book and ebook retailers Share This ArticleTom Butler Tom Butler is a web developer and university lecturer. He has a PhD in the area of software engineering best practices and enjoys evaluating different approaches to programming problems What is MySQL for website?MySQL is a relational database management system that's capable of handling multiple users and databases . It runs as a server and is installed on your WordPress hosting server. Think of it as a digital filing cabinet that organizes and stores all of the data on your website.
Why do I need MySQL for a website?MySQL is an open source relational database management system. For WordPress sites, that means it helps you store all your blog posts, users, plugin information, etc . It stores that information in separate “tables” and connects it with “keys”, which is why it's relational.
What is a database website?A website database is an information storage system that allows access through a website . The database stores information, such as usernames and passwords, to create a better user experience. MySQL is a common choice for a website database, whereas PHP is a server-side language for accessing the database.
What is MySQL database browser?The MySQL Database Browser included in RazorSQL allows users to browse database objects and structures . It displays information about the following types of objects for MySQL versions 5 or newer. Older versions of MySQL include a subset of these objects. |