PHP 中常用的內建函式與變數

懶人包。

列表

phpinfo() 打開後瀏覽器後會顯示 PHP 版本資訊:

1
phpinfo()

$conn->insert_id 取得上一筆 auto_increment 產生的 id 值

1
2
3
4
5
6
7
$name = 'PeaNu';
$sql = "INSERT INTO users(name) VALUES(?)";
$stmt = $conn->prepare($sql);
$stmt->bind_param('s', $name);
$stmt->execute();
// 這邊會自動去抓上一筆 auto_increment 產生的 id 值
echo '上一筆新增的 id 值為' . $conn->insert_id;

var_dump(variable) 可以查看比較複雜的資料結構,或者是 function 的回傳值。

查看 Array 的值:

1
2
3
4
5
6
7
8
9
<?php
$arrayLike =
array(
'name' => 'PeaNu',
'age' => 20,
'isMarry' => true
);
var_dump($arrayLike);
?>

Output:

1
array(3) { ["name"]=> string(5) "PeaNu" ["age"]=> int(20) ["isMarry"]=> bool(true) }

查看 isset() 的回傳值:

1
2
3
4
<?php
$test;
var_dump(isset($test)); // bool(false)
?>

isset(variable) 如果變數沒有值或值是 null 就回傳 true,不然回傳 false。

備註:這個判斷機制跟 JS 不太一樣,空字串不是 null 所以會回傳 true 不是 false。

1
2
3
4
5
6
7
8
9
<?php
$test1 = null;
$test2 = '';
$test3;

var_dump(isset($test1)); // bool(false)
var_dump(isset($test2)); // bool(true)
var_dump(isset($test3)); // bool(false)
?>

empty(expression) 檢查是不是空值(Null、空字串、0):

1
2
3
4
5
6
7
<?php
var_dump(empty('')); // bool(true)
var_dump(empty('123')); // bool(false)
var_dump(empty(null)); // bool(true)
var_dump(empty(1+1)); // bool(false)
var_dump(empty(0)); // bool(true)
?>

print_f(variable) 可以看變數的值,比 var_dump 簡潔一點:

1
2
3
4
<?php
$likeObject = array('name' => 'PeaNu', 'age' => 20);
print_r($likeObject);
?>
1
Array ( [name] => PeaNu [age] => 20 )

exit('...') die('...') 輸出訊息後退出(跟 return 很類似):

1
2
3
4
5
6
7
8
9
10
<?php
if ($_GET['username'] && $_GET['age']) {
echo 'Hello ' . $_GET['username'] . '<br>';
echo 'Your age is ' . $_GET['age'] . '<br>';
// 改成 die() 也可以
exit('this is the end.');
}

echo '資料有缺,請重新輸入。' . '<br>';
?>

gettype(data) 查看資料型態

1
2
3
4
5
6
<?php
echo gettype(0); // integer
echo gettype(null); // NULL
echo gettype(true); // boolean
echo gettype('yoyoyo'); // string
?>

sprintf() 格式化字串,可以想成是 template string 的概念。

1
2
3
$format = 'PeaNu has %d dollars and "%s" .';
echo sprintf($format, 100, 'MUCH MORE');
// PeaNu has 100 dollars and "MUCH MORE" .

header() 設定 resonse header 的值

1
2
// 代表重新導向到 index.php 的位置
header('Location: index.php');

http_response_code() 設定 HTTP status code:

1
2
// 回傳 422
http_response_code(422);

require_once('file.php') 把檔案引入,已經有引入過的話就不會重複引入

1
require_once('index.php');

time() 取得從 1970 到現在的時間(秒數)

1
time() // 1644216655

setcookie($key, $value, $expire) 設定 cookie 內容

1
2
3
// 30 days
$expire = time() + 3600 * 24 * 30;
setcookie('username', 'PeaNu', $expire);

date($formate) 格式化輸出日期

格式表:date_format

1
echo date('Y-m-d-H-i-s');  // 2022-02-07-07-56-58

getrandmax() 取得 rand 能產生的最大值

1
echo getrandmax(); // 2147483647

rand($min, $max) 產生亂數,可指定範圍。沒有指定的話就會從 0 ~ 2147483647:

1
echo rand(10, 15); // [10 ~ 15](閉區間)

chr($ascii) 根據 ascii 碼來輸出字串

1
2
echo chr(65); // A
echo chr(65+25); // Z

ord($string) 回傳字串的 ascii 碼

1
2
echo ord('a'); // 97
echo ord('A'); // 65

password_hash($password, format) 內建的雜湊函式,前面填明碼,後面填雜湊的演算法:

1
2
3
4
<?php
echo password_hash('abcdefg', PASSWORD_DEFAULT);
// $2y$10$ZBGKjZ4nxWWJRKgUcJ8X3.HdJOlAf0JvCK5R4G6M8KXZr52baItJO
?>

password_verify($password, hash) 用雜湊值檢查密碼是否正確:

1
2
3
4
5
6
7
8
9
10
<?php
var_dump(password_verify(
'abcdefg',
'$2y$10$ZBGKjZ4nxWWJRKgUcJ8X3.HdJOlAf0JvCK5R4G6M8KXZr52baItJO')
); // true
var_dump(password_verify(
'aaaabcdefg',
'$2y$10$ZBGKjZ4nxWWJRKgUcJ8X3.HdJOlAf0JvCK5R4G6M8KXZr52baItJO')
); // false
?>

htmlspecialchars($string, option) 把輸入的字串做跳脫

備註:要注意丟進去的資料都會被轉成「字串」回傳

1
2
3
4
5
6
7
8
/* 
option:
ENT_COMPAT: 預設,只轉換雙引號,不轉換單引號
ENT_QUOTES:雙引號與單引號都要轉換
ENT_NOQUOTES:單引號與雙引號都不轉換。
*/
echo htmlspecialchars('<script>alert("yoyoyo")</script>', ENT_QUOTES);
// <script>alert("yoyoyo")</script> (純文字)

strlen 回傳字串長度

1
echo strlen('some text'); // 9

strtolower 轉小寫

1
echo strtolower('ABC'); // abc

strtoupper 轉大寫

1
echo strtoupper('abc'); // ABC

str_contains($string, $search) 字串裡有沒有包含某段字(有分大小寫)

附註:這個是 PHP 8 推出的,所以要特別注意。替代方案可以參考 Stack overflow

1
2
var_dump(str_contains('abc', 'a')); // bool(true)
var_dump(str_contains('abc', 'A')); // bool(true)

str_replace($replace, $newString, $string) 替換字串

附註:跟 JS 不一樣,這會把所有符合的字都換掉

1
2
3
4
<?php
$str = 'yoyoyoyooooyoyyyo';
echo str_replace('y', 'Y' , $str); // YoYoYoYooooYoYYYo
?>

explode($separator) 跟 JS 的 split() 一樣,回傳值也是陣列。

1
2
3
4
$date = '2022-02-17 23:22:22';
$result = explode('-', $date);
// Array ( [0] => 2022 [1] => 02 [2] => 17 23:22:22 )
print_r($result);

intval($str) 把資料型態轉成數字

1
var_dump(intval('10')); // [int] => 10

或也可以像 JS 裡的 parseInt(string, base) 來決定用幾進位解析:

1
var_dump(intval('100', 2)); // int (4)

數學相關

floor($number) 無條件捨去

注意:回傳值是 float 不是 int

1
var_dump(floor(1.5)); // float(1)

ceil($number) 無條件進位

注意:回傳值是 float 不是 int

1
var_dump(ceil(1.3)); // float(2)

round($number) 四捨五入

注意:回傳值是 float 不是 int

1
2
var_dump(round(1.3)); // float(1)
var_dump(round(1.5)); // float(2)

陣列相關

array('key' => 'value') 建立 Array(或想成 Object)

1
2
3
4
5
6
<?php
// 很像 JS 的物件
$likeObject = array('name' => 'PeaNu', 'age' => 20);
// 熟悉的陣列
$array = array(1, 2, 3);
?>

sizeof(array) 查看 Array 的長度

1
2
3
4
<?php
$likeObject = array('name' => 'PeaNu', 'age' => 20);
var_dump(sizeof($likeObject)); // int(2)
?>

array_push($array, $value) 新增元素到最後面

1
2
3
4
$my_array = array(1, 2, 3, 4);
array_push($my_array, 5);
print_r($my_array);
// Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 )

裡面也可以 push 字串、陣列或物件的資料,就跟 JS 一樣。

array_unshift($array, $value) 新增元素到最前面

1
2
3
4
$my_array = array(1, 2, 3, 4);
array_unshift($my_array, 0);
// Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 [4] => 4 )
print_r($my_array);

array_pop($array) 刪除最後一個元素

1
2
3
4
$my_array = array(1, 2, 3, 4);
array_pop($my_array);
// Array ( [0] => 1 [1] => 2 [2] => 3 )
print_r($my_array);

array_shift($array) 刪除第一個元素

1
2
3
4
$my_array = array(1, 2, 3, 4);
array_shift($my_array);
// Array ( [0] => 2 [1] => 3 [2] => 4 )
print_r($my_array);

array_map($callback, $array) 跟 JS 的 Array.map() 一樣,不過要注意 PHP 不能像 JS 一樣把 function 當參數傳,所以寫法不太一樣:

1
2
3
4
5
6
7
8
9
// 先定義好 function
function callback($item) {
return $item * 2;
}
$my_array = array(1, 2, 3, 4);
// 用字串表示執行哪個 function
$result = array_map('callback', $my_array);
// Array ( [0] => 2 [1] => 4 [2] => 6 [3] => 8 )
print_r($result);

避免 SQL Injection 的方法

要改用 Prepared Statements 的方式來下 SQL:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// login.php
<?php
// 先準備好 sql,參數的部分改用 ? 這個 placeholder 來代替
$sql = "INSERT INTO comments(`nickname`, `content`) VALUES (?, ?)";
// 接著把 sql 指令丟到 prepare(),進入準備階段
$stmt = $conn->prepare($sql);
// 接著把值做綁定(綁定階段),'ss' 是代表兩個參數都是 string
$stmt->bind_param('ss', $nickname, $content);
// 到這邊才是真的執行 sql
$result = $stmt->execute();
// 如果要拿出欄位的資,記得加上這一句
$result = $stmt->get_result();
// 這樣這邊才拿的到
$row = $result->fetch_assoc();
?>

bind_param() 有四種型別:

  • i(integer)
  • d (double)
  • s(string)
  • b (Boolean)

內建變數

  • $_GET['id'] 取得 GET 的 id 值
  • $_POST['id'] 取得 POST 的 id 值
  • $_SESSION['username'] SESSION 中 username(讀取或設定)
  • $_SERVER['REQUEST_URI'] 取得路徑(Domain 下的路徑)
  • $_SERVER['HTTP_HOST'] 取得域名(主機名稱)
  • $_COOKIE['username'] 取得 COOKIE 中的 username
mentor-program-day50 MySQL 語法
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×