Pages

Showing posts with label PHP. Show all posts
Showing posts with label PHP. Show all posts

Friday, March 30, 2018

PHP và UTF-8

Hiện PHP chưa (thật sự) hỗ trợ Unicode ở tầng thấp, do đó, để hiển thị được chuỗi UTF-8, bắt buộc phải có thêm các thao tác xử lý bổ sung, trên web, HTML, SQL.

Bài này mình tóm lược lại về UTF8 và PHP.

UTF-8 ở chính ngôn ngữ PHP

Giả sử ta có character a, á, ư. Thử nghiệm với hai cặp hàm strlen()/mb_strlen() và strpos()/mb_strpos().

Kết quả với hàm tính lượng bytes có kết quả tương ứng như sau:

echo strlen('a'); //1
echo mb_strlen('a'); //1
echo strlen('á'); //2
echo mb_strlen('á'); //1

Ở đây có thể tạm kết luận, với các string multi-bytes (chẳng hạn theo chuẩn Unicode như tiếng Việt),  số lượng bytes sẽ khác nhau giữa hàm strlen() và mb_strlen().
 
Kết quả với hàm tìm character có trong string:

echo strpos("mana", "a"); //1
echo strpos("mán", "á"); //1
echo mb_strpos("mana", "a"); //1

echo strpos("mưán", "á"); //3
echo mb_strpos("mưán", "á"); //2


echo strpos("mán ư", "ư"); //5
echo mb_strpos("mán ư", "ư"); //4

Hàm tìm character cũng vậy, có sự khác biệt rất lớn giữa hàm strpos() và mb_strpos().

Như vậy ta buộc phải dùng các hàm có dạng mb_* khi xử lý string Unicode, đây là các hàm chuyên trị cho Unicode. Tuy nhiên, không phải hàm xử lý chuỗi nào cũng có hàm mb_ tương ứng.

Bạn có thể thiết lập mb_internal_encoding() ở đầu mỗi file PHP và hàm mb_http_output() ngay ở vị trí PHP xuất ra dữ liệu ngoài trình duyệt.

Ngoài ra, nhiều hàm PHP xử lý string có thể có thêm tham số xác định dạng mã hóa. Chẳng hạn như  htmlentities().

UTF-8 ở trên hệ điều hành

Hiện nay PHP có thể chạy ở hầu hết các hệ điều hành, gồm cả Linux và Windows. Nhưng cách PHP xử lý tên file ở mỗi hệ điều hành là có thể khác nhau, trong đó, hỗ trợ Linux tốt nhất. Chẳng hạn trên Windows, nếu dùng PHP tạo một file với mã non-ASCII, lỗi có thể xuất hiện. Trên Linux và OSX, bạn có thể mã hóa tên file dạng UTF-8, nhưng trên Windows, buộc phải dùng chuẩn ISO-8859-1.

UTF-8 khi mần ăn với MySQ 

Lưu ý 1: Để chắc chắn là chuỗi trên PHP sang MYSQL lưu ở định dạng UTF-8, hãy thiết lập character và collation là utf8bm4 (theo kinh nghiệm của mình có khả năng hiển thị các kí tự "lạ" nhiều hơn UTF8 thông thường, chẳng hạn có lần mình làm về phiên âm tiếng Anh thì chỉ khi thiết lập utf8bm4, hệ thống mới hiển thị được).

Lưu ý 2: Phải thiết lập trong kết nối với mysql khi viết bằng PHP. Giờ thì chắc là toàn dân xài PDO nên mình có thể thiết lập như sau:


$db
= new PDO('dblib:host=your_hostname;dbname=your_db;charset=UTF-8', $user, $pass);


Với PHP 5.3.6, tùy chọn charset chưa có nên có thể thực hiện theo tùy chọn sau:


$pdo = new PDO(
    'mysql:host=hostname;dbname=defaultDbName',
    'username',
    'password',
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")
);

Với mysqli, ta buộc phải thiết lập như sau:

$conn = mysqli_connect('localhost','db_username','password','your_database_name');
 mysqli_set_charset($conn,"utf8"); 

UTF-8 trên trình duyệt

Để chắc chắn là PHP sẽ xuất UTF-8, có thể dùng hàm mb_http_output(). Trên trình duyệt thì ta thường thiết lập  tùy chọn meta charset như sau, đặt trong thẻ <head>
  <meta charset="utf-8">

https://phpbestpractices.org/#utf-8

https://stackoverflow.com/questions/4475548/pdo-mysql-and-broken-utf-8-encoding

Tuesday, March 27, 2018

PHP - Tìm 2 elements giống nhau trong mảng

Hôm ni đọc một câu hỏi phỏng vấn, khá dzui. Tìm 2 elements giống nhau trong một array.
Giả sử ta có mảng (array) sau:

$mang = array(1, 4, 5, 3, 5, 7, 4);


Phân tích, nhìn thì thấy có 2 elements là 4 và 5 là trùng nhau.

Vậy ta cần duyệt qua mảng và đối chiếu từng yếu tốt/thành phần trong mảng.

Để duyệt mảng tuần tự ta dùng for, mảng bất tuần tự (key chứa string), ta dùng foreach.

Đầu tiên ta đếm xem có bao nhiêu thành phần trong mảng: $b = count($mang); //trả về 7

Giả sử cần tìm số lớn nhất thì đây: echo "số lớn nhất trong mảng: ".max($mang)."<br>";

Giờ ta duyệt qua mảng như sau:


for ($i=0; $i < $b; $i++) { 

    for ($j = $i+1; $j < $b; $j++) {

            if($mang[$i]==$mang[$j]){

            echo "số trùng là:".$mang[$i]."<br>";
            }       
    }

}   

Lưu ý là ta cần duyệt 2 lần, một lần cho thành phần trong mảng và lần còn lại cho các thành phần khác. Lưu ý $j = $i + 1;

Code trên trả về 4 và 5.

Trong khi đó, so sánh giữa 2 mảng dùng array_intesect(), như code sau:

$a1=array("a"=>"red","b"=>"green","c"=>"blue","d"=>"yellow");

$a2=array("e"=>"red","f"=>"green","g"=>"blue"); $result=array_intersect($a1,$a2);

print_r($result); //Array ( [a] => red [b] => green [c] => blue )

Sunday, March 25, 2018

Cặp đôi check key và value của array trong PHP

1) key_exists(), hoặc array_key_exists()

$array = array(
    'php' => '3',
    'java' => '4',
    'css' => '7',
    'html' => '6',
    );
if (key_exists('php1', $array)) {
    echo 'ton tai';
}else{
    echo 'khong ton tai<br>';
}


Kết quả: "khong ton tai", vì key "php1" không có trong array.

2) in_array()

if(in_array('4', $array)){

  echo "co trong value";
}else{
  echo "Khong co trong value";

}


Kết quả: "co trong value";

Noted: Cả hai đều trả về dạng BOOLEAN, TRUE or FALSE. Trong một diễn biến khác thì hàm key_exists() chính là anh em ruột của array_key_exists()

Tuesday, March 20, 2018

Hiển thị PHP mà không thực thi file PHP

Cách 1:


Cách 2: Dùng thư viện này, tô màu luôn: http://qbnz.com/highlighter/geshi-doc.html#installing-geshi

Friday, February 9, 2018

Thao tác với file bằng PHP


Ví dụ về file đang áp dụng tại tudien.net https://gist.github.com/yeungon/2c5fdc8cca9e2d6a583543ca6ec1fd7a


Bài giảng của ông thầy.


Thursday, February 8, 2018

Dấu ngoặc đơn và ngoặc kép trong PHP

Noted: hai dấu này đều bao chứa chuỗi (string), nhưng

+ Dấu ngoặc đơn được cho là xử lý nhanh hơn dấu ngoặc kép.
+ Nhưng chỉ có dấu ngoặc kép mới cho phép hiển thị dạng nội suy của biến, ví dụ

$_variable = 'world';

echo "Hello $_variable";

Hệ thống mới xử lý. Otherwise, dùng dấu ngoặc đơn thì heo ăn.

Lỗi PHP mkdir (): Permission denied problem - không thể tạo được thư mục trên CentOS 7

Mình làm đang một ứng dụng từ điển tiếng Anh hình ảnh bằng Laravel và một trong số các task của ứng dụng là tạo thư mục mới bằng function mkdir() trên PHP, tuy nhiên, hệ thống báo không thể tạo được thư mục cho thiết lập, cho dù mình thiết lập 0775 cho thư mục cha.

Hệ thống mình đang dùng là VPS, Apache, Vestacp chạy Centos 7. 

Dạo quanh phố phường thì để giải quyết, cần lưu ý là hệ thống quản lý SELinux trên Centos/Redhat làm việc hết sức chặt chẽ. Vậy, phải thiết lập để người dùng hiện tại được quyền xử lý và sau đó thiết lập cho thư mục cụ thể. 

 Dưới đây là hướng dẫn mình tìm được, chỉ cần chạy hai dòng lệnh cuối cùng là xong. 


  •  Ownership sudo chown apache: apache -R /data/www/html/sites/mysite cd /data/www/html/sites/mysite 
  • # File permissions, recursive find . -type f -exec chmod 0644 {} \; 
  • # Dir permissions, recursive find . -type d -exec chmod 0755 {} \; 
  • # SELinux serve files off Apache, resursive sudo chcon -t httpd_sys_content_t /data/www/html/sites/mysite -R 
  • # Allow write only to specific dirs
sudo chcon -t httpd_sys_rw_content_t /data/www/html/sites/mysite/logs -R 
 
sudo chcon -t httpd_sys_rw_content_t /data/www/html/sites/mysite/uploads -R 


Noted: httpd_sys_content_t – for allowing Apache to serve these contents 

httpd_sys_rw_content_t – for allowing Apache to write to those path. 

Nguồn: https://blog.lysender.com/2015/07/centos-7-selinux-php-apache-cannot-writeaccess-file-no-matter-what/ 

 Tham khảo thêm: https://stackoverflow.com/questions/5246114/php-mkdir-permission-denied-problem/21685655#21685655

Tuesday, November 21, 2017

Hàm str_replace();

Không phát minh lại cái bánh xe, tức là xài cái tools có sẵn, ví dụ hàm str_replace() dưới đây.

Ví dụ:

$subject = "Củ chuối chấm muối";
$search ="muối";
$replace ="xì dầu";

$result = str_replace($search, $replace, $subject);

echo ra "Củ chuối chấm xì dầu".

PS: Vì hôm nay coi một video dùng hàm này khá hay thay da đổi thiệt cho dữ liệu đưa vào, nên tìm hiểu kĩ lại.

Saturday, November 11, 2017

GUI for PHP

Noted for building GUI tools with PHP language.

More detailed at https://www.exeoutput.com/php-exe.

Alternative http://www.zzee.com/phpexe/

New finding: https://github.com/yeungon/php-gui

Wednesday, October 25, 2017

Cài Laravel trên shared hosting, the case of stablehost

1. Chưa mua SSH để cài composer với hầm bà lằng

2. Thử dùng script cài tự động provided by cpanel with GUI interface, quite convenient I suppose.

3. Ví dụ stablehost trong trường hợp này, script sẽ tự động cài vào trong thư mục public_html.

4. Laravel không có file index sẵn ngang hàng với thư mục root, chỉ có thư mục public chứa các tập tin tĩnh và các tập tin màu mè cho hệ thống như CSS hay Js.

5. Dùng đoạn script nhỏ sau, tùy chỉnh .htaccess thôi, đưa vào thư mục ngang hàng root.

    RewriteEngine On
    RewriteRule ^$ public/index.php [L]
  
 #RewriteRule ^((?!public/).*)$ public/$1 [L,NC] (không cần)

(Lưu ý nhét trong thẻ IfModule)

6. Xóa file index.php mặc định do script tạo ra trên thư mục root. Done. Có thể truy xuất trực tiếp mà không phải vô thư mục phụ đại loại domain.com/public.

7. Shared hosting is cùi bắp, nhưng có cái hosting giá giảm sâu đang tạm làm demo.

8. Giờ là chuyện của symphony.

PS: Xem thêm hướng dẫn dài ngoằng làm kiểu khác tại đây: https://github.com/yeungon/laravel-deploy-on-shared-hosting/blob/master/README-vi.md, hoặc
https://laracasts.com/discuss/channels/general-discussion/where-do-you-set-public-directory-laravel-5