Php Note

Php 个人速查笔记。

基础

字符串长度

strlen($string)

数组长度

count($arr)

日期

获取当前时间

$d1 = new DateTime();

获取指定时间

$d2 = new DateTime('2021-01-01');

正则匹配

preg_match("/^[A-Za-z]+$/", $Lastname)
// boolean

获取时间差

$diff = $d2->diff($d1);
// 年份差
echo $diff->y;

循环

foreach ($posts as $key=>$value) {
    // todo
}

EOT

<?php foreach ($csv as $i => $value) {
    $dateToDisplay = date('F d, Y', $value[0]);
    echo <<<EOT
  <div class="post-preview">
    <a href="post.php?author=$value[2]&date=$value[0]&image=$value[1]&content=$value[3]&comment=$value[4]">
      <h2 class="post-title">
        <img class="Post1" src="./files/$value[1]" alt="farm" height="380px" width="720px">
      </h2>
      <h3 class="post-subtitle">$value[5]</h3>
    </a>
    <p class="post-meta">Posted by
      <a href="about.php">$value[2]</a>
      on $dateToDisplay
    </p>
  </div>
  <hr>
EOT;
} ?>

获取请求方法

$request = $_SERVER['REQUEST_METHOD'];
// POST or GET or anything else

输入过滤

单条

$id  = filter_input(INPUT_POST, 'id', FILTER_SANITIZE_FULL_SPECIAL_CHARS);

一次性

$_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);

发请求

$json_url = 'https://data.winnipeg.ca/resource/tx3d-pfxq.json';
$json = file_get_contents($json_url);
$list = json_decode($json, true);

JSON

解码

$json = json_decode(file_get_contents("./member.json"), true);
$points = $json['points']

编码

$json = json_encode($array);
echo $json;

MySQLi

连接

session_start();

$host = 'localhost';
$user = 'root';
$password = '';
$db = 'database';

// connect to mysql database
$conn = new mysqli($host, $user, $password, $db);
if ($conn->connect_error) {
    // connection error
    die($conn->connect_error);
}

建表

$sql = "CREATE TABLE IF NOT EXISTS tablename (
ID INT AUTO_INCREMENT PRIMARY KEY,
Name varchar(100) NOT NULL,
RefID int,
FOREIGN KEY (RefID) REFERENCES Ref (ID)
)";

if ($conn->query($sql) !== TRUE) {
    die("Error creating table: " . $conn->error);
}

插入

$stmt = $conn->prepare("insert into table (email, date) VALUE (?,?)");
$stmt->bind_param("ss", $_SESSION['user'], $_POST['date']);
if (!$stmt->execute()) {
  die($conn->error);
} else {
  echo "inserted, id is " . $stmt->insert_id;
}

更新

$query = $conn->prepare("update User set profile = ?, photo = ? where id = ?");
$query->bind_param('ssi', $_POST['profile'], $photo, $_SESSION['user'][0]);
$query->execute();

查询 (单条)

$query = $conn->prepare("SELECT * FROM user where email=? and password=?");
$query->bind_param('ss', $email, $password);
$query->execute();
$result = $query->get_result();
$user = $result->fetch_array(MYSQLI_NUM);
// user 是数组,
// 字段从 0 开始排列,没有 named key

查询 (多条)

$query = $conn->prepare("SELECT * from meal where email=?");
$query->bind_param('s', $_SESSION["email"]);
$query->execute();
$result = $query->get_result()->fetch_all();

// result 是数组,每个元素也是数组。
// 字段从 0 开始排列,没有 named key

删除

$query = $conn->prepare("delete from Likes where photoId = ? and userId = ?");
$query->bind_param('ii', $_GET['id'], $_SESSION['user'][0]);
$query->execute();

PDO

连接

define('DB_DSN','mysql:host=localhost;dbname=blog');
define('DB_USER','root');
define('DB_PASS','');
$db = null;
try {
  $db = new PDO(DB_DSN, DB_USER, DB_PASS);
} catch (PDOException $e) {
  print "Error: " . $e->getMessage();
  die();
}

插入

$query = "INSERT INTO post (title, content) values (:title, :content)";
$statement = $db->prepare($query);
$statement->bindValue(':title', $title);
$statement->bindValue(':content', $content);
$statement->execute();
$insert_id = $db->lastInsertId();

更新

$query = "UPDATE post SET title = :title, content = :content WHERE id = :id";
$statement = $db->prepare($query);
$statement->bindValue(':title', $title);
$statement->bindValue(':content', $content);
$statement->bindValue(':id', $id);
$statement->execute();
$insert_id = $db->lastInsertId();

查询

$query = "SELECT * FROM post ORDER BY creation_time DESC LIMIT 5";
$statement = $db->prepare($query);
$statement->execute();
$posts= $statement->fetchAll();

删除

$query = "DELETE FROM post WHERE id = :id";
$statement = $db->prepare($query);
$statement->bindValue(':id', $id, PDO::PARAM_STR);
$statement->execute();

授权

登录

// select user from db first
session_start();
$_SESSION['user'] = $user;
header("Location: index.php");
die();

注销

unset($_SESSION['user']);
session_destroy();
header('Location: login.php');
die();

检查授权

if (!isset($_SESSION['user'])) {
    header("Location: login.php");
    die();
}

密码加密

$hashed_password = hash('ripemd128', $psw);

Basic Auth

define('ADMIN_LOGIN','wally');
define('ADMIN_PASSWORD','mypass');
if (!isset($_SERVER['PHP_AUTH_USER']) || 
!isset($_SERVER['PHP_AUTH_PW']) || 
($_SERVER['PHP_AUTH_USER'] != ADMIN_LOGIN) || 
($_SERVER['PHP_AUTH_PW'] != ADMIN_PASSWORD)) {
    header('HTTP/1.1 401 Unauthorized');
    header('WWW-Authenticate: Basic realm="Our Blog"');
    exit("Access Denied: Username and password required.");
}

Memcached

$memcached = new Memcached();
$memcached->addServer('localhost', 11211);
$memcached->set('test', 'testcache');
var_dump($memcached->get('test'));
$memcached->set('test2', '123');
var_dump($memcached->get('test2'));
var_dump($memcached->get('test3'));

业务场景

为导航设置激活状态

在 page include header 之前:

$page = 'home';

在 header:

<li><a class="<?= ($page == 'home') ? "current" : ""; ?>" href="index.php">Home</a></li>

文件上传

保存至文件系统

// upload photo to images/photos
$photo = '';
$photoExt = pathinfo($_FILES['photo']['name'], PATHINFO_EXTENSION);
$photo = time() . "." . $photoExt;
move_uploaded_file($_FILES['photo']['tmp_name'], "images/photos/" . $photo);

// insert photo to database
$query = $conn->prepare("insert into Photo (photo, description, type, userId) value (?,?,?,?)");
$query->bind_param('sssi', $photo, $_POST['description'], $_POST['type'], $_SESSION['user'][0]);
$query->execute();
$id = $query->insert_id;

// go homepage
header('Location: index.php');
die();

保存至数据库

$fileContent = file_get_contents($_FILES['fileContent']['tmp_name']);
$contentName = mysql_fix_string($conn, $_POST['contentName']);
$query = $conn->prepare("INSERT INTO files (contentName, fileContent, userId) values (?,?,?)");
$query->bind_param('ssi', $contentName, $fileContent, $user[0]);
$query->execute();
$query->close();

MySQLi 初始化数据库

$conn = new mysqli($host, $user, $password);
if ($conn->connect_error) {
    die($conn->connect_error);
}

// create database
$sql = "CREATE DATABASE if not exists $db";
if ($conn->query($sql) === TRUE) {
    echo "Database $db created.";
} else {
    echo "Error creating database: " . $conn->error;
}


// connect to database
$conn = new mysqli($host, $user, $password, $db);
if ($conn->connect_error) {
    // connection error
    die($conn->connect_error);
}

$sql = "
create table if not exists faculty
(
    id   int  not null auto_increment primary key,
    name text not null
);
";

if ($conn->query($sql) === TRUE) {
    echo "<br/> faculty table created successfully";
} else {
    echo "<br/> faculty table create error:" . $conn->error;
}