>> [MUSIC PLAYING]
DAVID Malan: Baiklah, ini CS50.
Ini adalah akhir pekan delapan.
Dan hari ini, kita mulai untuk mengisi beberapa potongan
ketika datang ke gedung hal di web.
Jadi, ingat bahwa pada hari Senin kita menghabiskan lebih banyak waktu
PHP, yang dinamis ini bahasa pemrograman yang
memungkinkan kita output, antara lain hal, HTML dan konten seperti lainnya
bahwa kita akan ingin melihat.
Tapi kita belum benar-benar melihat bagaimana kita akan menyimpan informasi.
Memang, hampir semua dari yang super situs yang menarik Anda kunjungi hari ini
memiliki beberapa jenis database di ujung belakang, kan?
Facebook tentu menyimpan banyak data tentang kita semua dan toko Gmail semua
email Anda.
>> Dan begitu, banyak situs lainnya tidak hanya konten statis itu informasi.
Ini sebenarnya yang dinamis dalam beberapa cara.
Anda memberikan masukan, itu update halaman untuk orang lain.
Anda mendapatkan pesan, Anda mengirim pesan, dan sebagainya.
Jadi hari ini, kita melihat lebih dekat pada dasar-dasar dari proyek
bahwa Anda akan menyelam ke depan Minggu, CS50 Keuangan, yang
sebenarnya akan memiliki Anda membangun sesuatu yang tidak di C, tetapi dalam PHP.
Sebuah situs web yang terlihat sedikit sesuatu seperti ini
yang memungkinkan untuk membeli dan menjual saham yang sebenarnya
akan memanfaatkan real time Data saham dari Yahoo Finance.
Dan pada akhirnya, Anda akan memiliki ilusi untuk diri sendiri dan untuk pengguna
bahwa Anda benar-benar membeli dan menjual saham dan mendapatkan hampir real time
update, mengelola portofolio, yang semuanya
akan memerlukan memiliki, akhirnya, database pengguna.
>> Jadi, kata-kata Anda sendiri, terutama jika Anda tidak
Super akrab dengan komputer ilmu pengetahuan atau database, apa
Anda tahu database menjadi sekarang, dalam hal non-teknis?
Apa itu?
Bagaimana Anda menjelaskan hal itu untuk teman sekamar atau teman?
>> AUDIENCE: [tidak terdengar] Informasi [tidak terdengar]
>> DAVID Malan: Jadi, daftar informasi, atau store-- daftar informasi
Anda mungkin ingin menyimpan tentang sesuatu, seperti pengguna.
Dan apa yang dilakukan pengguna memiliki terkait dengan mereka?
Jika Anda pengguna Facebook atau di Gmail, apa karakteristik
bahwa kita semua pengguna memiliki?
Seperti, apa yang mungkin menjadi beberapa kolom dalam spreadsheet yang kita
disinggung terakhir kali?
Karena sekali lagi, Anda bisa memikirkan database
benar-benar sebagai file Excel mewah atau Google Spreadsheet atau Apple Numbers berkas.
>> Jadi, apa yang Anda pikirkan ketika Anda memikirkan pengguna?
Apa yang mereka miliki?
Apa itu?
>> AUDIENCE: Sebuah nama.
>> DAVID Malan: nama A.
Jadi jika nama, seperti, David Malan akan menjadi nama beberapa pengguna.
Apa lagi yang pengguna miliki?
>> AUDIENCE: Sebuah ID.
>> DAVID Malan: Sebuah ID.
Jadi, seperti nomor ID, seperti Harvard Anda ID atau Yale Net ID atau sejenisnya.
Apa lagi yang mungkin pengguna memiliki?
>> AUDIENCE: Password.
>> DAVID Malan: A password, mungkin sebuah alamat, mungkin nomor telepon, mungkin
alamat email.
Jadi, ada tandan bidang dan ini bisa semacam lepas kendali
cepat segera setelah Anda mulai menyadari, oh, mari kita menyimpan ini
dan mari kita menyimpan ini dan itu.
>> Tapi bagaimana kita benar-benar melakukan itu?
Jadi sekali lagi, model mental yang untuk memiliki untuk hari ini karena kami
menyelam ke SQL yang sebenarnya, Structured Query Language,
adalah database yang terlihat seperti ini.
Itu hanya baris dan kolom.
Dan Anda bisa membayangkan Google Spreadsheets atau sejumlah program lainnya.
Tapi apa kunci tentang MySQL, yang merupakan perangkat lunak database kita akan menggunakan,
yang bebas terbuka available-- menggunakan Facebook
dan sejumlah websites-- lainnya Database menyimpan hal relasional.
Dan database relasional hanya berarti satu yang benar-benar
menyimpan data dalam baris dan kolom.
Ini sesederhana itu.
>> Jadi, bahkan sesuatu seperti Oracle yang Anda mungkin telah mendengar tentang umumnya
adalah sebuah database relasional.
Dan di bawah tenda, itu menyimpan data dalam baris dan kolom.
Dan Oracle biaya Anda banyak uang untuk melakukan itu,
sedangkan biaya MySQL Anda tidak untuk hal yang sama.
Jadi, SQL akan memberi kita setidaknya empat operasi.
Kemampuan untuk memilih data, seperti membaca data, menyisipkan, menghapus, dan memperbarui data.
Dengan kata lain, mereka adalah benar-benar empat operasi utama
yang akan memungkinkan kita untuk mengubah hal pada mereka baris dan kolom.
>> Alat yang akan kita gunakan saat ini terutama untuk belajar SQL dan bermain dengan itu
sekali lagi disebut PHP MyAdmin.
Ini alat berbasis web.
Jumlah kebetulan bahwa itu ditulis dalam PHP.
Tapi itu akan memberi kita sebuah grafis user interface sehingga kita dapat benar-benar
membuat baris dan kolom ini dan kemudian berbicara dengan mereka melalui kode.
Jadi, mari kita sekarang mulai apa yang saya pikir adalah terus terang
jenis proses olok membangun bagian belakang website,
bagian-bagian yang pengguna tidak melihat, tapi pasti peduli tentang,
karena itu agak Data ini akan.
Jadi, mirip dengan C dan sedikit kurang seperti PHP,
SQL, atau database yang mendukung SQL, memiliki jenis setidaknya data ini
dan tandan lain.
CHAR, VARCHAR, INT, BIGINT, DECIMAL, dan DATETIME.
Dan ada keseluruhan banyak fitur lainnya,
tapi mari kita lakukan ini dengan cara contoh aktual.
>> Aku akan pergi ke CS50 IDE di mana, di muka, saya sudah login
dan saya juga mengunjungi URL untuk alat ini disebut PHP MyAdmin.
Dan di masalah ditetapkan tujuh, kami akan memberitahu Anda persis bagaimana untuk sampai ke interface ini
demikian juga.
Di pojok kiri atas, menyadarinya mengatakan kuliah.
Dan itu hanya berarti bahwa di muka, saya buat
database disebut kuliah kosong yang tidak memiliki spreadsheet di dalamnya belum.
Tidak ada baris dan kolom.
Karena pertama hal yang kita akan melakukan
adalah mulai untuk membuat tabel yang akan menyimpan pengguna kami.
>> Jadi, secara harfiah atas sini ke kanan, aku
akan memberitahu database Saya ingin meja disebut Pengguna.
Jadi, ini seperti file yang saya ingin menyimpan semua data saya di.
Dan berapa banyak kolom?
Nah, mari kita tetap sederhana untuk saat ini.
Saya hanya ingin menyimpan seperti username dan nama untuk pengguna.
Kami akan memulai dari yang kecil.
Jadi, saya ingin total dua kolom.
Dan aku akan pergi ke depan dan klik Go.
Dan kemudian, untuk ini kolom, apa yang akan saya
untuk do-- jika internet ini cooperates-- apa-apa,
jadi kita akan mencoba lagi.
Aku akan membuat tabel yang disebut Pengguna dengan dua kolom, klik Go, OK.
Sekarang kita punya itu benar-benar cepat.
Terima kasih, sangat baik dilakukan.
Baiklah, jadi apa yang kita inginkan kolom ini disebut?
>> Jadi, salah satu yang akan dipanggil pengguna.
Sini-jadi, semua yang saya lihat dan antarmuka terus terang mendapat sedikit jelek akhirnya,
setelah Anda mulai mengetik di semua data ini.
Tapi apa yang baik adalah bahwa semacam paradoks, Aku menciptakan kolom,
namun alat ini memiliki bodoh meletakkan mereka di baris
sehingga saya dapat mengkonfigurasi kolom ini.
Jadi, ada dua kosong ada di bawah Nama.
Dan salah satu bidang ini saya ingin disebut Username,
dan bidang lain yang saya ingin memanggil Nama.
>> Dan sekarang saya harus memilih tipe data untuk hal-hal ini.
Jadi, sedangkan di Excel dan Google Spreadsheets,
jika Anda ingin kolom, Anda benar-benar ketik Nama atau Username, tekan Enter.
Mungkin Anda membuat wajah tebal hanya untuk kejelasan, tapi hanya itu.
Anda tidak menentukan jenis kolom.
Sekarang di Google Spreadsheets atau Excel, Anda mungkin menentukan bagaimana data yang diberikan.
Anda bisa pergi ke menu Format, dan Anda dapat menentukan menunjukkan tanda dolar seperti ini,
menunjukkan ini seperti nilai floating point.
>> Jadi, itu memiliki semangat yang sama bahwa apa yang kita akan lakukan,
tapi ini benar-benar akan memaksa data menjadi jenis tertentu.
Sekarang, meskipun beberapa saat yang lalu saya mengatakan hanya ada beberapa jenis data,
sebenarnya ada jauh, dan mereka
di berbagai tingkat kekhususan.
Dan sebagai samping, Anda bahkan dapat melakukan hal-hal mewah
seperti geometri penyimpanan dalam database.
Anda dapat menyimpan hal-hal seperti koordinat GPS
dan benar-benar menemukan, secara matematis, poin yang dekat dengan orang lain.
Tapi kita akan menjaga ini super sederhana
dan pergi ke sini, semua yang disebut tipe string.
>> Jadi, inilah daftar dari Seluruh banyak pilihan.
CHAR, VARCHAR, TINYTEXT, MEDIUMTEXT, LONGTEXT.
Dan itu agak luar biasa.
Dan sayangnya, agak paradoks ke C,
CHAR adalah tidak benar-benar CHAR.
Jika Anda menentukan dalam database bahwa jenis data Anda CHAR,
yang berarti bahwa ya, itu adalah CHAR, tapi itu salah satu atau lebih karakter.
Dan Anda harus menentukan berapa banyak karakter yang Anda inginkan.
Jadi, apa yang khas panjang untuk username?
Apakah ada batas biasanya?
>> AUDIENCE: [tidak terdengar]
>> DAVID Malan: 16 mungkin?
Sesuatu seperti itu.
Anda tahu, kembali di hari, dulu delapan.
Kadang-kadang 16, kadang-kadang itu bahkan lebih dari itu.
Dan, ini tidak berarti memberi saya satu CHAR.
Ini berarti saya harus menentukan panjang lapangan,
dan sekarang saya mungkin mengatakan sesuatu seperti 16.
Dan ada trade off di sini.
Jadi, kita akan lihat sebentar lagi bahwa ini berarti satu,
setiap nama pengguna harus 16 karakter.
Tapi tunggu dulu, M-A-L-A-N. Jika itu username saya dan saya hanya menggunakan lima,
apa yang akan Anda usulkan bahwa database yang harus dilakukan untuk yang lain 11 karakter yang
Saya sudah disediakan ruang untuk?
Apa yang akan kamu lakukan?
>> AUDIENCE: [tidak terdengar]
>> DAVID Malan: Ya, hanya membuat mereka semua null.
Membuat mereka ruang.
Tapi mungkin nol, sehingga banyak nol backslash.
Jadi, di satu sisi, kita sudah sekarang memastikan bahwa username saya
bisa tidak lebih dari 16 karakter.
Dan sisi lain dari yang bahwa jika saya memiliki nama yang sangat panjang
atau ingin benar-benar panjang nama pengguna seperti beberapa Anda
orang mungkin memiliki di perguruan tinggi itu atau di Yale.edu, Anda tidak dapat memiliki satu.
Dan pada kenyataannya, jika Anda sudah pernah terdaftar untuk website
dan Anda dimarahi mengatakan sandi terlalu panjang
atau nama pengguna terlalu lama, itu hanya karena programmer, ketika
mengkonfigurasi Database nya, memutuskan bahwa bidang ini akan
tidak lebih dari panjang ini.
>> Baiklah, jadi apa jika kita lanjutkan untuk nama?
Berapa lama sebuah Nama khas manusia menjadi?
Berapa banyak karakter, 16?
Saya menduga kita bisa menemukan seseorang di ruangan ini
di mana dengan ditambah nya pertama lalu Nama lebih panjang dari 16 karakter.
Jadi, apa yang lebih baik dari itu, 17?
18?
25?
Lebih besar?
30?
>> AUDIENCE: [tidak terdengar]
DAVID Malan: 5.000, oh Tuhan.
Jadi, itu mungkin layak atas terikat, akan kita katakan.
Dan di sini kita memiliki jenis untuk membuat panggilan penilaian.
Seperti, tidak ada jawaban yang benar di sini.
Tak terbatas tidak sangat mungkin, karena kita akhirnya
akan have-- kami akan kehabisan memori.
Jadi, kita harus membuat panggilan penilaian di beberapa titik.
>> Sangat umum akan, misalnya, untuk use-- dan biarkan aku menentukan CHAR sini
sebagai before-- 255 adalah harfiah batas atas software database ini
bertahun-tahun lalu.
Dan, banyak manusia hanya akan mengatakan, baik.
255 batasnya.
Mari kita hanya menggunakan maksimal.
Dan ini cukup konyol.
Seperti, jika Anda mengetik seseorang yang nama untuk 200 karakter ditambah,
yang sedikit konyol.
>> Tapi, ingat bahwa ASCII tidak satu-satunya sistem untuk karakter.
Dan sebagainya, terutama dalam banyak bahasa Asia
di mana ada karakter kita tidak bisa mengungkapkan pada keyboard seperti US saya
keyboard, beberapa karakter sebenarnya mengambil 16 bit bukannya delapan bit.
Dan, ini benar-benar tidak semua yang masuk akal
bahwa kita perlu lebih ruang jika kita ingin menyesuaikan
karakter lebih besar dari US sangat yang sentris kami cenderung untuk membahas.
Jadi, kita perlu beberapa batas atas.
Aku tidak tahu apa yang terbaik adalah, tapi 255 umumnya yang umum.
25 terasa rendah.
16, 32 merasa rendah.
Saya akan berbuat salah di sisi dari sesuatu yang lebih tinggi.
Tapi ada trade off, seperti biasa.
Apa, mungkin, jelas trade off dari pemesanan 255 karakter
untuk nama semua orang di database saya?
>> AUDIENCE: [tidak terdengar]
>> DAVID Malan: Apa itu?
>> AUDIENCE: [tidak terdengar]
>> DAVID Malan: Ini banyak memori, kan?
M-A-L A-N. Saya baru saja menyia-nyiakan 250 karakter hanya untuk menyimpan nama saya
membela diri, hanya dalam kasus seseorang di kelas memiliki nama yang sangat panjang.
Yang tampaknya seperti tradeoff yang tidak semestinya.
>> Jadi, ternyata SQL, bahasa database ini,
sebenarnya mendukung sesuatu disebut VARCHAR, atau Variable CHAR.
Dan ini adalah jenis yang baik dalam bahwa ini memungkinkan Anda untuk menentukan tidak tetap
lebar, melainkan, lebar variabel.
Dan lebih khusus, sebuah lebar maksimum lapangan.
Jadi, ini berarti bahwa nama bisa tidak lebih dari 250 karakter,
tapi pasti bisa lebih sedikit.
Dan database akan menjadi pintar.
Jika Anda dimasukkan ke dalam M-A-L-A-N, itu hanya akan menggunakan lima,
mungkin enam byte untuk seperti karakter null tertinggal,
dan tidak menghabiskan tambahan 249 atau 250 byte tidak perlu.
>> Jadi, ini sepertinya aku harus telah dimulai dengan cerita ini.
Tapi selalu ada tradeoff.
Jadi, di satu sisi, nama pengguna saya sudah ditentukan untuk sulit kode di 16,
dan mungkin itu tidak panggilan yang tepat, mungkin itu
, tapi mengapa tidak menggunakan Varchars untuk segalanya?
>> Ini ada karena suatu alasan.
Mengapa tidak menggunakan varchars untuk setiap bidang yang panjangnya Anda tidak tahu sebelumnya
jika tampaknya menjadi hal yang besar, kan?
Gunakan hanya sebagai ruang sebanyak Anda perlu hingga batas ini?
>> AUDIENCE: lambat.
DAVID Malan: Speller?
AUDIENCE: Membuatnya lebih lambat?
DAVID Malan: Oh, itu lebih lambat.
Baik, yang hampir selalu jawabannya, terus terang.
Seperti, apa tradeoff?
Ini baik biaya lebih banyak ruang atau biaya lebih banyak waktu.
Jadi, dalam hal ini, mungkin lebih lambat.
Mengapa?
>> AUDIENCE: [tidak terdengar] menentukan [tidak terdengar].
>> DAVID Malan: Baik.
Jadi, Anda mungkin ingat dari bahkan PSED5, bermain dengan pendekatan Anda
kamus, jika Anda harus mengalokasikan memori secara dinamis atau terus
tumbuh buffer, yang sebenarnya bisa lambat.
Jika Anda harus menelepon malloc di bawah tenda dan mungkin
itulah yang MySQL lakukan, sehingga pasti yang bisa menjadi kasus.
Dan jika Anda berpikir cara kembali ke PSet-- atau bahkan
minggu dua, ketika kita melakukan hal-hal seperti pencarian biner atau bahkan pencarian linear,
salah satu hal yang baik tentang setiap kata dalam database atau setiap kata dalam kolom
yang persis sama panjang, bahkan jika sejumlah besar karakter-karakter
yang kosong, adalah bahwa Anda dapat menggunakan random access pada data Anda, kan?
>> Jika Anda tahu bahwa setiap kata adalah 16 karakter diri,
Anda dapat menggunakan pointer aritmatika, sehingga untuk berbicara, dan pergi ke kita 16, 32, 48, 64,
dan Anda hanya bisa melompat langsung menggunakan aritmatika
ke salah satu kata dalam database Anda.
Sedangkan jika itu VARCHAR sebuah, apa yang Anda malah harus lakukan?
>> [PHONE berdering]
>> Jika itu adalah VARCHAR, Anda tidak dapat menggunakan akses acak.
Apa yang Anda harus mencari atau melakukan?
Ya?
>> AUDIENCE: [tidak terdengar]
>> DAVID Malan: Lihatlah melalui jejak whole--
melalui seluruh daftar mencari apa, kemungkinan besar?
Apa jenis nilai khusus?
AUDIENCE: [tidak terdengar]
DAVID Malan: Mencari untuk terminator nol
yang membatasi pemisahan kata-kata.
Jadi sekali lagi, tradeoff, dan tidak ada jawaban yang tepat.
Tapi ini adalah di mana, terutama ketika pengguna Anda bisa menjadi banyak
dan beban Anda pada server Anda, jumlah orang yang menggunakan itu akan tinggi,
ini sebenarnya keputusan trivial.
Jadi, kita bisa meninggalkan ini karena ini, tapi mari gulir ke bawah ke kanan
sini.
Sekarang, ada beberapa kolom di mana kita harus membuat panggilan penilaian.
Apakah masuk akal untuk memungkinkan pengguna nama, nama pengguna atau pengguna
nama, menjadi nol?
Artinya, hanya kosong.
Terasa sedikit tidak masuk akal, jadi saya tidak akan memeriksa kotak-kotak.
Tapi ternyata dalam database, Anda dapat mengatakan,
seseorang opsional dapat memiliki nilai ini.
Kolom ini tidak memiliki untuk benar-benar berada di sana.
>> Sekarang, ada menu ini.
Dan melihat aku masih di baris pertama ada,
jadi saya sedang berbicara tentang nama sekarang.
Dan ternyata database, tidak seperti hanya sebuah spreadsheet sederhana,
memiliki fitur canggih yang disebut indeks.
Dan indeks adalah cara memberitahu Database di muka bahwa saya manusia
am pintar dari Anda.
>> Aku tahu apa jenis query, pilih atau memasukkan atau menghapus atau memperbarui,
bahwa kode saya akan berakhir up lakukan di database ini.
Saya ingin membaca banyak data.
Saya ingin memasukkan banyak data.
Saya ingin terus menghapus banyak data.
Jika aku tahu bahwa aku akan menjadi mengakses lapangan seperti Username banyak,
Saya preemptively dapat memberitahu database, saya tahu lebih dari yang Anda,
dan saya ingin keputusan yang Anda harus indeks bidang ini.
Mana mengindeks lapangan atau kolom berarti bahwa database di muka
harus meminjam beberapa ide dari, seperti, seminggu empat dan lima dan enam dari CS50
dan benar-benar membangun sesuatu seperti pencarian biner
pohon atau sesuatu umumnya disebut pohon B
Anda akan belajar dalam seperti CS124 kelas
di Harvard, kelas algoritma, atau sejumlah tempat-tempat lain.
>> Database dan cerdas orang-orang yang diimplementasikan
akan mencari cara untuk menyimpan bahwa meja informasi
dalam memori sehingga pencarian dan operasi lainnya yang super cepat.
Anda tidak harus melakukannya.
Anda tidak harus melaksanakan pencarian linear atau pencarian biner
atau menggabungkan semacam atau seleksi semacam, semua itu.
Database melakukannya untuk Anda jika Anda memberitahu itu preemptively indeks bidang ini.
>> Dan Anda dapat melihat juga, ada beberapa karakteristik lain
kita bisa mengatakan database untuk menegakkan.
Apa yang mungkin artinya jika saya memilih Unik dari menu ini, hanya intuitif?
Ya?
>> AUDIENCE: [tidak terdengar]
DAVID Malan: Ya, nama harus unik.
Apakah ini hal yang baik atau hal yang buruk untuk database, untuk sebuah website dengan pengguna?
Harus username unik?
Ya, mungkin.
Jika itu apa bidang kita gunakan untuk log in,
Anda tidak benar-benar ingin orang yang memiliki perasaan yang sama atau nama pengguna yang sama.
Jadi, kita bisa memiliki Database menegakkan bahwa begitu
yang sekarang dalam kode PHP saya atau bahasa apapun, Saya tidak perlu, misalnya, memeriksa
tentu tidak nama ini ada sebelum aku membiarkan seseorang mendaftar?
Database tidak akan membiarkan dua orang yang bernama David atau Malans mendaftar dalam kasus ini.
>> Dan sebagai samping, meskipun ini Menu hanya memungkinkan Anda memilih salah satu,
indeks yang unik adalah salah satu yang diindeks untuk kinerja super cepat,
tetapi juga memberlakukan keunikan.
Dan kami akan kembali ke apa yang dua lainnya berarti hanya dalam beberapa saat.
Sementara itu, jika saya pergi ke baris kedua saya, yang
adalah nama pengguna, harus saya tentukan bahwa nama harus unik?
Tidak, karena Anda bisa pasti have-- ada dua David
Malans di ruangan ini, kemungkinan besar.
Tetapi jika kita memilih nama yang berbeda, kita pasti mungkin memiliki tabrakan.
>> Pikirkan kembali untuk hash tabel dan sejenisnya.
Jadi, kita tentu tidak ingin untuk membuat kolom nama unik.
Jadi, kami hanya akan meninggalkan bahwa sebagai dash, dash, dash, apa-apa.
Dan aku akan meninggalkan segala sesuatu yang lain saja.
Memang, sebagian besar bidang ini kita tidak perlu peduli.
Dan ketika aku siap untuk menyimpan ini, jika internet bekerja sama,
Saya klik Save, dan sangat, sangat, sangat perlahan tidak database diselamatkan.
Dan sekarang aku kembali ke ini antarmuka, yang diakui,
adalah luar biasa pada pandangan pertama.
Tapi semua aku akan lakukan adalah klik pada Pengguna kata di sebelah kiri atas.
Aku akan pergi di sini, klik Pengguna, dan secara default, itu
telah dieksekusi beberapa SQL, tapi lebih pada suatu saat.
Berikut ini hanya ringkasan dari apa yang saya lakukan.
Dan tidak perlu khawatir bahwa Anda melihat menyebutkan Latin dan Swedia di sini.
Mereka hanya default pengaturan, karena MySQL awalnya,
atau PHP MyAdmin, salah satu dari dua terjadi ditulis oleh beberapa orang Swedia.
Tapi itu tidak relevan dalam kasus kami di sini.
>> Baiklah, jadi mengapa ini semua yang menarik?
Ternyata, saya bisa memasukkan data ke dalam database dengan menulis kode.
Dan aku pergi ke depan dan dalam file saya di sini, saya
akan pergi ke depan dan berpura-pura seperti ini adalah kabel itu database, yang
itu bukan pada saat ini, tetapi akan menjadi ketika kita sampai ke masalah mengatur tujuh.
Dan aku akan pergi ke depan dan mengeksekusi fungsi yang disebut query,
yang akan kami berikan Anda dalam masalah mengatur tujuh ini kode distribusi, yang
Dibutuhkan setidaknya satu argumen, yang hanya string.
Sebuah string kode SQL.
Jadi, Anda akan belajar bagaimana menulis Structured Query Language.
>> Jika saya ingin menyisipkan baris baru ke saya Database karena seseorang telah mengajukan
formulir untuk kode saya, saya akan benar-benar menulis INSERT INTO pengguna berikut
bidang: username, koma, nama, VALUES,
dan sekarang saya harus memasukkan sesuatu seperti Malan, dan kutipan,
tanda kutip 'David Malan.' Dan sekarang bahkan bagi mereka yang tidak terbiasa dengan SQL,
mengapa saya menggunakan tanda kutip tunggal dalam string hijau ini?
Apa yang mungkin menjadi alasan di sini?
>> Perhatikan aku co-berbaur dua bahasa.
Query adalah fungsi PHP, namun butuh argumen.
Dan argumen yang harus menjadi dirinya sendiri ditulis dalam bahasa lain disebut
SQL, Structured Query Language.
Jadi, segala sesuatu yang saya baru saja disorot di sini
adalah bahasa ini disebut SQL.
Jadi, apa dengan tanda kutip tunggal, hanya sebagai kewarasan cek cepat?
Lanjutkan.
Mereka string.
Jadi, kutipan, tanda kutip Malan dan kutipan, tanda kutip David Malan adalah string.
Dan hanya berpikir intuitif sekarang, mengetahui apa yang Anda ketahui tentang C dan PHP,
mengapa aku tidak melakukan ini, yang saya biasanya digunakan tanda kutip ganda untuk string?
Mengapa aku tidak ingin melakukan itu?
Ya?
>> AUDIENCE: [tidak terdengar]
DAVID Malan: Tepat.
Karena aku sudah menggunakan tanda kutip ganda di jalan
luar argumen untuk fungsi PHP,
Saya hanya akan membingungkan penerjemah.
Ini tidak akan tahu, ini pergi bersama-sama?
Apakah ini pergi bersama-sama?
Jadi, saya bergantian sebagai gantinya.
>> Atau aku bisa melakukan sesuatu seperti ini, quote backslash backslash atau kutipan.
Terus terang, yang hanya mulai menjadi sangat terbaca dan jelek.
Tapi itu akan mencapai hasil yang sama juga.
>> Jadi, jika saya harus menjalankan ini permintaan sekarang, mari kita lihat apa yang terjadi.
Aku akan pergi ke depan sekarang dan bukan daripada mengeksekusi kode PHP, yang
adalah di mana Anda akan bermain di masalah set tujuh,
Aku akan bukannya pergi ke PHP MyAdmin.
Dan aku akan secara manual untuk pergi ke tab SQL,
dan biarkan aku memperbesar pada antarmuka.
Dan aku akan menyisipkan di hal yang saya hanya mengetik.
Dan kode warna memiliki berubah sedikit sekarang,
hanya karena format Program sesuatu yang sedikit berbeda.
Tapi perhatikan bahwa semua yang telah saya lakukan adalah yang sudah saya katakan, masukkan ke Pengguna.
Aku sudah ditentukan, kemudian, di koma kurung daftar dipisahkan dua
bidang yang saya ingin memasukkan, dan maka saya sudah benar-benar mengatakan nilai-nilai
diikuti oleh paren lain, dan kemudian dua nilai
Saya ingin plug-in, dan sekarang untuk mengukur baik,
Aku akan menaruh titik koma di akhir.
Jadi, ini bukan C. Ini bukan PHP.
Ini sekarang SQL, dan aku paste ke antarmuka berbasis web ini yang
hanya akan membiarkan saya, segera setelah saya klik Go,
mengeksekusi query ini pada database berjalan dalam CS50 IDE.
>> Jadi ini adalah baik.
Perhatikan bahwa kata satu baris dimasukkan, pergi super cepat,
0,0054 detik untuk memasukkan data tersebut.
Jadi, yang terdengar cukup sehat.
Ini diformat ulang pertanyaan saya bagi saya di sini hanya untuk melihatnya
di semacam versi kode warna.
Tapi sekarang jika saya klik Browse, melihat bahwa, bahkan
meskipun ada banyak kekacauan di layar, meja saya sekarang memiliki dua baris.
>> Jadi, biarkan aku pergi ke depan dan melakukan yang lain.
Alih-alih ini, izinkan saya pergi ke tab SQL lagi.
Dan kali ini saya akan memasukkan sesuatu seperti Rob dan namanya akan merampok Bowden.
Bowden.
Mari klik Simpan.
Ups, bukan Go.
>> Klik Browse lagi, dan sekarang melihat saya memiliki dua baris.
Jadi, ini hanya cara yang lebih kompleks cara membuka Google Spreadsheets
dan hanya mengetik baris ke kolom.
Tapi apa kunci adalah bahwa kita sekarang memiliki sintaks
yang dapat digunakan untuk menulis kode sehingga akhirnya, kita bisa benar-benar
melakukan beberapa dan ini.
Ingat bahwa PHP mendukung variabel yang super global.
>> Apa yang ada dalam dolar menandatangani garis bawah GET di PHP?
Kami mengambil melihat satu atau dua contoh sederhana.
Dan di PSet6, ingat Anda memiliki halo dot PHP yang menggunakan variabel ini.
Apa yang terjadi di sana?
Atau apa?
Sebuah sedikit lebih keras.
>> AUDIENCE: [tidak terdengar]
>> DAVID Malan: Ini adalah salju benih array, yang
adalah cara mewah mengatakan sebuah array yang memiliki pasangan nilai kunci.
Dan tombol yang tidak numerik.
Mereka kata-kata atau string.
Dan secara khusus, apa adalah mereka pasangan nilai kunci?
Mereka berasal dari mana?
Maaf?
>> AUDIENCE: [tidak terdengar]
DAVID Malan: Tidak ada?
Di mana kunci mereka nilai pasangan berasal?
Katakan lagi?
Lagi?
Apakah saya satu-satunya sesuatu pendengaran?
>> [Tertawa]
>> Itu benar, ya?
>> AUDIENCE: [tidak terdengar]
DAVID Malan: Ya, mereka datang dari string.
Jadi, jika Anda mundur dalam waktu untuk ketika kita telah bermain dengan Google
dan kami telah pergi ke Google.com slash pencarian tanda tanya q sama kucing,
jika saya harus tekan Enter dan jika Google dilaksanakan di PHP,
Kode PHP bahwa Google menulis akan memiliki akses ke tanda dolar
menggarisbawahi GET dalam yang adalah kunci yang disebut Q dan nilai
disebut kucing yang kemudian dapat digunakan digunakan untuk melakukan pencarian yang sebenarnya dengan.
>> Jadi, sebenarnya, apa yang akan saya lakukan sekarang adalah kembali ke kode PHP saya
Anda lagi akan melihat lebih banyak dari di PSet7.
Dan bukannya memasukkan nilai kode keras yang
tidak tampak seperti sangat website dinamis,
Aku akan memberikan teaser dari apa kode aktual Anda akan melakukan.
Anda akan dimasukkan ke dalam dua Pertanyaan menandai seperti ini.
Saya tidak tahu apa nama pengguna adalah.
Aku tidak tahu apa yang Nama akan menjadi,
tapi aku tahu aku bisa mendapatkannya secara dinamis.
>> Jadi, jika kode kita sedang menulis sekarang adalah kode yang berjalan di server Google,
atau jika ini adalah halo dot PHP, yang datang dengan PSet6,
Aku akan masuk ke fungsi permintaan
seperti printf, dua argumen lainnya.
GET, kutipan, username tanda kutip, dan GET, kutipan, nama tanda kutip.
Dan sekarang, perhatikan apa yang struktur umum di sini.
Aku punya di sebelah kiri sisi panggilan,
fungsi ini disebut query dalam PHP.
Saya masih memiliki sebagai pertama Argumen, hanya string teks.
>> Tapi itu string teks adalah yang ditulis dalam bahasa yang disebut SQL.
Dan terus terang, itu bukan bahasa besar.
Kami hanya akan berbicara tentang secara resmi hari ini, benar-benar.
Dan kemudian di set masalah tujuh, ada relatif
Beberapa fitur yang kami akan memanfaatkan.
Tanda tanya, meskipun, berarti pasang di nilai sini dan steker nilai lain
sini.
Dan pemberitahuan, saya sudah dihilangkan apa dari seluruh sialan quote--
itu-- sekitar kutipan menandai kali ini.
Aku sudah dihilangkan kutipan tanda di sekitar tanda tanya,
maaf, kali ini.
>> Jadi, apa yang baik tentang ini Pertanyaan fitur tanda yang
PHP cenderung mendukung, Ruby dan Python dan bahasa lainnya,
ini hanya berarti steker di beberapa nilai di sini dan Anda tahu apa?
Anda mengetahui apakah akan menggunakan tanda kutip tunggal atau tanda kutip ganda.
Jangan mengganggu saya dengan orang-orang Rincian intelektual tidak menarik.
Tapi, pastikan itu benar sehingga kode saya akhirnya
operasional dan aman, yang akan memiliki arti sebelum lama.
>> Sekarang, berapa banyak argumen total, hanya untuk jelas, adalah fungsi permintaan taking?
Siapapun ingin memilih lebih dari dua?
Tiga?
Tentu, mengapa?
Mengapa tiga?
>> AUDIENCE: [tidak terdengar]
DAVID Malan: Tepat.
Bagian pertama adalah string.
Argumen kedua adalah tanda dolar menggarisbawahi GET braket nama pengguna.
Dan argumen ketiga adalah hal yang sama, tetapi hanya nama.
Jadi dengan kata lain, sekarang jika saya memiliki bentuk web
yang harus bidang teks, satu untuk nama pengguna,
satu untuk nya atau namanya, hanya seperti Anda akan melihat di website
saat Anda mendaftar untuk beberapa website, kekuatan ini
menjadi kode di ujung belakang yang sebenarnya penyisipan sekarang
ke dalam database.
>> Sekarang sebaliknya, mari kita cepat maju.
Misalkan pengguna sekarang login dan Anda ingin
untuk menulis kode PHP yang memeriksa apakah orang yang baru saja masuk
sebenarnya pengguna, Anda dapat menggunakan sintaks cukup sederhana.
Anda dapat mengatakan SELECT, katakanlah membintangi, di mana bintang berarti segalanya.
Aku tidak tahu apa yang saya inginkan, sehingga hanya memberi saya
semua kolom dari tabel disebut pengguna di mana, dan ini bagus.
Pilih mendukung apa disebut predikat, yang
seperti cara kualifikasi apa yang Anda inginkan.
Dimana username sama kutipan, tanda kutip Malan.
Jadi di sini juga, saya sudah tertanam dalam argumen
untuk fungsi PHP, baris kode SQL.
Dan bahwa kode SQL ini waktu secara harfiah akan
untuk mencari Kutipan tanda kutip Malan.
>> Nah, itu tidak semua yang berguna, jadi saya akan melewatkan bahwa
dan aku akan menyingkirkan tip ini dari Brady, dan pergi
dan plug-in bukannya tanda tanya di sini.
Jadi, hanya harus jelas, apa yang harus argumen kedua saya
akan jika seseorang baru saja masuk dan aku ingin memeriksa apakah ia sebenarnya
pengguna?
AUDIENCE: [tidak terdengar]
DAVID Malan: Ya.
Aku mendengar dolar tanda garis bawah GET kutipan, username tanda kutip.
Dan itu harus kembali ke saya salah satu baris dalam database saya
yang memiliki nama pengguna dari Malan.
Sekarang mudah-mudahan, aku akan kembali nol jika Malan ini pernah di sini,
atau satu jika ia memiliki.
Saya tidak harus mendapatkan kembali dua atau tiga atau empat.
Mengapa?
>> AUDIENCE: [tidak terdengar]
>> DAVID Malan: Aku berkata unik, kan?
Alasan sederhana.
Karena aku mengatakan itu harus menjadi unik, hanya logis,
Anda hanya dapat memiliki nol atau satu Malans dalam tabel ini database tertentu.
Sekarang sebagai samping, hanya supaya Anda telah melihat itu, meskipun saya tetap menggunakan GET
dan meskipun PSet6 hanya digunakan GET, Anda pasti dapat memiliki POST.
Dan ingat bahwa Post lain teknik untuk mengirimkan informasi
dari bentuk, tapi tidak muncul dalam URL.
Ini sedikit lebih aman tentu untuk hal-hal seperti username dan password,
yang PSet7 akan, pada kenyataannya, melibatkan.
>> Jadi, mari kita lakukan ini di PHP Myadmin dan melihat apa yang terjadi.
Aku akan pergi ke tab MySQL.
Dan melihat bahwa nilai default untuk PHP MyAdmin, hanya untuk mencoba untuk membantu,
adalah untuk memilih bintang dari pengguna di mana satu.
Nah, salah satu yang selalu benar, sehingga ini memiliki konyol efektif
hanya memilih semuanya.
Tapi aku akan menjadi sedikit lebih bertele-tele dan manual
mengetikkan SELECT bintang DARI pengguna.
>> Sekarang teknis, Anda bisa mengutip nama tabel.
Sangat jarang bahwa Anda harus, tapi melihat ini tidak
kutipan normal pada keyboard AS.
Ini adalah apa yang disebut backtick, yang umumnya di sisi kiri atas
sudut keyboard Anda.
Tapi itu jarang bahwa Anda akan benar-benar perlu repot-repot dengan itu,
jadi saya hanya akan menghilangkan mereka pula.
Jadi sekarang, biarkan aku pergi ke depan dan memukul pergi.
Dan berapa banyak baris yang harus saya dapatkan kembali ketika saya pilih bintang dari pengguna?
>> AUDIENCE: [tidak terdengar]
DAVID Malan: Jumlah baris, yakin.
Tapi berapa banyak dalam hal ini cerita beton sekarang?
Dua, karena ada saya dan ada Rob.
Jadi, jika saya klik Go, saya melihat visual yang Aku sudah kembali, memang, dua baris.
Ada banyak kekacauan di layar, tapi aku hanya melihat dua baris.
Sebaliknya, jika saya melakukan ini lagi dan melakukan SELECT bintang DARI pengguna, di mana nama pengguna
sama dengan kutipan, tanda kutip Malan, jika saya klik Go,
Aku hanya akan mendapatkan kembali satu baris.
Dan terakhir, jika saya lakukan sesuatu seperti ini, misalkan
bahwa saya tidak peduli tentang mendapatkan segala sesuatu,
yang merupakan jenis berarti sekarang, karena hanya ada dua kolom.
Ini tidak seperti aku memilih sejumlah besar data.
Misalkan saya pergi ke depan dan jangan SELECT nama FROM
pengguna, di mana nama sama dengan Malan, apa yang baik tentang SQL jujur,
adalah bahwa itu benar-benar hanya melakukan apa yang Anda katakan untuk dilakukan.
Hal ini cukup ringkas, tapi Anda benar-benar hanya mengatakan apa yang ingin Anda lakukan.
Pilih nama dari pengguna mana username sama Malan.
Dan itu benar-benar adalah bahwa eksplisit.
Jadi, jika aku memukul Go, berapa banyak baris aku akan mendapatkan kembali?
Satu, karena itu hanya Malan, mudah-mudahan.
Atau nol jika dia tidak ada, tapi satu secara maksimal.
>> Dan berapa banyak kolom saya akan kembali?
Berapa banyak kolom?
Kali ini, aku hanya akan untuk mendapatkan satu karena saya tidak
pilih bintang, yang adalah segalanya.
Sekarang aku memilih hanya nama, jadi saya hanya mendapatkan kembali satu kolom dan satu baris.
Dan itu terlihat semacam tepat konyol, hanya melihat yang super
kecil seperti ini.
Jadi, apa yang sebenarnya terjadi?
Ketika Anda menjalankan SQL query menggunakan pilih,
apa yang Anda dapatkan kembali dari database
seperti tabel sementara dengan baris dan kolom, mungkin,
tapi itu menghilangkan sesuatu yang tidak benar-benar dipilih oleh Anda.
Jadi, ini seperti jika seseorang memiliki besar spreadsheet dari semua siswa
terdaftar untuk beberapa kelompok mahasiswa, dan Anda mengatakan,
memberi saya semua mahasiswa yang sudah terdaftar untuk kelompok mahasiswa, apa
rekan Anda di kelompok mahasiswa mungkin melakukan
adalah mereka hanya bisa menyerahkan Anda seluruh spreadsheet.
Itu seperti mengatakan pilih bintang.
Dan itu sedikit mengganggu jika Anda hanya ingin mahasiswa baru.
Dan, jika Anda malah mengatakan, pilih bintang dari tabel database
di mana tahun sama kutipan, mahasiswa tanda kutip,
itu seolah-olah teman Anda pada kelompok siswa
harfiah disorot dan disalin hanya baris mahasiswa,
disisipkan ke dalam Google baru Spreadsheet atau file Excel,
dan menyerahkan Anda kembali dihasilkan file saja.
Itu semua yang terjadi pada konseptual sini.
>> Jadi pada akhirnya, kita dapat melakukan beberapa hal yang cukup mewah
dengan menyimpan hal-hal seperti username dan password dan sejenisnya.
Tapi, ternyata, kita harus melakukan sedikit berbeda dari ini.
Ini bukan berarti bahwa pintar untuk hanya menyimpan username dan password.
Seseorang sebelumnya, saya pikir di sini, menyarankan ID.
Sekarang ID bisa menjadi seperti Harvard ID atau Yale Net ID,
tapi bisa lebih sederhana dalam kasus database kami.
Dan memang, kasus umum adalah memiliki kolom lain.
Dan aku akan pergi depan dan mengedit meja saya.
Dan jika Anda bermain-main dengan interface ini untuk PSet7,
Anda akan melihat bahwa Anda dapat memeriksa tombol ini di sini dan menambahkan
bidang di awal meja.
Dan jika saya klik Go, itu akan untuk memberikan salah satu dari bentuk-bentuk
dari tadi.
Aku akan menambahkan field yang disebut ID.
Dan aku akan membuat jenis numerik.
>> Saya memiliki seluruh banyak dari nilai untuk numerics.
Aku hanya akan memilih INT dan tidak khawatir tentang ukuran yang berbeda.
Saya tidak harus menentukan panjang atau nilai,
karena itu akan menjadi 32 bit tidak peduli apa.
Atribut, kita tidak melihat sebelumnya.
Kepentingan dalam salah satu dari Pilihan menu kali ini?
Untuk INT?
Apa yang Anda usulkan?
Tidak?
Apakah semua ini masuk akal?
Ya.
Ya, unsigned, kan?
>> Secara umum, jika kita akan memberikan orang nomor unik, yang
adalah di mana cerita ini pergi, aku benar-benar hanya ingin
seseorang untuk memiliki nomor seperti nol dan satu dan dua dan tiga dan empat.
Saya tidak perlu berurusan dengan angka negatif.
Sepertinya seperti kompleksitas yang tidak semestinya.
Saya ingin empat miliar nilai yang mungkin, tidak empat miliar kemungkinan nilai,
jadi aku hanya dua kali lipat kapasitas INT saya.
Sebagai samping, jika Anda ingin berhubungan ini untuk sesuatu seperti Facebook,
kembali semacam hari saya ketika Facebook pertama kali keluar,
Saya percaya apa yang mereka menggunakan dalam database MySQL mereka
untuk menyimpan pengguna identifier, itu hanya sebuah INT.
Tapi tentu saja, ada banyak dari orang-orang nyata di dunia.
Ada banyak palsu Facebook account di dunia.
Dan sehingga akhirnya, Facebook meluap ukuran sebuah INT, sebuah empat miliar
nilai.
Itulah sebabnya, jika Anda melihat sekitar dan ada website
yang dapat memberitahu Anda apa ID unik Anda.
Dan jika Anda tidak pernah memilih username di Facebook, Anda akan melihat ID unik Anda.
Saya pikir itu profil dot PHP tanda tanya ID sama sesuatu.
Yang kini sesuatu seperti besar INT, atau lama jika Anda mau,
yang merupakan nilai 64-bit atau sesuatu yang sebanding.
>> Jadi, bahkan di dunia nyata melakukan hal- masalah akhirnya kadang-kadang masalah.
Dan ternyata di sini, jika saya memberikan semua pengguna saya ID unik,
Saya ingin menjadi super eksplisit dan minimal membuat bidang ini unik.
Tapi ternyata ada satu sepotong nomenklatur hari ini juga
itu adalah kunci utama.
Jika Anda sedang merancang sebuah database meja dan Anda tahu sebelumnya
bahwa salah satu kolom dalam tabel yang harus dan akan unik mengidentifikasi baris
dalam tabel, Anda ingin tentukan dan memberitahu database,
ini adalah kunci utama saya.
Mungkin ada duplikasi di bidang lain,
tapi aku mengatakan database yang ini adalah utama saya, bidang saya yang paling penting,
yang dijamin untuk menjadi unik.
>> Sekarang, ini tampaknya berlebihan.
Saya sekarang mengusulkan kita bahwa menambahkan, dengan mengklik Simpan sini,
sebuah called-- lapangan dan aku akan untuk pergi ke depan dan klik AI,
kami akan kembali ke bahwa dalam beberapa saat, Simpan.
Saya mengusulkan sekarang meja saya terlihat seperti ini.
Saya memiliki sebuah lapangan INT disebut ID, bidang CHAR disebut Username,
bidang VARCHAR disebut Nama, tapi ID, apakah itu primer dan karena itu unik,
mengapa saya hanya membuang-buang waktu memperkenalkan apa
efektif adalah kedua yang unik field yang disebut ID yang merupakan INT?
>> Username, ingat, adalah sudah unik, kami katakan.
Jadi hanya logis, Anda tidak perlu pengalaman database untuk alasan
melalui ini, mengapa mungkin saya telah memperkenalkan
sebuah INT sebagai pengenal unik saya juga?
Apa this-- mengatakan lagi?
>> AUDIENCE: [tidak terdengar]
>> DAVID Malan: Random akses lebih mudah, mengapa?
>> AUDIENCE: [tidak terdengar]
DAVID Malan: Ya, itu hanya mengakses nomor.
Jadi, jika Anda berpikir ini benar-benar adalah meja, seperti array,
sekarang saya memiliki pengenal yang unik bahwa saya bisa melompat-lompat.
Dan lebih baik dari yang masih adalah bahwa seberapa besar merupakan INT akan lagi?
32 bit atau empat byte.
>> Seberapa besar adalah username saya akan?
Maksimal?
16 byte.
>> Jadi, jika Anda benar-benar peduli tentang kinerja kode Anda,
berpikir kembali ke PSet5, akan Anda sukai untuk mencari nilai empat byte atau 16
nilai byte, kan?
Ini benar-benar adalah yang sederhana seperti itu.
Anda harus melakukan empat kali lebih banyak pekerjaan untuk mencari nama pengguna karena mereka
16 byte.
Jadi, Anda harus benar-benar membandingkan semua 16 byte menjadi
yakin ya, ini adalah nama yang saya inginkan.
Sedangkan untuk INT, Anda dapat melakukannya dengan hanya empat byte.
>> Dan sebagai samping bagi mereka tertarik perangkat keras komputer,
ternyata Anda bisa muat sesuatu seperti sebuah INT atau nilai 32-bit dalam sesuatu
disebut register di komputer CPU, yang berarti itu super,
super cepat, bahkan pada terendah tingkat hardware komputer.
Jadi, hanya ada keuntungan sekitar.
Jadi, apa artinya ini?
Bahkan, ketika Anda sedang merancang sebuah tabel database, hampir sepanjang waktu
Anda akan memiliki tidak hanya data yang Anda pedulikan,
tetapi juga sesuatu seperti pengenal unik
karena ini akan mari kita melakukan hal-hal lainnya.
Dan mari kita tersandung satu masalah di sini.
>> Misalkan pengguna belum hanya nama pengguna dan nama,
tetapi mereka juga memiliki hal-hal seperti kota dan negara dan kode pos, setidaknya
sini di Amerika Serikat.
Jadi, aku akan pergi ke depan dan hanya cepat mengatakan,
memberi saya tiga kolom lainnya di ujung meja.
Dan ini akan menjadi Kota, ini akan menjadi Negara,
dan ini akan menjadi Zip.
>> Sekarang jenis Kota, data apa yang hal ini harus, mungkin?
VARCHAR?
Aku tidak tahu apa yang terpanjang kota namanya.
Di suatu tempat di Amerika, ada mungkin beberapa kata ridiculously lama,
jadi mari kita pergi dengan 255, agak historis atau sewenang-wenang.
Negara, apa yang ingin Anda lakukan?
Panggilan pengadilan, kan?
Apa mungkin yang paling efisien?
Berapa banyak karakter?
Mungkin hanya dua, jika kita bisa lolos dengan melakukan hal,
seperti, MA untuk Massachusetts dan sebagainya.
Jadi, aku akan pergi nilai CHAR dua.
>> Kode pos Ini salah satu yang menarik.
Kami di sini di 02.138, sehingga menyarankan kita harus menggunakan apa?
Ini adalah INT, kan?
INT, INT, singkat?
Pendek akan bekerja.
Tidak?
CHAR atau lima, tapi saya ingin INT.
Mengapa mendorong kembali pada INT?
Membujuk saya dari ini.
Apa bodoh tentang INT, ide saya?
Ya.
>> AUDIENCE: Ambil lebih banyak memori.
>> DAVID Malan: Ambil lebih banyak memori.
Empat byte, tapi kau mengusulkan kode pos
lima byte atau seseorang sebagai CHAR, yang terasa seperti eh, itu tidak benar-benar
kasus.
>> Nah, menyenangkan cerita.
Tahun lalu, ketika saya digunakan untuk menggunakan Microsoft Outlook untuk email saya,
Saya akhirnya ingin beralih ke Gmail.
Dan, aku diekspor semua saya kontak dari Outlook sebagai file CSV.
Comma separated values, yang hanya berarti saya
memiliki semua nama teman-teman saya dan terakhir nama dan nomor telepon dan kode pos
dan semua itu.
Dan kemudian saya membuat kesalahan membukanya
di Excel, yang merupakan Program spreadsheet yang
memahami file CSV seperti yang kita lihat.
Tapi kemudian, saya harus memukul, seperti, Perintah atau Control S pada satu titik.
Dan Excel ternyata pada saat itu memiliki fitur dimana setiap saat itu
melihat angka, ia mencoba untuk membantu.
Dan jika nomor yang dimulai dengan nol, itu hanya akan menyingkirkan mereka.
Mengapa Anda perlu terkemuka angka nol pada bilangan bulat?
Mereka berarti, secara matematis.
Mereka tidak berarti dalam sistem US Postal.
Jadi, aku sudah bertahun-tahun, sampai hari ini, saya masih
memiliki teman-teman yang ketika kasus yang jarang terjadi bahwa saya membutuhkan seseorang yang
mengatasi hari ini, Saya masih akan melihat bahwa saya
punya teman di Cambridge, Massachusetts, 2138.
Dan itu mengganggu jika Anda mencoba untuk mengurutkan dari pemrograman
menghasilkan amplop atau hanya menuliskan itu.
Dan itu karena alasan ini, Saya memilih tipe data yang salah.
Jadi, saya suka ide Anda.
Mari kita gunakan bidang CHAR.
Lima karakter, kecuali ada kasus sudut.
Jika Anda masih mengirim email, kadang-kadang zip kode hari ini,
mereka, seperti, ditambah empat.
Jadi, kita membutuhkan tanda hubung dan kemudian kita perlu empat nomor lagi.
Jadi jujur, itu bisa pergi berbagai cara.
>> Untuk saat ini, aku akan terus sederhana dan aku hanya
akan mengatakan bahwa itu adalah lima nilai CHAR dan kami
akan melewatkan seluruh dasbor ditambah empat.
Tetapi ini adalah jenis pengorbanan.
Dan Anda dapat berpikir tentang masalah yang sama timbul
dengan nomor telepon atau bidang lainnya.
>> Dan sekarang, ini sebenarnya jalan bodoh untuk turun.
Misalkan baik Rob dan saya dan Hannah dan Maria dan [? Davon?] Dan Andy
dan lain-lain pada staf semua hidup di Cambridge, Massachusetts, 02138.
Ini benar-benar merasa bodoh bahwa aku menambahkan ke meja pengguna saya, kota, negara,
dan zip.
Mengapa?
>> AUDIENCE: [tidak terdengar]
>> DAVID Malan: Katakanlah lagi?
AUDIENCE: [tidak terdengar]
>> DAVID Malan: Mereka selalu akan pergi bersama-sama, kan?
Ketika ternyata, kita digunakan untuk berpikir ini adalah kasus sampai kita mendalam
dicari seluruh AS, dan ternyata bahwa ada
beberapa inkonsistensi di mana beberapa kota-kota memiliki
zip yang sama, yang aneh.
Tapi, jika kita menetapkan untuk saat itu 02.138 selalu Cambridge, Massachusetts,
mengapa di dunia akan Anda simpan di database Cambridge dan MA dan 02.138
bagi saya dan bagi Hannah dan Rob dan untuk [? Davon?] Dan bagi orang lain yang tinggal
di sini di Cambridge, itu sempurna berlebihan.
>> Kita harus pergi dengan hanya menyimpan apa?
Hanya kode pos.
Tapi kemudian, jika kita menyimpan hanya kode pos, aku ingin, mungkin,
untuk website saya untuk mengetahui di mana 02.138 adalah.
Jadi, saya perlu meja lain.
Dan itu OK.
Dan pada kenyataannya, ini adalah salah satu proses desain merancang tabel
bahwa Anda akan melakukan di PSet7 serta dimana Anda ingin faktor luar data umum.
Sama seperti kita telah anjak keluar kode umum dan anjak keluar umum
gaya dari CSS, di sini terlalu dalam database,
jika saya hanya perlu 02.138 untuk secara unik mengidentifikasi kampung halaman seseorang,
tidak menyimpan Cambridge, Mass untuk setiap pengguna menisik di meja Anda.
>> Sebaliknya, memiliki tabel terpisah yang disebut Ritsleting yang harus memiliki apa kolom?
Mungkin bidang ID, hanya karena, untuk prinsip-prinsip yang kita bicarakan sekarang.
Mungkin bidang pos untuk 02.138.
Dan kemudian mungkin apa kolom lainnya?
Kota dan negara, tetapi hanya memiliki satu baris untuk 02.138, satu baris untuk 02.139,
satu baris untuk 90.210.
Dan yang secara harfiah semua kode pos saya tahu.
>> Jadi sekarang, apa yang dapat Anda lakukan?
Hal ini bermasalah, karena sekarang aku punya dua tabel.
Jadi, pengguna saya sebagian besar di sini, tapi informasi negara kota mereka ini
disini.
Jadi, ternyata dengan SQL, ada sebenarnya cara untuk bergabung informasi,
dan Anda akan melihat ini di PSet tersebut.
>> Tapi ternyata Anda bisa melakukan sesuatu seperti ini.
SELECT bintang DARI pengguna, BERGABUNG ritsleting ON pengguna dot zip sama ritsleting dot zip.
Yang merupakan bertele-tele kecil, diakui, tapi ini hanya
berarti pilih semuanya dari proses mengambil meja pengguna saya
dan meja ritsleting saya.
Bergabung dengan mereka pada satu bidang yang mereka miliki dalam kolom.
Jadi, secara harfiah melakukan sesuatu seperti ini, dan memberikan kembali
tabel sementara baru itulah yang lebih luas, yang lebih besar,
yang memiliki semua kolom dari keduanya.
Dan itu, cukup sederhana, akan menjadi sintaks untuk melakukan sesuatu seperti ini.
>> Jadi, ada ini ke depan, tapi ada akan
menjadi keputusan desain lainnya Anda akan harus membuat, tidak hanya dengan indeks
tetapi juga berlari ke tantangan.
Bahkan, ada tantangan dalam desain database
dimana kadang-kadang dua orang mungkin ingin untuk mengakses baris yang sama dari database
meja.
Jadi, ini adalah sesuatu yang kita akan temui di PSet7 juga.
>> Tapi saya pikir saya akan melihat satu Serangan itu mungkin di SQL.
Apa adalah beberapa masalah yang bisa timbul?
Jadi, Anda akan menemukan ini di PSet7.
Dan kami memberitahu Anda langsung apa coding solusi untuk masalah ini adalah.
Tetapi jika Anda mengambil kelas tingkat yang lebih tinggi, terutama dalam sistem operasi,
Anda akan menemukan isu atomicity,
masalah mencoba untuk melakukan beberapa hal sekaligus
tanpa gangguan.
>> Dan saya pikir saya akan memperkenalkan ini Ide untuk PSet7 dengan metafora
yang saya pelajari sendiri di Margo Sistem operasi CS164 Seltzer
kelas tahun yang lalu.
Misalkan Anda memiliki salah satu asrama ini lemari es di kamar asrama atau rumah,
dan Anda memiliki kegemaran yang nyata untuk susu.
Dan, Anda pulang dari kelas satu hari, Anda membuka lemari es.
Oh, sialan.
Tidak ada susu di lemari es.
Jadi, Anda menutup lemari es, mengunci pintu, mengunci asrama Anda,
berjalan sekitar sudut CVS, dapatkan sejalan,
dan mulai memeriksa untuk beberapa susu.
Dan itu akan memakan waktu cukup lama, karena mereka sialan checkout diri
counter mengambil selamanya untuk menggunakan pula.
Jadi sementara itu, teman sekamar Anda datang ke rumah.
Dia benar-benar menyukai susu juga.
Mereka datang ke kamar asrama, membuka kulkas, oh, darn it.
Tidak ada lagi susu.
>> Jadi, ia juga terjadi di sekitar sudut.
Tapi sekarang, karena ada seperti dua atau tiga atau empat CVSes terdekat,
mereka terjadi untuk pergi ke salah satu yang berbeda di alun-alun.
Dan sekarang, beberapa menit kemudian, Anda berdua
pulang dan ugh, terburuk masalah yang pernah.
Sekarang Anda memiliki terlalu banyak susu karena itu akan pergi asam.
Dan Anda seperti susu, tetapi Anda tidak benar-benar seperti susu.
>> Jadi sekarang, ini adalah mahal kesalahan karena Anda berdua
membuat keputusan berdasarkan keadaan beberapa variabel yang
adalah dalam proses yang diubah oleh Anda,
pemrakarsa akan mendapatkan susu.
Jadi, apa yang mungkin manusia solusi untuk masalah itu?
AUDIENCE: [tidak terdengar]
DAVID Malan: Tinggalkan catatan, kan?
Selalu meninggalkan catatan, jika Anda akrab dengan acara itu.
Ya, ada dua dari kami.
Jadi, selalu meninggalkan catatan, atau harfiah mengunci kulkas
dengan beberapa jenis gembok atau sesuatu dari atas seperti itu.
Tapi itu benar-benar akan menjadi masalah utama dengan desain database,
terutama ketika Anda mungkin memiliki beberapa browser, beberapa laptop,
beberapa pengguna semua mencoba untuk memperbarui informasi sekaligus.
Informasi yang sangat sensitif seperti informasi keuangan,
dimana dengan perdagangan saham situs seperti Anda akan membangun,
bagaimana jika Anda ingin memeriksa berapa banyak uang Anda miliki dan kemudian jika Anda memiliki cukup,
membeli saham?
>> Tapi bagaimana jika orang lain yang memiliki rekening bersama dengan Anda
adalah secara bersamaan mencoba untuk membeli beberapa saham?
Jadi, dia adalah memeriksa saldo rekening, Anda berdua
kembali sama Jawabannya, tidak ada susu.
Atau Anda berdua mendapatkan kembali jawabannya, Anda memiliki $ 100 dalam account.
Anda berdua mencoba untuk membuat keputusan untuk membeli satu saham dari beberapa saham perusahaan.
>> Dan sekarang, apa yang terjadi?
Anda memiliki dua saham?
Anda tidak memiliki saham?
Masalah seperti itu bisa timbul.
Jadi, kita akan menemukan itu.
Serangan injeksi SQL, untungnya, adalah sesuatu yang kita akan membantu Anda dengan,
tetapi ini adalah atrociously umum hari ini masih.
Jadi, ini hanya sebuah contoh.
Saya tidak membuat klaim bahwa Sistem Harvard PIN
rentan terhadap serangan tertentu.
Kami sudah mencoba.
Tapi, Anda tahu bahwa kami memiliki lapangan seperti ini.
Dan Yale Net ID memiliki sejenis Layar mencari hari ini.
Dan ternyata, yang mungkin Sistem PIN diimplementasikan di PHP.
>> Dan jika itu were-- itu not-- mereka mungkin memiliki kode yang terlihat seperti ini.
Mereka memiliki dua variabel.
Beri aku username dan password dari variabel global pasca Super
yang kita bicarakan sebelumnya.
Mungkin Harvard memiliki query seperti SELECT bintang DARI pengguna
di mana nama sama yang dan password sama dengan itu.
Dan melihat bahwa aku hanya plugging dalam menggunakan
notasi penjepit keriting dari yang lain hari, yang berarti hanya plug di nilai
sini.
Saya tidak menggunakan teknik tanda tanya.
Saya tidak memiliki kedua atau argumen ketiga.
Aku hanya benar membangun string sendiri.
>> Masalahnya, meskipun, adalah bahwa jika seseorang ingin scroob sebuah,
yang merupakan referensi untuk film, log in dengan sesuatu seperti ini,
dan Aku telah menghapus titik-titik yang biasanya menutupi
password, bagaimana jika ia terutama berbahaya
dan password mungkin adalah 12345, per film disebut "Spaceballs,"
tapi dia kritis jenis a kutip tunggal setelah lima,
kemudian harfiah kata atau dalam ruang, dan kemudian kutipan,
tanda kutip satu sama dengan kutipan satu, tapi pemberitahuan dia dihilangkan apa?
Dia dihilangkan kutipan di sebelah kanan dan dia dihilangkan kutipan di sebelah kiri.
>> Karena jika penyerang ini Anggapan scroob ini
adalah bahwa orang-orang yang menulis kode PHP ini tidak begitu cerah,
mungkin mereka hanya memiliki beberapa tunggal mengutip sekitar interpolasi
dari variabel dalam kurung kurawal?
Dan jadi mungkin, dia jenis bisa dari menyelesaikan pemikiran mereka
untuk mereka, tetapi dengan cara yang akan untuk membiarkan dia menyusup ke sistem PIN.
Dengan kata lain, misalkan bahwa ini adalah kode
dan kami sekarang pasang di apa scroob diketik.
Dan itu merah, karena itu buruk.
>> Dan teks yang mendasari adalah apa yang dia ketik,
scroob bisa mengelabui Server Harvard dalam membangun query SQL
string yang terlihat seperti ini.
Sandi sama dengan 12.345 atau satu sama dengan satu.
Yang hasilnya, secara logis, adalah bahwa ini akan log scroob
di jika password-nya 12.345 atau jika salah satu equals
satu, yang tentu saja selalu benar, yang berarti scroob selalu mendapat di.
>> Dan, cara untuk memperbaiki ini, seperti dalam banyak kasus,
akan menulis lebih defensif.
Untuk menggunakan sesuatu seperti kami Fungsi permintaan yang sebenarnya, yang
Anda akan melihat di PSet7, di mana kita pasang di sesuatu seperti pertanyaan menandai sini.
Dan keindahan fungsi query yang kita
memberikan itu membela terhadap ini disebut serangan injeksi SQL, di mana
seseorang menipu kode Anda ke menyuntikkan kode SQL sendiri.
Karena apa fungsi permintaan kami memberikan Anda benar-benar akan melakukan,
jika Anda menggunakan sintaks tanda tanya dan kedua dan argumen ketiga di sini,
adalah apa itu menambah masukan bahwa pengguna disediakan?
Backslash mereka mengutip.
>> Jadi, itu lolos setiap berpotensi karakter berbahaya.
Ini terlihat aneh sekarang, tapi itu tidak rentan
karena tidak mengubah logika lagi
karena itu seluruh password sekarang satu kutipan yang tidak,
pada kenyataannya, password scroob ini.
Jadi, sudah ada beberapa lelucon tentang hal ini selama bertahun-tahun.
Jadi, ini adalah foto yang diambil beberapa pecandu di tempat parkir
dimana Anda mungkin tahu bahwa beberapa kota dan negara-negara mencoba untuk memindai lisensi Anda
piring untuk tagihan Anda atau untuk tiket Anda jika Anda pergi melalui tanpa, seperti,
hal E-Z Pass.
Jadi, orang ini diduga bahwa mungkin orang-orang menulis sistem E-Z Lulus
tidak begitu cerah, dan mungkin mereka hanya concatenated bersama-sama string,
sehingga dia tidak bisa jahat bukan hanya menyelesaikan pemikiran mereka,
tapi benar-benar melaksanakan perintah buruk, yang kita sudah tidak disebutkan belum,
tapi Anda mungkin bisa menebak.
Bahwa selain menghapus dan menyisipkan dan update dan pilih,
ada juga kata kunci yang disebut drop, yang secara harfiah menghapus segala sesuatu
dalam database, yang sangat buruk.
>> Kita dapat memperbesar ini jika itu agak sulit untuk melihat.
Ini, sekarang, adalah kartun terkenal itu luar biasa pintar sekarang
dan dimengerti.
>> [Tertawa]
>> Ya, keren.
Jenis geeking.
Jadi ini, kemudian, adalah Serangan injeksi SQL.
Dan mereka begitu mudah untuk menghindari dengan menggunakan kode benar atau perpustakaan yang tepat.
Dan Anda akan melihat di PSet7, itu mengapa kita memberikan fungsi query.
Jadi, beberapa penggoda yang kami pikir kami akan
memberikan sini di kami menit tersisa bersama-sama.
Jadi, seperti yang Anda ingat dari minggu nol, kami memperkenalkan dua lampu ini lampu yang
bagus, bukan hanya karena mereka cukup dan berwarna-warni,
tetapi karena mereka mendukung sesuatu disebut API, Aplikasi
Programming Interface Dan di CS50 sejauh ini, kami sudah
sebagian besar difokuskan pada GET dan POST, tapi ternyata
ada kata kerja HTTP lain seperti PUT.
>> Dan sebenarnya, ini adalah slide dari seminggu nol
dimana jika Anda menulis kode yang mengirim a la PSet6 permintaan HTTP yang
terlihat seperti ini dengan sepotong ini teks di bagian bawah, yang disebut JSON,
atau JavaScript Object Notation bahwa kita akan berbicara tentang minggu depan,
Anda dapat mengaktifkan atau mematikan atau perubahan warna lampu seperti yang.
Jadi jika CS50 juga memiliki selain beberapa dari orang-orang bola lampu di sini di New Haven
jika Anda ingin meminjam mereka untuk proyek-proyek akhir,
juga beberapa Microsoft Band, yang seperti
jam tangan yang Anda pakai di pergelangan tangan Anda yang sama memiliki API sehingga Anda
dapat menulis perangkat lunak Anda sendiri untuk mereka.
>> Kami memiliki account dengan Kode Apple iOS jadi
bahwa jika Anda memiliki Apple Watch atau iPhone atau iPad atau iPod,
Anda dapat menulis kode yang benar-benar berjalan pada mereka.
Kami memiliki seluruh banyak dari Arduinos, yang
komputer kecil kecil tanpa kasus, pada dasarnya,
Anda dapat terhubung melalui USB, biasanya untuk Mac Anda sendiri atau PC,
menulis kode yang berjalan pada fisik ini perangkat yang sering memiliki sensor pada mereka
sehingga Anda dapat berinteraksi dengan dunia nyata.
Kami memiliki seluruh banyak perangkat Leap Motion,
yang perangkat USB untuk Mac dan PC, di sini dan lagi, di New Haven.
Dan jika Anda terhubung ke Mac Anda, Anda benar-benar dapat mengontrol komputer Anda
dengan menulis perangkat lunak bahwa melalui sinar inframerah,
angka keluar di mana tangan manusia Anda, bahkan tanpa menyentuh keyboard Anda.
Kami pikir kami akan berbagi cepat sekilas ini, misalnya.
>> [MUSIC PLAYING]
Jadi, kita memiliki keseluruhan sekelompok hal-hal ini,
juga, disebut Myo band lengan yang Anda menempatkan lebih lengan Anda
dan kemudian Anda dapat mengontrol nyata dunia atau dunia maya seperti ini.
>> [MUSIC PLAYING]
Atau, kami juga memiliki beberapa Google Kardus, yang secara harfiah, seperti,
kotak kardus Anda bisa memakai Anda wajah, tapi slide dalam telepon Anda ke dalamnya
sehingga Anda menempatkan gelas Anda telepon benar-benar dekat dengan mata Anda.
Dan Google Karton adalah cukup murah di $ 10 atau $ 20.
Dan memiliki lensa kecil yang sedikit off pergeseran
gambar di layar untuk manusia Anda mata untuk memberikan rasa kedalaman
sehingga Anda benar-benar memiliki 3D lingkungan di depan Anda.
Kami juga memiliki beberapa Samsung Gear, yang adalah versi yang lebih mahal dari ini,
tapi itu sama dapat meluncur di Ponsel android dan memberikan ilusi
of-- atau memberikan pengalaman virtual reality.
Dan di akhir kami dua menit, kami pikir kami akan mencoba untuk melakukan hal ini.
Jika saya dapat proyek apa Colton memiliki di sini hanya untuk merangsang selera Anda,
biarkan aku pergi ke depan dan melemparkan di layar besar di sini.
Biarkan saya membunuh lampu.
Colton, apakah Anda ingin pergi ke depan dan menempatkan pada sel sejenak
dan datang di atas ke tengah panggung?
Dan apakah Anda ingin project-- ini adalah apa yang dilihat Colton.
>> Sekarang, Wi-Fi di sini adalah tidak begitu kuat untuk perangkat ini
yang ini super menarik, tapi Colton secara harfiah
di tempat futuristik ajaib ini.
Dia hanya melihat satu gambar.
Anda melihat mata kiri dan kanannya bahwa otaknya sedang menjahit
dalam tiga dimensi lingkungan di wajahnya.
Dia hanya memilih pilihan menu di sini.
Dan lagi, dia memakai headset ini dengan ponsel Samsung di atasnya yang
nirkabel memproyeksikan overhead kami.
Sekarang Anda di Mars, saya pikir?
COLTON: Saya kira begitu.
Saya tidak yakin [tidak terdengar].
[Tertawa]
>> DAVID Malan: Ternyata Mars memiliki menu ini.
>> COLTON: [tidak terdengar] beberapa keren tempat jika kita ingin pergi to--
>> DAVID Malan: Di mana kita ingin pergi?
>> COLTON: [tidak terdengar]
DAVID Malan: Dan mari kita lihat di mana Colton membawa kita sekarang.
COLTON: [tidak terdengar]
>> DAVID Malan: Jadi, ada begitu banyak tempat yang berbeda yang dapat Anda ambil sendiri.
Ada FAPIs melalui mana Anda dapat menulis game atau interaksi yang
menjalankan, akhirnya, di telepon.
Jadi, Anda benar-benar hanya menulis sebuah aplikasi ponsel.
Namun berkat perangkat lunak dan kemampuan grafis,
sekarang Colton dalam ini pondok kecil kecil.
Dan pada risiko melanda diri kita sendiri,
Colton dan aku akan tetap sekitar untuk sementara pada akhir kelas di sini hari ini
jika Anda ingin datang dan bermain.
Dan kami akan membawa mereka kembali minggu depan juga.
Tanpa basa-basi itu saja untuk hari ini.
Kita akan melihat Anda minggu depan.
>> [MUSIK - ragga KEMBAR, "MAN BAD"]