PHP-のデータベース操作

データベースへの接続

など様々なとしてPHPのデータベース操作mysql、、 mysqliPDO主にPDOプロセスを使用しました。

PDOは、データアクセス抽象化レイヤー、照会と同じ機能(メソッド)を使用してデータを取得することができますに関係なく、あなたが使用しているデータベースの、手段を提供します。

ここでされてPDO動作可能な接続は、例外がスローされます失敗した場合、データベースに接続します。

<?php
header('Content-type:text/html;charset=utf8');
$config = [
    'host' => 'localhost',
    'user' => 'root',
    'password' => '',
    'db' => 'houdunren',
    'charset'=>'utf8'
];
try {
    $dsn = sprintf('mysql:host=%s;dbname=%s;charset=utf8', $config['host'], $config['db'],$config['charset']);
    $pdo =  new PDO($dsn, $config['user'], $config['password']);
} catch (PDOException $e) {
    die($e->getMessage());
}

エラー処理

エラーの種類 説明
PDO :: ERRMODE_SILENT エラーなし
PDO :: ERRMODE_WARNING 警告エラー
PDO :: ERRMODE_EXCEPTION 例外を投げます

エラー・タイプは関連して提供することができます

$pdo =  new PDO($dns, $config['user'], $config['password'], [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);

また、使用することができるsetAttribute方法は、エラーを処理するために提供されます

...
$pdo =  new PDO($dns, $config['user'], $config['password']);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
...

文を実行

使用exec方法は、実行言語を送信することができます

$pdo->exec("INSERT INTO news (title) VALUES('houdunren.com')");
echo "自增主键:".$pdo->lastInsertId();

削除操作

$affectedRows = $pdo->exec("DELETE FROM news WHERE id>3");
echo "受影响的条数:".$affectedRows;

情報照会

カラム名を返すように設定します

プロパティ 説明
PDO :: CASE_LOWER 強制カラム名を小文字
PDO :: CASE_NATURAL データベースドライバによって返さ予約カラム名
PDO :: CASE_UPPER 大文字で列名を強制
$pdo->setAttribute(PDO::ATTR_CASE,PDO::CASE_LOWER);

結果へ戻ります

戻り値の型 説明
$ result-> fetchAllの(PDO :: FETCH_ASSOC) 関連するデータの取得
$ result-> fetchAllの(PDO :: FETCH_NUM) インデックス付きのデータを取得します
$ result-> fetchAllの(PDO :: FETCH_BOTH) 同時に、インデックスに関連するデータを取得
$ result-> fetchAllの(PDO :: FETCH_OBJ) オブジェクト型のデータを取得します。

fetchAllの

すべての結果を得るために一度

...
$query = $pdo->query("select * from news");
$rows = $query->fetchAll();
print_r($rows);
...

フェッチ

たびに、データ取得結果

...
$pdo =  new PDO($dns, $config['user'], $config['password']);
$query = $pdo->query("select * from news");
while ($field = $query->fetch(PDO::FETCH_ASSOC)) {
	echo sprintf("编号:%s\t标题:%s<br/>", $field['id'], $field['title']);
}
...

準備

準備されたSQLを効果的にSQLインジェクションを防ぐことができ、別々に行わ結合解析段階とパラメータです。

SQLインジェクション

SQLインジェクションの例で見てみましょう

$query = $pdo->query("SELECT * FROM news WHERE id={$_GET['id']}");

GET生成されたSQLインジェクションを次のようにパラメータがある場合

http://houdunren.test/1.php?id=1 or id>1

準備使い方

プロセスが準備分析およびパラメータを分離することであるため、効果的にSQLインジェクションを防止することができます。

$sql = "SELECT * FROM news WHERE id=:id";
$sth = $pdo->prepare($sql);
$sth->execute([':id' => $_GET['id']]);
$rows = $sth->fetchAll(PDO::FETCH_ASSOC);
print_r($rows);

準備の追加レコード

$sql = "INSERT INTO news (title) VALUES(?)";
$sth = $pdo->prepare($sql);
$sth->execute(['houdunren.com']);
echo $pdo->lastInsertId();

ポイントを使ってアイコン操作

$sth = $pdo->prepare("SELECT * FROM news WHERE id>?");
$sth->execute([3]);
print_r($sth->fetchAll());

SQLビルダー

処理クラス

次のSQL文は、発電機、高速動作のためのデータベースを構築します。

<?php

namespace Database;

use PDO;
use Exception;

class DB
{
    protected $link = null;
    protected $options = ['table' => '', 'field' => '', 'limit' => '', 'order' => '', 'where' => ''];
    public function __construct($config)
    {
        $this->connect($config);
    }
    public function connect($config)
    {
        if (is_null($this->link)) {
            $dsn = sprintf('mysql:host=%s;dbname=%s;charset=utf8', $config['host'], $config['db']);
            $this->link =  new PDO($dsn, $config['user'], $config['password'], [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
        }
        return $this->link;
    }
    public function query($sql, array $vars = [])
    {
        $sth = $this->link->prepare($sql);
        $sth->execute($vars);
        return $sth->fetchAll();
    }
    public function execute($sql, array $vars = [])
    {
        $sth = $this->link->prepare($sql);
        return $sth->execute($vars);
    }
    public function field(...$fields)
    {
        $this->options['field'] = '`' . implode('`,`', $fields) . '`';
        return $this;
    }
    public function table(string $table)
    {
        $this->options['table'] = $table;
        return $this;
    }
    public function get()
    {
        $sql  = "SELECT {$this->options['field']} FROM {$this->options['table']} {$this->options['where']} {$this->options['order']} {$this->options['limit']}";
        return $this->link->query($sql);
    }
    public function orderBy(string $order)
    {
        $this->options['order'] = " ORDER BY " . $order;
        return $this;
    }
    public function limit(...$limit)
    {
        $this->options['limit'] = " LIMIT " . implode(',', $limit);
        return $this;
    }
    public function where(string $where)
    {
        $this->options['where'] = " WHERE " . $where;
        return $this;
    }
    public function insert(array $vars)
    {
        $sql = "INSERT INTO {$this->options['table']} (" . implode(',', array_keys($vars)) . ") VALUES(" . implode(',', array_fill(0, count($vars), '?')) . ")";
        return $this->execute($sql, array_values($vars));
    }
    public function delete()
    {
        $sql = "DELETE FROM {$this->options['table']} {$this->options['where']}";
        return $this->execute($sql);
    }
    public function update(array $vars)
    {
        if (empty($this->options['where']))
            throw new Exception('不能缺少条件');
        $sql  = "UPDATE {$this->options['table']} SET " . implode('=?,', array_keys($vars)) . "=? {$this->options['where']}";
        return $this->execute($sql, array_values($vars));
    }
}

準備されたクエリ

...
$db->query("SELECT * FROM news WHERE id>=:id", ['id' => 1])
...

準備の実行

$db->execute("INSERT INTO news (title) VALUES(?)", ['hdcms.com'])

Objectインスタンス

use Database\DB;
include 'DB.php';
$config = [
    'host' => 'localhost',
    'user' => 'root',
    'password' => '',
    'db' => 'houdunren'
];

try {
	...
    $db = new DB($config);
    ...
}catch(Exception $e){
	die($e->getMessage());
}

クエリの操作

...
$rows = $db->table('news')->field('id', 'title')->limit(1, 3)->orderBy('id desc')->where("id>3")->get();
...

新しい操作

...
$db->prepareExecute("INSERT INTO news (title) VALUES(?)", ['hdcms.com']);
...

更新

...
$db->table('news')->where('id=1')->update(['title' => "sina", 'author' => '后盾人', 'description' => '个性介绍']);
...

削除

...
$db->table('news')->where('id>2')->delete();
...

おすすめ

転載: www.cnblogs.com/pengcode/p/12585426.html
おすすめ