รวม Snippets

เกี่ยวกับการใช้ composer ตรวจสอบเวอร์ชั่น package ที่ถูกติดตั้ง

- กรณีเราต้องการติดตั้ง package ที่เคยใช้งานในโปรเจ็คใหม่ แต่จำไม่ได้ว่า ติดตั้งอะไรไปบ้าง
สามารถดูข้อมูลได้ที่ไฟล์ composer.json 
- ถ้าไม่พบไฟล์ composer.json แต่ยังมีไฟล์ composer.lock เราสามารถเรียกใช้คำสั่ง
 
composer install
 
เพื่อติดตั้ง package ทั้งหมดในไฟล์นั้นอีกครั้งได้
 
- กรณีที่ไม่มีทั้งไฟล์ composer.json และไฟล์ composer.lock แต่เรายังมีโฟลเดอร์ vendor
ที่เคยใช้งานอยู่ เราสามารถดูข้อมูล package และเวอร์ชั่นที่เคยติดตั้งได้ที่ ไฟล์ installed.json
 
vendor/composer/installed.json
 
ซึ่งจะเป็นข้อมูล package ในเวอร์ชั่น ที่ถูกติดตั้งในครั้งแรกเท่านั้น ดังนั้น หากมีการใช้งานคำสั่ง 
 
composer update
 
ก็จะไม่มีผลกับข้อมูลเวอร์ชั่นที่ติดตั้ง ในไฟล์ installed.json ก็จะยังไม่ใช่เวอร์ชั่นล่าสุดนั่นเอง



การใช้ container ใน docker เพื่อพัฒนา php web application

สมมติเราพัฒนาใน windows โครงสร้างประมาณนี้
 
C:\docker\server  // จัดการ container
C:\docker\mysql_data  // กับข้อมูลของฐานข้อมูล mysql
C:\docker\server\www  // สำหรับเก็บไฟล์ php

1. สร้างไฟล์ docker-compose.yml ใน



version: '3.7'

services:
  mysql:
  #  image: mysql:latest
    image: mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: examplepassword
      MYSQL_DATABASE: mydb
      MYSQL_USER: myuser
      MYSQL_PASSWORD: mypassword
      MYSQL_CHARSET: utf8mb4
      MYSQL_COLLATION: utf8mb4_unicode_ci       
    ports:
      - "3306:3306"
    volumes:
      - ../mysql_data:/var/lib/mysql

  php_apache:
    image: php:8.1-apache
  #  image: php
    restart: always
    ports:
      - "8080:80"
    volumes:
      - ./www:/var/www/html
    depends_on:
      - mysql

  phpmyadmin:
 #   image: phpmyadmin/phpmyadmin
    image: phpmyadmin
    restart: always
    ports:
      - "8081:80"
    environment:
      PMA_HOST: mysql
      MYSQL_ROOT_PASSWORD: examplepassword
    depends_on:
      - mysql

2. รันคำสั่ง ผ่าน command ใน path ส่วนจัดการ container

docker-compose up -d





3. ไฟล์ index.php สำหรับทดสอบ

<?php  
// สังเกตว่าตรง localhost เราจะต้องเปลี่ยนเป็นชื่อ container ฐานข้อมูล
// เนื่องจากในที่นี่กำหนดเป็นชื่อ mysql ในไฟล์ docker-compose.yml
$mysqli = new mysqli("mysql", "root","examplepassword","mydb");  
if ($mysqli->connect_errno) {  
    printf("Connect failed: %s\n", $mysqli->connect_error);  
    exit();  
}  
if(!$mysqli->set_charset("utf8")) {  
    printf("Error loading character set utf8: %s\n", $mysqli->error);  
    exit();  
}

phpinfo();

3. ถ้า mysqli ไม่ทำงานหรือ ᩴextension ของ php ตัวใดไม่ทำงาน ให้ไปที่ส่วนของ container ที่เป็น php apache ที่เราใช้งาน
จากนั้นเรียกใช้คำสั่ง 2 คำสั่งนี้ในส่วนของ command ดังตัวอย่างด้านล่าง

docker-php-ext-install mysqli
apachectl restart

รันคำสั่งพร้อมกัน ก็จะสามารถใช้งาน การเชื่อมต่อกับฐานข้อมูล




การค้นหาและแทนค่าข้อมูลในฐานข้อมูล mysql

UPDATE 
`table_name` SET 
`field_name` = REPLACE(`field_name`, "http://www.ninenik.com", "https://www.ninenik.com");



ใช้ htaccess กำหนดให้ลิ้งค์ไปยังหน้า maintenance

กรณีที่เรามีการปรับปรุงหรือเพิ่มประสิทธิภาพเว็บไซต์ และต้องไม่การให้
ผู้ใช้งานเข้าใช้งานได้ในช่วงระยะเวลาหนึ่ง เพื่อจะได้ทำการปรับปรุงเว็บไซต์
เราสามารถสร้างหน้าแจ้งการปรับปรุงเว็บไซต์ หรือที่เรียกว่า maintenance 
page ขึ้นมา จากนั้นใช้กำหนดใน ทุกๆ การเรียกใช้งานจะถึงลิ้งค์มายังแจ้ง
รายละเอียด การปรับปรุงเว็บไซต์ ซึ่งอาจจะแจ้งข้อมูลสำหรับติดต่อ กรณีมีความ
จำเป็นด่วนไว้ด้วยก็ได้ แนวทาง คือสร้างไฟล์เพจ หน้าแจ้งการปรับปรุงเว็บไซต์ จาก
นั้นใช้ htaccess กำหนดการลิ้งค์มาด้วยคำสั่งดังนี้
 
# MAINTENANCE-PAGE REDIRECT
<IfModule mod_rewrite.c>
 RewriteEngine on
 RewriteCond %{REMOTE_ADDR} !^123.456.789.000
 RewriteCond %{REMOTE_ADDR} !^123.456.789.000
 RewriteCond %{REMOTE_ADDR} !^123.456.789.000
 RewriteCond %{REQUEST_URI} !/maintenance.html$ [NC]
 RewriteCond %{REQUEST_URI} !.(jpe?g?|png|gif) [NC]
 RewriteRule .* /maintenance.html [R=302,L]
</IfModule>
 
กรณีที่เราต้องการยกเว้น หรือให้เฉพาะบางโฟลเดอร์สามารถยังใช้งานได้ ก็กำหนดส่วน
ที่ต้องการยกเว้นเข้าไป สมมติเช่น เรายังให้สามารถเข้าใช้งานหน้า /dashboard ได้
ก็จะเพิ่มเข้าไปเป็นดังนี้
 
# MAINTENANCE-PAGE REDIRECT
<IfModule mod_rewrite.c>
 RewriteEngine on
 RewriteCond %{REMOTE_ADDR} !^123.456.789.000
 RewriteCond %{REMOTE_ADDR} !^123.456.789.000
 RewriteCond %{REMOTE_ADDR} !^123.456.789.000
 RewriteCond %{REQUEST_URI} !^/dashboard [NC]
 RewriteCond %{REQUEST_URI} !/maintenance.html$ [NC]
 RewriteCond %{REQUEST_URI} !.(jpe?g?|png|gif) [NC]
 RewriteRule .* /maintenance.html [R=302,L]
</IfModule>



php ฟังก์ชั่น ตรวจสอบว่ามี url ในข้อความหรือไม่

ใช้สำหรับตรวจสอบว่าข้อความนั้นๆ มีลิ้งค์ url ทั้งที่แบบมี http https และรูปแบบอื่นๆ ในลักษณะการอ้างอิงถึงลิ้งค์ของเว็บไซต์ต่างๆ อยู่ในข้อความนั้นๆ หรือไม่ ถ้าคืนค่าเป็น 1 พรือ true แสดงว่ามี สามารถนำไปประยุกต์ในการสร้างเงื่อนไขการทำงานได้

<?php
function urldetect($str){
    $regex = "((https?|ftp)://)?"; // SCHEME
    $regex .= "([a-z0-9+!*(),;?&=\$_.-]+(:[a-z0-9+!*(),;?&=\$_.-]+)?@)?"; // User and Pass
    $regex .= "([a-z0-9\-\.]*)\.(([a-z]{2,4})|([0-9]{1,3}\.([0-9]{1,3})\.([0-9]{1,3})))"; // Host or IP address
    $regex .= "(:[0-9]{2,5})?"; // Port
    $regex .= "(/([a-z0-9+\$_%-]\.?)+)*/?"; // Path
    $regex .= "(\?[a-z+&\$_.-][a-z0-9;:@&%=+/\$_.-]*)?"; // GET Query
    $regex .= "(#[a-z_.-][a-z0-9+$%_.-]*)?"; // Anchor
	return preg_match("~^$regex$~i", $str, $m);
}
// สมมติมีการส่งค่ามาผ่าน url มาแล้วเราต้องการตรวจสอบว่ามีลิ้งค์ หรือ url หรือไม่
if(urldetect($_GET['keyword'])){
	header("Location:notfound.html");
	exit;
}
?>



คำสั่ง JavaScript ดึงรูปจาก Facebook Album

แนวทางการใช้งาน จะใช้ผ่าน console ของ dev tool 
โดยเปิดไปหน้ารูปรวมของ album ที่ต้องการ จากนั้น เลื่อน scrollbar เพื่อแสดง
รายการรูปทั้งหมด

var urlStr = ""; // ตัวแปรเก็บ url รายการลิ้งค์ของรูป
var n_i = document.querySelectorAll("a[href*='photo.php']").length; // จำนวนรูปจากการนับ
var n_i  = 5; // จำนวนรูปจากการกำหนด
var n_v = 0; // ตำแหน่งเริ่มของรูป
function getImg(n_v){
    if(n_v<n_i){
        document.querySelectorAll("a[href*='photo.php']")[n_v].click();
        setTimeout(function(){
            if(document.querySelectorAll("img[data-visualcompletion='media-vc-image']").length>0){
				urlStr += '<img src="';
				urlStr += document.querySelectorAll("img[data-visualcompletion='media-vc-image']")[0].src;
				urlStr += '">';
				urlStr += '\r\n';
				document.querySelectorAll("div[aria-label='Close']")[0].click();
			}
			n_v++;
			setTimeout(function(){
					getImg(n_v);          			
			},500); 	
        },1000);
    }else{
        console.log(urlStr);
    }
}
getImg(n_v);


หลังจากได้รายการรูป นำไปสร้าง HTML แท็ก image จากนั้นใช้โปรแกรมโหลดจาก url รูป



เข้ารหัส HTML สำหรับส่งค่าใน URL ด้วย PHP และ JavaScript

แนวทางทั้งสอง ใช้สำหรับเข้ารหัสหรือจัดรูปแบบของ HTML ให้สามารถ
ส่งค่าผ่าน url ไปใช้งานได้
 
PHP
 
urlencode(htmlentities("<strong>Title</strong>etc etc"));
 
JavaScript
 
function htmlentity(rawStr){
	return encodeURIComponent(rawStr.replace(/[\u00A0-\u9999<>\&]/gim, function(i) {
	   return '&#'+i.charCodeAt(0)+';';
	}));
}
htmlentity("<strong>Title</strong>etc etc");



แนวทาง คำสั่ง SQL เรียงข้อมูลภาษาไทย และภาษาอังกฤษในฟิลด์เดียวกัน

ตารางข้อมูลตัวอย่าง

CREATE TABLE tbl
    (`id` int, `data` varchar(9))
;
     
INSERT INTO tbl
    (`id`, `data`)
VALUES
    (1, 'ภาษาไทย'),
    (2, 'English'),
    (3, 'การศึกษา'),
    (4, 'Education')
;


คำสั่ง SQL

(SELECT
a.data,'th' lang
FROM tbl a 
WHERE NOT a.data REGEXP '[A-Za-z0-9]'
)
UNION ALL
(SELECT
b.data,'en' lang
FROM tbl b 
WHERE b.data REGEXP '[A-Za-z0-9]'
)
ORDER BY lang DESC,CONVERT(data using tis620) ASC


ผลลัพธ์



ใช้ htaccess แทนไฟล์รูปภาพที่ไม่พบ หรือไม่มี ด้วยภาพอื่น

วิธีนี้ใช้สำหรับกรณีเราไม่ต้องการเขียนโค้ด หากไม่พบไฟล์รูปที่จะแสดง ให้เอารูปอื่นมาแสดงแทน
ให้เราสร้างรูปสำหรับไว้แทนที่ไว้ที่ path ใดสักที่สมมติเช่นเป็น images และรูปที่เราเก็บอยู่ในโฟลเดอร์
uploads ให้เราสร้างไฟล์ .htaccess แล้วอัพไปไว้ที่โฟลเดอร์รูปหลัก ในที่นี้คือ uploads
แล้วกำหนดไฟล์ ดังนี้
 
    ไฟล์ .htaccess
 
RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteRule \.(gif|jpe?g|png|bmp) /images/photoreplace.jpg [NC,L]
 
สมมติถ้าเรียกไปที่ไฟล์รูปที่ไม่มี เช่น https://www.example.com/uploads/notpic.jpg
รูปจะไปดึงจากไฟล์ https://www.example.com/images/photoreplace.jpg มาแสดงแทน















เว็บไซต์ของเราให้บริการเนื้อหาบทความสำหรับนักพัฒนา โดยพึ่งพารายได้เล็กน้อยจากการแสดงโฆษณา โปรดสนับสนุนเว็บไซต์ของเราด้วยการปิดการใช้งานตัวปิดกั้นโฆษณา (Disable Ads Blocker) ขอบคุณครับ