Apache 2.4, PHP 7 dan MySQL 5.7 Windows 10

  1. Muat turun Apache versi 2.4 di Apache Lounge atau Apache Haus. Saya lebih menyukai Apache Lounge kerana dia menggunakan pengkompil VC14.
  2. Muat turun juga Visual C++ Redistributable dari sini.
  3. Sudah semesti kita perlu muat turun PHP versi 7 dari window.php.net. Dapatkan versi Threaded Safe.
  4. Yang terakhir kita juga perlukan MySQL versi 5.7. Muat turun dari laman sawang MySQL.

Unzip fail zip Apache24 dan juga php7. Untuk memudahkan hidup anda, struktur folder anda haruslah seperti ini.
C:\
—–Apache24
—–php

Kemudian buka command prompt menggunakan akses administrator dan navigasi sehingga folder C:\Apache24\bin. Taip arahan dibawah ini.

httpd.exe -k install -n "Apache 2.4"

Sekarang anda sudah berjaya menjana servis untuk Apache anda. Buka fail C:\Apache24\conf\httpd.conf menggunakan notepad. Tambah kod dibawah pada pengakhiran fail

LoadModule php7_module "C:/Dev/php/php7apache2_4.dll"
AddHandler application/x-httpd-php .php

# configure the path to php.ini
PHPIniDir "C:/Dev/php"

Sekarang waktu untuk melakukan konfigurasi pada php pula. Masuk ke folder C:\php menggunakan File Explorer. Rename fail php.ini-development kepada php.ini. Restart Apache menggunakan Services.

Untuk MySQL, haih, kan pakai setup fail? Next-next je la. :p

Mengira perbezaan hari

Apabila kita membangunkan sistem, seringkali kita berhadapan dengan mengira perbezaan hari. Terutamanya sistem yang melibatkan KPI ataupun ISO bagi sesuatu proses. Catatan kali ini akan menceritakan bagaimana kita boleh mendapatkan perbezaan hari dari 2 tarikh.

Bagi yang menggunakan PHP versi 5.2 dan kebawah bolehlah mencuba cara ini

<?php
$unix_time1 = mktime(0,0,0,3,1,2013);
$unix_time2 = mktime(0,0,0,5,1,2013);
	
echo $unix_balance = floor(($unix_time2 - $unix_time1) /(60 * 60 * 24));
?>

Format bagi fungsi mktime() adalah seperti ini mktime(jam,minit,saat,bulan,hari,tahun).  Kemudian kita perlu gunakan rumus ini bagi mendapatkan bilangan hari.

(Tarikh2 – Tarikh1) / (60saat x 60minit x 24jam)

Hasil dari pengiraan diatas, kita perlu melakukan proses pembundaran ke nilai yang lebih rendah. Dengan itu fungsi floor() diperlukan.

 

Cara yang kedua adalah dengan menggunakan Class Datetime yang terdapat didalam PHP 5.3 dan keatas. Menggunakan method diff. Bagi mendapat format yang boleh difahami, method format digunakan.

<?php
$Date1 = new Datetime('2013-03-01');
$Date2 = new Datetime('2013-05-01');
$interval = $Date1->diff($Date2);
	
echo $interval->format("%R%a days");
?>

Sekiranya kita perlu membuat perbandingan dengan data yang dipanggil dari pangkalan data, adalah lebih baik kita menggunakan sql. Ini bagi mengurangkan PHP perlu memprosesnya berulang-ulang kali. Caranya mudah. Pernyataan Sql dibawah menggunakan fungsi yang terdapat didalam MySQL.

 

Selamat mencuba!

SELECT DATEDIFF( tarikh_tamat, tarikh_mula )
FROM nama_jadual
WHERE syarat_anda
LIMIT 0 , 30

Invalid argument supplied for foreach() CORE\Cake\Utility\ObjectCollection.php, line 330


<a><b>Warning</b> (2)</a>: Invalid argument supplied for foreach() [<b>CORE\Cake\Utility\ObjectCollection.php</b>, line <b>330</b>]
Code Context
ObjectCollection::normalizeObjectArray() - CORE\Cake\Utility\ObjectCollection.php, line 330
BehaviorCollection::init() - CORE\Cake\Model\BehaviorCollection.php, line 66
Model::__construct() - CORE\Cake\Model\Model.php, line 748
ReflectionClass::newInstance() - [internal], line ??
ClassRegistry::init() - CORE\Cake\Utility\ClassRegistry.php, line 164
Model::_constructLinkedModel() - CORE\Cake\Model\Model.php, line 1031
Model::__isset() - CORE\Cake\Model\Model.php, line 857
Model::__get() - CORE\Cake\Model\Model.php, line 887
DboSource::read() - CORE\Cake\Model\Datasource\DboSource.php, line 1063
Model::find() - CORE\Cake\Model\Model.php, line 2674
Batch::count_enrolled() - APP\Plugin\course\Model\batch.php, line 73
CoursesController::index_admin() - APP\Plugin\course\Controller\CoursesController.php, line 55
ReflectionMethod::invokeArgs() - [internal], line ??
Controller::invokeAction() - CORE\Cake\Controller\Controller.php, line 485
Dispatcher::_invoke() - CORE\Cake\Routing\Dispatcher.php, line 186
Dispatcher::dispatch() - CORE\Cake\Routing\Dispatcher.php, line 161
[main] - APP\webroot\index.php, line 97

Selama 3 hari saya tersangkut dengan ralat ini. Sungguhpun ianya sekadar amaran(warning), tapi saya mahu menjadikan sistem saya bebas ralat. Kod yang pada asalnya menggunakan cakephp 1.3 kini dalam proses migrasi ke cakephp 2.3.

Hasil daripada apa yang saya kesan penggunaan fungsi $this->NamaModel->(‘count’) haruslah mempunyai parameter ‘contain’ => array(). Dimana kesemua hubungan model ini bersama model lain, haruslah diputuskan.


<?php

$params = array(

'conditions' => array('namaField' => $value),

'contain' => array()

);

$this->NamaModel->find('count',$params);

?>

Custom Helper in Cakephp 2

Hanya ingin berkongsi pengalaman saya menaiktarafkan code yang dijana dari Cakephp 1.3 ke Cakephp 2.0

Ada beberapa peralatan yang saya gunakan, yang pertama menggunakan Shell Script dari command bake


php cake.php upgrade All

Maklumat lanjut boleh diperolehi dari sini (http://book.cakephp.org/2.0/en/console-and-shells/upgrade-shell.html)

Perkara kedua yang saya lakukan adalah, mengubah nama fail untuk ikut standard Cakephp 2. Untuk itu saya telah buat script dibawah untuk ubah nama-nama controller.


<?php
$root = 'C:/Dev/www/vip2/app';
$path = $root.'/'.$_GET['path'].'/';

echo $path;

$dir_handle = opendir($path);

while ($file = readdir($dir_handle))
{
echo $file.'<br />';
if(($file != ".") && ($file != ".."))
{
$filename = explode('_',$file);
echo '<br />';
print_r($filename);
echo '<br />';
//if(isset($filename[1]))
//{
$newFileName = null;
$i = 0;
foreach($filename as $key => $value)
{
$newFileName .= ucfirst($value);
}

echo $newFileName.'<br />';
$oldPath = $path.$file;
$newPath = $path.$newFileName;
rename($oldPath,$newPath);
//}
}

}
closedir($dir_handle)
?>

Sekiranya, sistem anda melibatkan log masuk, maka perubahan perlu dilakukan pada method login. Boleh rujuk book.cakephp.org berkaitan perkara itu.

Kadangkala, kita sering membuat custom helper, dimana custom helper ini pula, akan memanggil Helper standard yang ada didalam Cakephp.

Oleh itu anda boleh melakukan sebegini,


App::import('Helper','Javascript');
App::import('Helper','Form');
App::uses('View','View');

$this->Js = new JavaScriptHelper(new View(null),$options);
$this->Form = new FormHelper(new View(null),$options);

Ini kerana parameter pertama adalah merujuk kepada View. Ini merupakan perubahan yang dilakukan di Cakephp 2.

Selamat mencuba dan memeningkan kepala! 😀

Perbezaan =, == dan ===

Catatan untuk diri. Perbezaan antara = , == dan ===.

= digunakan untuk mengumpukkan nilai. Contoh :


<?php

$nilai = 10;

?>

== digunakan untuk perbandingan nilai tanpa melibat jenis data yang dibandingkan. Sebagai contoh :


<?php

$nilai = "10";
if ($nilai == 10)
echo 'Sama';
else
echo 'Tidak';

// akan memberikan paparan Sama

?>

=== pula digunakan untuk perbandingan nilai dengan melibatkan jenis data yang dibandingkan.


<?php

$nilai = '10';

if ($nilai === 10)
echo 'Sama';
else
echo 'Tidak';

// akan memberikan paparan Tidak

?>

Jika kita membandingkan $nilai seperti ini, ianyakan akan memberikan jawapan yang berlainan.


$nilai = '10';

if($nilai === (string)10)
echo 'Sama';
else
echo 'Tidak';

//paparan adalah Sama

Apa yang berlaku ialah kita telah mengatakan nilai 10 adalah jenis string. apa yang ada didalam $nilai adalah string. Bila kita menggunakan === ianya membandingkan jenis data dan nilai yang dipegang adalah sama.

Selamat bermain dengan =, == dan juga ===

p/s :: kalau salah tolong betulkan.