Tag Archive ตัวแปร

MySQL: ใช้ตัวแปร variable

การใช้ตัวแปรใน mysql จะช่วยให้เขียน sql query ได้สั้นและเข้าใจได้ง่ายขึ้น อย่างในกรณีที่นำค่าจากการคำนวณมาค่าหนึ่ง แล้วต้องนำไปใช้แสดงผลใน column อื่นๆ อีกครั้ง เช่น การนำผลที่ได้มาแสดงเป็นช่วงแบบตามขั้นบันได แบ่งช่วงวันที่ออกเป็นกลุ่มๆ หรือการตัดเกรด

สมมุติว่า ต้องตัดเกรดให้เด็กตามช่วงคะแนน โดย

accumulatedScore
คะแนนเก็บ เต็ม 100 คะแนนจะมีน้ำหนักเป็น 50%
midtermScore
คะแนนกลางภาค เต็ม 100 คะแนนจะมีน้ำหนักเป็น 20%
finalScore
คะแนนสอบปลายภาค เต็ม 100 คะแนนจะมีน้ำหนัก 30%
จะเขียนเป็น query ได้เป็น [code language=”sql” title=”calculate score query”]((accumulatedScore / 100) * 50) +
((midtermScore / 100) * 20) +
((finalScore / 100) * 30) AS score[/code]

เพื่อที่ทดลอง query ให้ตารางเก็บคะแนนขึ้นมาก่อนเช่น [code language=”sql” title=”schoolReport table”]– phpMyAdmin SQL Dump
— version 4.7.0
— https://www.phpmyadmin.net/

— Host: 127.0.0.1
— Generation Time: Oct 12, 2017 at 07:46 PM
— Server version: 10.1.25-MariaDB
— PHP Version: 7.1.7

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";


— Database: `snippets`

— ——————————————————–


— Table structure for table `schoolReport`

CREATE TABLE `schoolreport` (
`studen_id` int(11) NOT NULL,
`course_id` int(11) NOT NULL,
`accumulatedScore` int(11) NOT NULL,
`midtermScore` int(11) NOT NULL,
`finalScore` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


— Dumping data for table `schoolReport`

INSERT INTO `schoolReport` (`studen_id`, `course_id`, `accumulatedScore`, `midtermScore`, `finalScore`) VALUES
(1, 1, 55, 76, 74),
(1, 2, 74, 74, 74),
(1, 3, 43, 76, 75),
(1, 4, 47, 45, 57),
(1, 5, 71, 45, 72),
(2, 1, 45, 85, 74),
(2, 2, 65, 47, 47),
(2, 3, 56, 85, 20),
(2, 4, 37, 75, 42),
(2, 5, 65, 35, 74);


— Indexes for dumped tables


— Indexes for table `schoolReport`

ALTER TABLE `schoolReport`
ADD UNIQUE KEY `studen_id` (`studen_id`,`course_id`);
COMMIT;
[/code]

จากสูดรที่ดูไม่ซับซ้อนแต่เมื่อเราต้องเขียนคิวรี่ให้ตัดเกรดออกมาพร้อมๆกันมันจะกลายเป็น [code language=”sql” title=”query score”]SELECT
studen_id,
course_id,
accumulatedScore,
midtermScore,
finalScore,
((accumulatedScore / 100) * 50) +
((midtermScore / 100) * 20) +
((finalScore / 100) * 30) AS score,
CASE
WHEN
((accumulatedScore / 100) * 50) +
((midtermScore / 100) * 20) +
((finalScore / 100) * 30) < 50
THEN
‘F’
WHEN
((accumulatedScore / 100) * 50) +
((midtermScore / 100) * 20) +
((finalScore / 100) * 30) <= 60
THEN
‘D’
WHEN
((accumulatedScore / 100) * 50) +
((midtermScore / 100) * 20) +
((finalScore / 100) * 30) <= 70
THEN
‘C’
WHEN
((accumulatedScore / 100) * 50) +
((midtermScore / 100) * 20) +
((finalScore / 100) * 30) <= 80
THEN
‘B’
else
‘A’
END
AS grade
FROM
schoolReport[/code] จะเกิดอะไรขึ้นถ้าเขียน sql ผิดไปนิดเดียว อาจจะลืมพิมพ์ [code language=”sql” title=”query calculate grade”] WHEN
((accumulatedScore / 100) * 50) +
((midtermScore / 100) * 20) +
((midtermScore / 100) * 30) <= 70
THEN
‘C'[/code] เห็นมั๋ย? แค่ใช้คะแนน midtermScore 2 ครั้ง ไปตอนตัดเกรดซักเกรดเอง

ถ้าเปลี่ยนไปใช้ query แบบใช้ตัวแปร[code language=”sql” title=”mysql variable query”]SELECT
studen_id,
course_id,
accumulatedScore,
midtermScore,
finalScore,
@score := ((accumulatedScore / 100) * 50) +
((midtermScore / 100) * 20) +
((finalScore / 100) * 30) AS score,
CASE
WHEN
@score < 50
THEN
‘F’
WHEN
@score <= 60
THEN
‘D’
WHEN
@score <= 70
THEN
‘C’
WHEN
@score <= 80
THEN
‘B’
else
‘A’
END
AS grade
FROM
schoolReport[/code] ดูเข้าใจง่ายขึ้นเยอะ โอกาสพลาดก็น้อยลง เขียนผิดก็ตัดเกรดผิดทุกเกรด (เห็นง่ายกว่า) แก้สูตรก็แก้จุดเดียว ชีวิตง่ายขึ้นเยอะ ^_^

สรุปการสร้างตัวแปร @ชื่อตัวแปร := (เขียน : ติดกับ = เสมอ) สูตร เพื่อความสวยงาม และใช้ง่ายอย่าลืมใส่ AS alias name ให้ด้วย

PHP: ดูการทำงานสร้าง flowchart (backtrace)

ถ้าเรียนเขียน program มาคงจะคุ้นเคยกับ flowchart การทำงานของของโปรแกรม แต่ในชีวิตการทำงานจริงๆ โดยเฉพาะถ้าเขียน code โดยใช้ framework ต่างๆ จะไม่เป็นเหมือนที่ได้ออกแบบไว้เสมอไป เพราะว่าบางครั้งโปรแกรมจะทำงานให้เราเองโดยที่ไม่ได้สั่ง สาเหตุคือ มีการเรียกใช้ hook หรือ tricker ทำให้เกิด process ที่อาจจะไม่ทราบที่มา หรือต้องมาแก้งานของคนอื่นโดนที่ไม่มีเอกสารให้

นอกจากการใช้วิธี PHP: list included หรือ required ไฟล์ที่ใช้ ถ้าเราใช้ตัว framework ต่างๆ มักจะมีการเตรียม function ในการสร้าง backtrace ไว้ให้ แต่ถ้าไม่มีหรือเป็น code ที่เขียนด้วยตัวเอง ยังสามารถใช้ debug_backtrace ในการค้นหาที่มาที่ไปได้เช่น[code language=”php” title=”debug.debug_backtrace.php”]<?php

function getBacktrace()
{
$backtrace = debug_backtrace();
echo ‘<pre>’, print_r($backtrace, true), ‘</pre>’;
fwrite(fopen(‘logs_debug_backtrace.txt’, ‘a+’), "\n\n" . __FILE__ . ‘ :’ . __LINE__ . "\n\n" . print_r($backtrace, true));
}

function getPhpInfo($what)
{
phpinfo($what);

/* จะดูว่า ทำไม่ getPhpInfo ถึงทำงาน */
getBacktrace();
}

function index()
{
getPhpInfo(INFO_ENVIRONMENT);
}

index();[/code]เมื่อทดสอบดูจะได้ผลลัพธ์[code language=”text” title=”logs_debug_backtrace.txt”]Array
(
[0] => Array
(
[file] => D:\xampp\htdocs\snippets\PHP\debug.debug_backtrace.php
[line] => 13
[function] => getBacktrace
[args] => Array
(
)

)

[1] => Array
(
[file] => D:\xampp\htdocs\snippets\PHP\debug.debug_backtrace.php
[line] => 18
[function] => getPhpInfo
[args] => Array
(
[0] => 16
)

)

[2] => Array
(
[file] => D:\xampp\htdocs\snippets\PHP\debug.debug_backtrace.php
[line] => 21
[function] => index
[args] => Array
(
)

)

)[/code]เพราะว่าเราเขียน function debug_backtrace() ไว้ใน function getBacktrace() อีกชั้น เพื่อที่ความง่ายในการค้นหา flow เมื่อต้องการดูว่า function หรือ class ที่เราสนใจมันมี flow มายังไงก็แค่ไปเรียกใน function ที่สงสัย เราก็จะได้ลำดับการทำงานย้อนกลับไป เราจะได้ทราบทั้งฟังก์ชั้น คลาส บรรทัด ไฟล์ แม้แต่ตัวแปรที่ส่งเข้าไปใน function นั้นๆ

CodeIgniter: แยก config

การดึงค่าคอนฟิกของโค้ทอินิกเตอร์สามารถทำได้โดย ใช้คำสั่ง[code language=”php”]$this->config->item(‘ ตัวแปร ‘);[/code] โดยจะดึงมาจากไฟล์ \application\config\config.php เป็นหลัก แต่ถ้าต้องการแยก config ออกมาเป็นส่วนๆ เพื่อความง่ายในการจัดการ สามารถสร้างไฟล์ ขึ้นมาใน application\config ได้[code language=”php” title=”\application\config\caching.php”]<?php
defined(‘BASEPATH’) OR exit(‘No direct script access allowed’);

$config[‘caching’][‘adapter’] = ‘memcached’;
$config[‘caching’][‘backup’] = ‘file’;[/code]

จากนั้นเราจะอ่าน configuration เข้ามาในระบบของเราสามารถทำได้ 2 วิธีคือ

  1. เป็นค่าที่เราต้องใช้บ่อยๆแทบทุกหน้า เพิ่มเข้าไปใน Auto-loading เปิดไฟล์ \application\config\autoload.php เพิ่มชื่อไฟล์ลงไปใน[code language=”php” title=”\application\config\autoload.php”]$autoload[‘config’][/code]เช่น[code language=”php” title=”\application\config\autoload.php”]…
    $autoload[‘config’] = [‘caching’];
    …[/code]
  2. ถ้าต้องการใช้เฉพาะบางไฟล์ ทำได้โดยการ load ใน controller ที่ต้องการโดยใช้คำสั่ง[code language=”php”]

    $this->config->load(‘caching’);
    …[/code]

ผมใช้หน้าแรกแสดงตัวอย่างการใช้[code language=”php” title=”\application\controllers\Welcome.php”]<?php
defined(‘BASEPATH’) or exit(‘No direct script access allowed’);

class Welcome extends CI_Controller
{
public function __construct()
{
parent::__construct();

echo ‘charset = ‘ . $this->config->item(‘charset’);

//$this->config->load(‘caching’);

echo ‘<pre>’, print_r($this->config->item(‘caching’), true), ‘</pre>’;
}
…[/code]

อ่านเพิ่มเติม

แปลงชนิดตัวแปรใน PHP

PHP เป็นภาษาที่ยืดหยุ่นเรื่องตัวแปรมาก เราใช้ตัวแปรได้โดยไม่ต้องประกาศก่อน และประกาศตัวแปรได้โดยไม่ระบุประกาศชนิดของตัวแปร (variable’s type) ทำให้เขียนได้สะดวก เพราะ PHP จะเลือกชนิดของตัวแปรให้อัตโนมัติ แต่บางครั้งก็ก่อให้เกิดปัญหา เช่น สับสนระหว่าง ค่า 1 หรือ true บางครั้งอาจจะใช้วิธี คูณ หรือ บวกบังคับให้เป็นตัวเลข ความจริง PHPสามารถเปลี่ยนชนิดตัวแปรได้โดยการ casting ตัวแปร (PHP เรียกว่า Type Juggling) ทำโดยการระบุชนิดตัวแปรไปข้างหน้า เช่น[sourcecode language=”php”]<?php
$foo = 10; // $foo เป็น integer
$bar = (boolean) $foo; // $bar เป็น boolean
?>[/sourcecode]

คำสั่ง ชนิดตัวแปร
(int), (integer) integer
(bool), (boolean) boolean
(float), (double), (real) float
(string) string
(array) array
(object) object
(unset) NULL