MySQLi vs PDO

Seperti semua sedia maklum, versi PHP terkini adalah 5.5.7. Antara isu yang dibangkitkan oleh segelintir programmer adalah fungsi mysql_* yang telah dideprecated mulai PHP 5.5.0. Jadi walaupun kita masih menggunakan server yang menggunakan versi PHP sebelum 5.5.0, adalah disarankan agar kita menukar fungsi mysql_* kita kepada fungsi MySQLi atau PDO.

Kedua-dua fungsi ini mempunyai persamaan dan perbezaan yang tidak terlalu ketara. Dengan adanya fungsi-fungsi ini, konsep prepared statements, multiple statements dan transactions dapat digunakan dengan lebih mudah dan berkesan. Selain itu, pada fungsi mysql_*, fungsi mysql_real_escape_string dan concatenating biasanya ditentukan oleh programmer itu sendiri. Ini adalah amat berbahaya kepada sistem yang hendak dibangunkan kerana mudah terdedah kepada SQL Injection.


MySQLi

MySQLi Extension (mysql improved) membolehkan kita mengakses fungsi yang terdapat pada MySQL versi 4.1.13 ke atas. MySQLi adalah versi yang lebih baik berbanding MySQL sebelumnya. Terdapat banyak fungsi baru yang ada boleh kita gunakan.

MySQLi biasanya menggunakan OOP (Object-Oriented Programming) tetapi kita masih boleh menggunakan procedural programming.

Contoh OOP dalam MySQLi:

$conn = new mysqli(“localhost”, “root”, “”, “database”);
if ($conn->connect_error) {
die(‘Database connection failed: ‘.$conn->connect_error, E_USER_ERROR);
}

Contoh Procedural API:

$conn = mysqli_connect(“localhost”, “root”, “”, “database”);
if (mysqli_connect_errno()) {
die(‘Database connection failed: ‘.mysqli_connect_error(), E_USER_ERROR);
}

Sumber:
+ W3Schools
+ Pontikis.net


PDO

Selain MySQLi, PDO (PHP Data Object) juga adalah satu lagi pilihan yang adalah untuk berinteraksi dengan MySQL. Berbanding dengan MySQLi, PDO hanya ditulis menggunakan OOP. Kod-kod yang ditulis menggunakan PDO biasanya lebih selamat dan kemas.

Berbeza dengan MySQLi yang hanya boleh berinterasi dengan MySQL, PDO boleh berinteraksi dengan banya database. Selain daripada MySQL, PDO boleh berinteraksi dengan IBM, Informix, ODBC, PostgreSQL, SQLite, Oracle dan sebagainya.

PDO juga mempunyai banyak kaedah error handling. Dalam PDO, exception mode membolehkan anda mengetahui ralat (error) dengan lebih konsisten dan ini membantu anda untuk menangani isu-isu tadi dengan lebih cepat dan mudah.

Contoh PDO:

$conn = new PDO(‘mysql:host=localhost;dbname=database;charset=utf8’, ‘root’, ”);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

Sumber:
+ HashPHP.Org
+ TutPlus.Com


Apakah Prepared Statements dan Kenapa Ia Penting?

Prepared statements adalah fungsi yang lazim digunakan pada MySQLi dan PDO. Andaikan kita mempunyai satu string yang mempunyai simbol ‘ (single quote). Cthnya, “Pak Mat’s House”. Di dalam MySQL, kita perlu menggunakan fungsi real_escape_string(). Tetapi menggunakan MySQLi atau PDO, kita hanya perlu gunakan fungsi prepare(). Kebiasannya, melalui fungsi ini sql statement datatype akan ditentukan melalui fungsi bind_param (MySQLi) atau bindParam (PDO) sebelum di proses (melalui fungsi excute()).

Contoh MySQLi:

$sql = ‘SELECT field FROM table WHERE field = ? ‘;
$data = ‘Pak Mat’ House’;
$stmt = $conn->prepare($sql);
/* Bind parameters. TYpes: s = string, i = integer, d = double,  b = blob */
$stmt->bind_param(‘s’,$data);
$stmt->execute();

Contoh PDO:

$sql = ‘SELECT field FROM table WHERE field = :field’;
$data = ‘Pak Mat’ House’;
$stmt = $conn->prepare($sql);
$stmt->bindParam(‘:field’, $data, PDO::PARAM_STR);
$stmt->execute();

Jadi kita perhatikan disini, user input akan difilter terlebih dahulu sebelum diproses. Ini akan menjadikan query kita lebih selamat. Fungsi di atas juga amat efektif (performance increase) sekiranya kita membuat sql statement berulang-ulang kali.

Kedua-duanya mempunyai kelebihan dan kekurangan sendiri. Ada juga pertanyaan manakah yang lebih bagus. Saya menjawab bergantung kepada citarasa masing-masing yang mana lebih anda suka :). Tapi sekiranya ada kemungkinan aplikasi itu menggunakan multiple database (cth MySQL, Oracle, IBM), jadi PDO adalah pilihan paling tepat. Saya sendiri menyarankan menggunakan PDO meskipun anda hanya menggunakan MySQL.

Apa itu DDL, DML dan DCL?

Secara asasnya, arahan SQL boleh dibahagikan kepada 3 kumpulan kecil iaitu DDL, DML and DCL.

DDL

DDL adalah singkatan dari Data Definition Language yang  menerangkan bagaimana data boleh disimpan dalam pengkalan data melalui skema dan keterangan pengkalan data yang ditetapkan.

  • CREATE – untuk mencipta pengkalan data
  • ALTER – mengubah struktur pengkalan data
  • DROP – menghapuskan pengkalan data
  • TRUNCATE – menghapuskan semua rekod yang ada dalam table pengkalan data
  • COMMENT – menambah komen data dictionary
  • RENAME – menukar nama pengkalan data

DML

DML pula adalah singkatan kepada Data Manipulation Language yang mana ia adalah berkaitan dengan manipulasi data. Kebiasaannya, DML adalah berkaitan dengan pernyataan SQL seperti SELECT, INSERT, UPDATE, DELETE dan sebagainya. Pernyataan-pernyataan ini digunakan untuk menyimpan, mengubah, menyenarai (retrieve), menghapus dan mengemaskini data di dalam sesuatu pengkalan data

  • SELECT – retrieve data dari pengkalan data
  • INSERT – menambah data ke dalam sesuatu table
  • UPDATE – mengemaskini data sedia ada di dalam sesuatu table
  • DELETE – menghapuskan rekod di dalam table sesuatu pengkalan data
  • MERGE – UPSERT operation (insert or update)
  • CALL – call a PL/SQL or Java subprogram
  • EXPLAIN PLAN – interpretation of the data access path
  • LOCK TABLE – concurrency Control

DCL

Manakala DCL pula adalah singkatan untuk Data Control Language dan berfungsi untuk melakukan arahan seperti GRANT; kebiasaannya untuk arahan rights, permissions dan kawalan lain sistem pengkalan data

  • GRANT – membenarkan pengguna mempunyai akses terhadap sesuatu pengkalan data
  • REVOKE – menarik balik kebenaran akses yang telah diberi melalui arahan GRANT tadi

JomWeb Meetup 02/11/2013 @ Training.My

Alhamdulillah, hari ni dapat join meetup JomWEB untuk berkongsi ilmu tentang psd2html, umobile dan meteor. Hanya bayar RM10.00 untuk join sesi kali ini. Kalau hendak dibandingkan dengan ilmu yang diperolehi + makan tengahari, rasanya RM10.00 apalah sangat. Ramai juga yang hadir sekitar 12 orang hadir.

PakCu masuk agak lambat, dalam jam 10.30am baru dapat join. Kelas bermula jam 09:00am. Sesi pertama dimulakan oleh saudara Iszuddin Ismail dengan topik bertajuk psd2html. Sebelum ini PakCu hanya tahu penggunaan slice dalam image yang telah disiapkan menggunakan Adobe Photoshop dan kemudiannya dislice utk diexport sebagai html page. Melalui sesi pagi ini, saudara Iszuddin Ismail telah memberi sedikit pencerahan bagaimana membuat html page daripada psd dengan menggunakan teknik CSS. PakCu ditambah dengan ilmu baru mengenai CSS iaitu CSS Reset

Kelas berehat tengahari awal sedikit kerana penceramah tidak beberapa sihat. Sesi petang disambung oleh saudara Zulfa Juniadi B Zulkifli. Topik mengenai UMobile. Saudara Zulfa ini menunjukkan bagaimana membuat aplikasi mobile menggunakan Apache Cordova + NodeJS + JQueryMobile + AppGyVer Steroids. Walaupun sample yang diberikan agak simple tapi dengan documentation yang disediakan insyallah akan memudahkan kita nanti.

Sebelum kelas tamat pada jam 04:30pm, kami sekali lagi diberi pendedahan mengenai Meteor. Meteor adalah satu framework menggunakan javascript untuk mengemaskini maklumat secara live tanpa perlu anda refresh page tersebut; cthnya: utk sistem bidding, online booking. Untuk memuatturun meteor, sila ke url berikut http://win.meteor.com. Untuk mendapatkan dokumentasi meteor ini, sila ke url http://docs.meteor.com. Meteor menggunakan kaedah handlebarsjs untuk format/kaedah templates. Meteor menggunakan mongodb sebagai default and only database. MongoDB akan terbina apabila anda memasang meteor ini.

MySQL Unsigned INT

MySql says:

All integer types can have an optional (nonstandard) attribute UNSIGNED. Unsigned type can be used to permit only nonnegative numbers in a column or when you need a larger upper numeric range for the column. For example, if an INT column is UNSIGNED, the size of the column’s range is the same but its endpoints shift from -2147483648 and 2147483647 up to 0 and 4294967295.

Bila hendak gunakan unsigned ini?

Apabila kita hendak mencipta/menambah field baru dalam table database, kita perlu pastikan adakah data yang hendak dimasukkan nanti mengandungi nilai negative (-) atau tidak. Sekiranya tidak, maka seharusnya kita memilih data jenis UNSIGNED untuk field tersebut.

Jadi mari kita lihat kesilapan yang selalu dibuat oleh kita. Apabila membuat field ID yang mana kita akan buat pilihan INT, PRIMARY KEY dan AUTO INCREMENT, kita biasanya lupa untuk memilih jenis data untuk field berkenaan seharusnya adalah UNSIGNED. Ini bagi membolehkan data bermula dengan zero dan seterusnya. Ini akan menambahkan jumlah data maksimum yang boleh dimasukkan dalam table tersebut.

Setting fungsi email kat Xampp mengunakan akaun gmail

Salam Aidilfitri!

Ramai yang tanya boleh tak send email menggunakan xampp yang kita install kat pc/laptop kita. Jawapannya boleh dengan syarat anda ada internet akses. Jadi untuk kali ini, PakCu akan buat sedikit tutorial bagaimana untuk membuat tetapan agar script email yang kita buat di localhost (menggunakan xampp) dapat menghantar email dengan menggunakan akaun gmail anda.

Buka fail sendmail.ini (C:\xampp\sendmail) anda. Buat tetapan seperti berikut:

[sendmail]
smtp_server=smtp.gmail.com
smtp_port=25
error_logfile=error.log
debug_logfile=debug.log
auth_username=username@gmail.com
auth_password=katalaluan
force_sender=username@gmail.com
smtp_ssl=auto

Kod-kod yang lain dalam fail sendmail.php tu boleh delete atau save fail berkenaan dengan nama lain (untuk backup jika ada permasalahan nanti).

Ok! Sekarang bukak fail php.ini (C:\xampp\php) pula dan komen (disable) kod seperti berikut:

[mail function]
; XAMPP: Comment out this if you want to work with an SMTP Server like Mercury
; SMTP = localhost
; smtp_port = 25

; For Win32 only.
; http://php.net/sendmail-from
;sendmail_from = postmaster@localhost

; XAMPP IMPORTANT NOTE (1): If XAMPP is installed in a base directory with spaces (e.g. c:\program filesD:\xampp) fakemail and mailtodisk do not work correctly.
; XAMPP IMPORTANT NOTE (2): In this case please copy the sendmail or mailtodisk folder in your root folder (e.g. C:\sendmail) and use this for sendmail_path.

; XAMPP: Comment out this if you want to work with fakemail for forwarding to your mailbox (sendmail.exe in the sendmail folder)
sendmail_path = “\”C:\xampp\sendmail\sendmail.exe\” -t”

; XAMPP: Comment out this if you want to work with mailToDisk, It writes all mails in the D:\xampp\mailoutput folder
; sendmail_path = “C:\xampp\mailtodisk\mailtodisk.exe”

; Force the addition of the specified parameters to be passed as extra parameters
; to the sendmail binary. These parameters will always replace the value of
; the 5th parameter to mail(), even in safe mode.
;mail.force_extra_parameters =

; Add X-PHP-Originating-Script: that will include uid of the script followed by the filename
mail.add_x_header = Off

; Log all mail() calls including the full path of the script, line #, to address and headers
;mail.log = “C:\xampp\php\logs\php_mail.log”

Jika diperhatikan, hanya baris ‘sendmail_path = “\”C:\xampp\sendmail\sendmail.exe\” -t”‘ dan ‘mail.add_x_header = Off’ sahaja yand diaktifkan (enable). Save fail berkenaan dan restart apache anda.

Jadi tetapan untuk fungsi email menggunakan sendmail telah kita buat. Sekarang kita buat contoh script mail pula. Buat satu fail baru dan namakan test.php dan simpan dalam folder web root (htdocs) anda. Masukkan kode di bawah:

<?php
$from = “Abu Haziq”;
$headers = “From: “.$from;
$body = “Salam sejahtera!, \nIni adalah cubaan menghantar email!”;
$subject = “Cubaan Menghantar Email”;
$to = “pro@ppukm.ukm.edu.my”;
if  (mail($to, $subject, $body, $headers)) {
echo “Berjaya!”;
}
else {
echo “Gagal!”;
}
?>

p/s: PakCu menggunakan XAMPP v1.8.1

Differences between INDEX, PRIMARY, UNIQUE, FULLTEXT in MySQL

Differences

  • KEY or INDEX refers to a normal non-unique index. Non-distinct values for the index are allowed, so the index may contain rows with identical values in all columns of the index. These indexes don’t enforce any restraints on your data so they are used only for making sure certain queries can run quickly.
  • UNIQUE refers to an index where all rows of the index must be unique. That is, the same row may not have identical non-NULL values for all columns in this index as another row. As well as being used to speed up queries, UNIQUE indexes can be used to enforce restraints on data, because the database system does not allow this distinct values rule to be broken when inserting or updating data.Your database system may allow a UNIQUE index to be applied to columns which allow NULL values, in which case two rows are allowed to be identical if they both contain a NULL value (the rationale here is that NULL is considered not equal to itself). Depending on your application, however, you may find this undesirable: if you wish to prevent this, you should disallow NULL values in the relevant columns.
  • PRIMARY acts exactly like a UNIQUE index, except that it is always named ‘PRIMARY’, and there may be only one on a table (and there should always be one; though some database systems don’t enforce this). A PRIMARY index is intended as a primary means to uniquely identify any row in the table, so unlike UNIQUE it should not be used on any columns which allow NULL values. Your PRIMARY index should be on the smallest number of columns that are sufficient to uniquely identify a row. Often, this is just one column containing a unique auto-incremented number, but if there is anything else that can uniquely identify a row, such as “countrycode” in a list of countries, you can use that instead.Some database systems (such as MySQL’s InnoDB) will store a table’s records on disk in the order in which they appear in the PRIMARY index.
  • FULLTEXT indexes are different from all of the above, and their behaviour differs significantly between database systems. FULLTEXT indexes are only useful for full text searches done with the MATCH() / AGAINST() clause, unlike the above three – which are typically implemented internally using b-trees (allowing for selecting, sorting or ranges starting from left most column) or hash tables (allowing for selection starting from left most column).Where the other index types are general-purpose, a FULLTEXT index is specialised, in that it serves a narrow purpose: it’s only used for a “full text search” feature.

Similarities

  • All of these indexes may have more than one column in them.
  • With the exception of FULLTEXT, the column order is significant: for the index to be useful in a query, the query must use columns from the index starting from the left – it can’t use just the second, third or fourth part of an index, unless it is also using the previous columns in the index to match static values. (For a FULLTEXT index to be useful to a query, the query must use all columns of the index.)

mySQL String Functions

Untuk mendapatkan result dimana jumlah char untuk field berkenaan adalah 2:

$sql = “SELECT field FROM table WHERE CHAR_LENGTH(field) = 2”

Selain penggunaa LIKE atau RLIKE, untuk mendapatkan result dimana 2 char pertama dlm field tersebut adalah Ah:

$sql = “SELECT field FROM table WHERE LEFT(field,2) = ‘Ah'”

Juga selain penggunaa LIKE atau RLIKE, untuk mendapatkan result dimana 2 char terakhir dlm field tersebut adalah ad:

$sql = “SELECT field FROM table WHERE RIGTH(field,2) = ‘ad'”

Untuk mendapatkan result dimana bermula char kedua sebanyak 3 char dlm field tersebut seperti hma:

$sql = “SELECT field FROM table WHERE MID(field,1,3) = hma'”

Sumber: mySQL.Com