Heim  >  Artikel  >  Backend-Entwicklung  >  PDO in PHP

PDO in PHP

小云云
小云云Original
2018-03-31 09:38:3112757Durchsuche

Was ist PHP PDO?

PDO (PHP Data Objects) ist eine Schnittstelle zur Verbindung mit Datenbanken in PHP. PDO und MySQLi wurden einst aufgrund der Sicherheit der Datenbanknutzung als Ersatz für die MySQL-bezogenen Funktionen empfohlen, die ursprünglich von PHP verwendet wurden, da letztere keinen Schutz gegen SQL-Injection hatten.

Die PHP Data Objects (PDO)-Erweiterung definiert eine schlanke, konsistente Schnittstelle für PHP für den Zugriff auf Datenbanken. Jeder Datenbanktreiber, der die PDO-Schnittstelle implementiert, kann datenbankspezifische Funktionen als Standarderweiterungen verfügbar machen. Beachten Sie, dass die Verwendung von PDO-Erweiterungen allein keine Datenbankfunktionalität implementiert. Sie müssen einen datenbankspezifischen PDO-Treiber verwenden, um auf Datenbankdienste zuzugreifen.

Empfohlene MySQL-Video-Tutorials: „MySQL-Tutorial

PDO bietet eine Datenzugriffs-Abstraktionsschicht, was bedeutet, dass sie unabhängig von der verwendeten Datenbank gleich verwendet werden kann Funktionen (Methoden) zum Abfragen und Abrufen von Daten. PDO bietet keine Datenbankabstraktionsschicht; es schreibt SQL nicht neu und emuliert keine fehlenden Funktionen. Bei Bedarf sollte eine ausgereifte Abstraktionsschicht verwendet werden.

Datenbankunterstützung:

  • firebird

  • informix

  • mysql

  • mssql

  • odbc

  • pgsql

  • SQLite

PHP-PDO-Fehler und Fehlerbehandlung

PDO bietet drei verschiedene Fehlerbehandlungsmodi, um verschiedenen Arten der Anwendungsentwicklung gerecht zu werden:

PDO::ERRMODE_SILENT

Dies ist der Standardmodus. PDO legt einfach den Fehlercode fest, der mit den Methoden PDO::errorCode() und PDO::errorInfo() für Anweisungen und Datenbankobjekte überprüft werden kann. Wenn der Fehler aufgrund eines Aufrufs eines Anweisungsobjekts auftritt, können Sie die Methode PDOStatement::errorCode() oder PDOStatement::errorInfo() dieses Objekts aufrufen. Wenn der Fehler durch den Aufruf eines Datenbankobjekts verursacht wird, können die beiden oben genannten Methoden für das Datenbankobjekt aufgerufen werden.

PDO::ERRMODE_WARNING

Zusätzlich zum Festlegen des Fehlercodes sendet PDO auch eine herkömmliche E_WARNING-Nachricht. Diese Einstellung ist beim Debuggen/Testen nützlich, wenn Sie nur sehen möchten, was falsch läuft, ohne den Fluss Ihrer Anwendung zu unterbrechen.

PDO::ERRMODE_EXCEPTION

Zusätzlich zum Festlegen des Fehlercodes löst PDO auch eine PDOException-Ausnahmeklasse aus und legt deren Eigenschaften so fest, dass sie den Fehlercode und die Fehlerinformationen widerspiegeln. Diese Einstellung ist auch beim Debuggen sehr nützlich, da sie effektiv auf die Stelle im Skript eingeht, an der der Fehler aufgetreten ist, sodass Sie potenziell problematische Bereiche im Code sehr schnell lokalisieren können (denken Sie daran: Wenn eine Ausnahme dazu führt, dass das Skript beendet wird, wird die Transaktion wird automatisch zurückgesetzt (Rollback).

Eine weitere sehr nützliche Sache des Ausnahmemodus besteht darin, dass Sie Ihre eigene Fehlerbehandlung klarer erstellen können als herkömmliche Warnungen im PHP-Stil. Im Vergleich zum stillen Modus und der expliziten Überprüfung des Rückgabewerts jedes Datenbankaufrufs erfordern Ausnahmemuster weniger Code/Verschachtelung.

PHP PDO verwendet

, um eine Verbindung zu MySQL herzustellen

<?php

$type = &#39;mysql&#39;;
$hostname = &#39;localhost&#39;;
$dbname = &#39;test&#39;;
$username = &#39;root&#39;;
$password = &#39;root&#39;;

try {

    $dsn = sprintf(&#39;%s:dbname=%s;host=%s&#39;, $type, $dbname, $dbname);

    //初始化一个PDO对象
    $pdo = new PDO($dsn, $username, $password, [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION //开启异常模式
    ]);

} catch (PDOException $e) {
    die ("Database error: " . $e->getMessage());
}

?>

Daten abfragen

$type = &#39;mysql&#39;;
$hostname = &#39;127.0.0.1&#39;;
$dbname = &#39;test&#39;;
$username = &#39;root&#39;;
$password = &#39;root&#39;;

try {

    $dsn = sprintf(&#39;%s:dbname=%s;host=%s;charset=utf8&#39;, $type, $dbname, $hostname);

    //初始化一个PDO对象
    $pdo = new PDO($dsn, $username, $password, [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION //开启异常模式
    ]);

} catch (PDOException $e) {
    die ("Database error: " . $e->getMessage());
}

$smt = $pdo->query(&#39;SELECT * FROM t_user&#39;);

$data = $smt->fetchAll(PDO::FETCH_ASSOC);

var_dump($data);

Ergebnisse drucken

array(5) {
  [0]=>
  array(4) {
    ["password"]=>
    string(8) "jidasdas"
    ["phone"]=>
    string(9) "888888888"
    ["user_id"]=>
    string(32) "402881e564c0da7b0164c11adc8f0006"
    ["user_name"]=>
    string(5) "marry"
  }
  [1]=>
  array(4) {
    ["password"]=>
    string(4) "tiyv"
    ["phone"]=>
    string(6) "000000"
    ["user_id"]=>
    string(32) "402881e564c0da7b0164c1227c5d000b"
    ["user_name"]=>
    string(6) "Bliabx"
  }
  [2]=>
  array(4) {
    ["password"]=>
    string(5) "dsada"
    ["phone"]=>
    string(7) "3123123"
    ["user_id"]=>
    string(32) "402881e764bbd6340164bbd6af4e0001"
    ["user_name"]=>
    string(4) "Nusg"
  }
  [3]=>
  array(4) {
    ["password"]=>
    string(4) "kjhk"
    ["phone"]=>
    string(6) "321312"
    ["user_id"]=>
    string(32) "402881e764bbd7b60164bbd9c3cb0002"
    ["user_name"]=>
    string(6) "XIoaji"
  }
  [4]=>
  array(4) {
    ["password"]=>
    string(3) "dsa"
    ["phone"]=>
    string(3) "110"
    ["user_id"]=>
    string(32) "402881e764bbed9f0164bbee12c70000"
    ["user_name"]=>
    string(6) "Villig"
  }
}

Vorverarbeitung

/* 通过数组值向预处理语句传递值 */
$sql = &#39;SELECT name, colour, calories FROM fruit WHERE calories < :calories AND colour = :colour&#39;;

$sth = $dbh->prepare($sql, [PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY]);

$sth->execute([&#39;:calories&#39; => 150, &#39;:colour&#39; => &#39;red&#39;]);

$red = $sth->fetchAll();

$sth->execute([&#39;:calories&#39; => 175, &#39;:colour&#39; => &#39;yellow&#39;]);

$yellow = $sth->fetchAll();

Grundlegende PDO-Kapselung

<?php
/**
* DAOPDO
* @authors by houzhyan <houzhyan@126.com>
* @blog http://www.descartes.top/
* @version >5.1 utf8
*/
class DAOPDO
{
    protected static $_instance = null;
    protected $dbName = &#39;&#39;;
    protected $dsn;
    protected $dbh;
    
    /**
     * 构造
     * 
     * @return DAOPDO
     */
    private function __construct($dbHost, $dbUser, $dbPasswd, $dbName, $dbCharset)
    {
        try {
            $this->dsn = &#39;mysql:host=&#39;.$dbHost.&#39;;dbname=&#39;.$dbName;
            $this->dbh = new PDO($this->dsn, $dbUser, $dbPasswd);
            $this->dbh->exec(&#39;SET character_set_connection=&#39;.$dbCharset.&#39;, character_set_results=&#39;.$dbCharset.&#39;, character_set_client=binary&#39;);
        } catch (PDOException $e) {
            $this->outputError($e->getMessage());
        }
    }
    
    /**
     * 防止克隆
     * 
     */
    private function __clone() {}
    
    /**
     * Singleton instance
     * 
     * @return Object
     */
    public static function getInstance($dbHost, $dbUser, $dbPasswd, $dbName, $dbCharset)
    {
        if (self::$_instance === null) {
            self::$_instance = new self($dbHost, $dbUser, $dbPasswd, $dbName, $dbCharset);
        }
        return self::$_instance;
    }
    
    /**
     * Query 查询
     *
     * @param String $strSql SQL语句
     * @param String $queryMode 查询方式(All or Row)
     * @param Boolean $debug
     * @return Array
     */
    public function query($strSql, $queryMode = &#39;All&#39;, $debug = false)
    {
        if ($debug === true) $this->debug($strSql);
        $recordset = $this->dbh->query($strSql);
        $this->getPDOError();
        if ($recordset) {
            $recordset->setFetchMode(PDO::FETCH_ASSOC);
            if ($queryMode == &#39;All&#39;) {
                $result = $recordset->fetchAll();
            } elseif ($queryMode == &#39;Row&#39;) {
                $result = $recordset->fetch();
            }
        } else {
            $result = null;
        }
        return $result;
    }
    
    /**
     * Update 更新
     *
     * @param String $table 表名
     * @param Array $arrayDataValue 字段与值
     * @param String $where 条件
     * @param Boolean $debug
     * @return Int
     */
    public function update($table, $arrayDataValue, $where = &#39;&#39;, $debug = false)
    {
        $this->checkFields($table, $arrayDataValue);
        if ($where) {
            $strSql = &#39;&#39;;
            foreach ($arrayDataValue as $key => $value) {
                $strSql .= ", `$key`=&#39;$value&#39;";
            }
            $strSql = substr($strSql, 1);
            $strSql = "UPDATE `$table` SET $strSql WHERE $where";
        } else {
            $strSql = "REPLACE INTO `$table` (`".implode(&#39;`,`&#39;, array_keys($arrayDataValue))."`) VALUES (&#39;".implode("&#39;,&#39;", $arrayDataValue)."&#39;)";
        }
        if ($debug === true) $this->debug($strSql);
        $result = $this->dbh->exec($strSql);
        $this->getPDOError();
        return $result;
    }
    
    /**
     * Insert 插入
     *
     * @param String $table 表名
     * @param Array $arrayDataValue 字段与值
     * @param Boolean $debug
     * @return Int
     */
    public function insert($table, $arrayDataValue, $debug = false)
    {
        $this->checkFields($table, $arrayDataValue);
        $strSql = "INSERT INTO `$table` (`".implode(&#39;`,`&#39;, array_keys($arrayDataValue))."`) VALUES (&#39;".implode("&#39;,&#39;", $arrayDataValue)."&#39;)";
        if ($debug === true) $this->debug($strSql);
        $result = $this->dbh->exec($strSql);
        $this->getPDOError();
        return $result;
    }
    
    /**
     * Replace 覆盖方式插入
     *
     * @param String $table 表名
     * @param Array $arrayDataValue 字段与值
     * @param Boolean $debug
     * @return Int
     */
    public function replace($table, $arrayDataValue, $debug = false)
    {
        $this->checkFields($table, $arrayDataValue);
        $strSql = "REPLACE INTO `$table`(`".implode(&#39;`,`&#39;, array_keys($arrayDataValue))."`) VALUES (&#39;".implode("&#39;,&#39;", $arrayDataValue)."&#39;)";
        if ($debug === true) $this->debug($strSql);
        $result = $this->dbh->exec($strSql);
        $this->getPDOError();
        return $result;
    }
    
    /**
     * Delete 删除
     *
     * @param String $table 表名
     * @param String $where 条件
     * @param Boolean $debug
     * @return Int
     */
    public function delete($table, $where = &#39;&#39;, $debug = false)
    {
        if ($where == &#39;&#39;) {
            $this->outputError("&#39;WHERE&#39; is Null");
        } else {
            $strSql = "DELETE FROM `$table` WHERE $where";
            if ($debug === true) $this->debug($strSql);
            $result = $this->dbh->exec($strSql);
            $this->getPDOError();
            return $result;
        }
    }
    
    /**
     * execSql 执行SQL语句,debug=>true可打印sql调试
     *
     * @param String $strSql
     * @param Boolean $debug
     * @return Int
     */
    public function execSql($strSql, $debug = false)
    {
        if ($debug === true) $this->debug($strSql);
        $result = $this->dbh->exec($strSql);
        $this->getPDOError();
        return $result;
    }
    
    /**
     * 获取字段最大值
     * 
     * @param string $table 表名
     * @param string $field_name 字段名
     * @param string $where 条件
     */
    public function getMaxValue($table, $field_name, $where = &#39;&#39;, $debug = false)
    {
        $strSql = "SELECT MAX(".$field_name.") AS MAX_VALUE FROM $table";
        if ($where != &#39;&#39;) $strSql .= " WHERE $where";
        if ($debug === true) $this->debug($strSql);
        $arrTemp = $this->query($strSql, &#39;Row&#39;);
        $maxValue = $arrTemp["MAX_VALUE"];
        if ($maxValue == "" || $maxValue == null) {
            $maxValue = 0;
        }
        return $maxValue;
    }
    
    /**
     * 获取指定列的数量
     * 
     * @param string $table
     * @param string $field_name
     * @param string $where
     * @param bool $debug
     * @return int
     */
    public function getCount($table, $field_name, $where = &#39;&#39;, $debug = false)
    {
        $strSql = "SELECT COUNT($field_name) AS NUM FROM $table";
        if ($where != &#39;&#39;) $strSql .= " WHERE $where";
        if ($debug === true) $this->debug($strSql);
        $arrTemp = $this->query($strSql, &#39;Row&#39;);
        return $arrTemp[&#39;NUM&#39;];
    }
    
    /**
     * 获取表引擎
     * 
     * @param String $dbName 库名
     * @param String $tableName 表名
     * @param Boolean $debug
     * @return String
     */
    public function getTableEngine($dbName, $tableName)
    {
        $strSql = "SHOW TABLE STATUS FROM $dbName WHERE Name=&#39;".$tableName."&#39;";
        $arrayTableInfo = $this->query($strSql);
        $this->getPDOError();
        return $arrayTableInfo[0][&#39;Engine&#39;];
    }
    //预处理执行
    public function prepareSql($sql=&#39;&#39;){
        return $this->dbh->prepare($sql);
    }
    //执行预处理
    public function execute($presql){
        return $this->dbh->execute($presql);
    }
 
/**
 * pdo属性设置
 */
    public function setAttribute($p,$d){
        $this->dbh->setAttribute($p,$d);
    }
 
    /**
     * beginTransaction 事务开始
     */
    public function beginTransaction()
    {
        $this->dbh->beginTransaction();
    }
    
    /**
     * commit 事务提交
     */
    public function commit()
    {
        $this->dbh->commit();
    }
    
    /**
     * rollback 事务回滚
     */
    public function rollback()
    {
        $this->dbh->rollback();
    }
    
    /**
     * transaction 通过事务处理多条SQL语句
     * 调用前需通过getTableEngine判断表引擎是否支持事务
     *
     * @param array $arraySql
     * @return Boolean
     */
    public function execTransaction($arraySql)
    {
        $retval = 1;
        $this->beginTransaction();
        foreach ($arraySql as $strSql) {
            if ($this->execSql($strSql) == 0) $retval = 0;
        }
        if ($retval == 0) {
            $this->rollback();
            return false;
        } else {
            $this->commit();
            return true;
        }
    }
 
    /**
     * checkFields 检查指定字段是否在指定数据表中存在
     *
     * @param String $table
     * @param array $arrayField
     */
    private function checkFields($table, $arrayFields)
    {
        $fields = $this->getFields($table);
        foreach ($arrayFields as $key => $value) {
            if (!in_array($key, $fields)) {
                $this->outputError("Unknown column `$key` in field list.");
            }
        }
    }
    
    /**
     * getFields 获取指定数据表中的全部字段名
     *
     * @param String $table 表名
     * @return array
     */
    private function getFields($table)
    {
        $fields = array();
        $recordset = $this->dbh->query("SHOW COLUMNS FROM $table");
        $this->getPDOError();
        $recordset->setFetchMode(PDO::FETCH_ASSOC);
        $result = $recordset->fetchAll();
        foreach ($result as $rows) {
            $fields[] = $rows[&#39;Field&#39;];
        }
        return $fields;
    }
    
    /**
     * getPDOError 捕获PDO错误信息
     */
    private function getPDOError()
    {
        if ($this->dbh->errorCode() != &#39;00000&#39;) {
            $arrayError = $this->dbh->errorInfo();
            $this->outputError($arrayError[2]);
        }
    }
    
    /**
     * debug
     * 
     * @param mixed $debuginfo
     */
    private function debug($debuginfo)
    {
        var_dump($debuginfo);
        exit();
    }
    
    /**
     * 输出错误信息
     * 
     * @param String $strErrMsg
     */
    private function outputError($strErrMsg)
    {
        throw new Exception(&#39;MySQL Error: &#39;.$strErrMsg);
    }
    
    /**
     * destruct 关闭数据库连接
     */
    public function destruct()
    {
        $this->dbh = null;
    }
   /**
    *PDO执行sql语句,返回改变的条数
    *如需调试可选用execSql($sql,true)
    */
    public function exec($sql=&#39;&#39;){
        return $this->dbh->exec($sql);
    }
}
?>

PHP PDO detaillierte Beschreibung

PDO-Klasse

PDO::beginTransaction – Eine Transaktion starten

PDO::commit – Eine Transaktion festschreiben

PDO::__construct – Ein PDO erstellen, das eine Datenbank darstellt Verbindungsbeispiel

PDO::errorCode – Ruft den SQLSTATE ab, der sich auf die letzte Operation des Datenbank-Handles bezieht

PDO::errorInfo – Gibt die Fehlerinformationen der letzten Operation in der Datenbank zurück

PDO:: exec – Führt eine SQL-Anweisung aus und gibt die Anzahl der betroffenen Zeilen zurück

PDO::getAttribute – Ruft die Attribute einer Datenbankverbindung ab

PDO::getAvailableDrivers – Gibt eine zurück Array verfügbarer Treiber

PDO::inTransaction – Überprüfen Sie, ob es sich um eine Transaktion handelt

PDO::lastInsertId – Gibt die ID oder den Sequenzwert der zuletzt eingefügten Zeile zurück

PDO::prepare – Bereitet die Ausführung einer SQL-Anweisung vor und gibt ein PDOStatement-Objekt zurück

PDO::query – führt die SQL-Anweisung aus und gibt das PDOStatement-Objekt zurück, das als Ergebnismenge verstanden werden kann

PDO::quote – ist die Zeichenfolge in der SQL-Anweisung „Anführungszeichen hinzufügen“.

PDO::rollBack – Rollback einer Transaktion

PDO::setAttribute – Attribute festlegen

PDOStatement-Klasse

PDOStatement: :bindColumn – Binden Sie eine Spalte an eine PHP-Variable

PDOStatement::bindParam – Binden Sie einen Parameter an den angegebenen Variablennamen

PDOStatement::bindValue – Binden Sie einen Wert an einen Parameter

PDOStatement::closeCursor — Schließen Sie den Cursor, damit die Anweisung erneut ausgeführt werden kann.

PDOStatement::columnCount – Gibt die Anzahl der Spalten im Ergebnissatz zurück

PDOStatement::debugDumpParams – Gibt einen SQL-Vorverarbeitungsbefehl aus

PDOStatement::errorCode – Ruft den letzten ab Anweisung SQLSTATE im Zusammenhang mit Handle-Operationen

PDOStatement::errorInfo – Erhalten Sie erweiterte Fehlerinformationen im Zusammenhang mit der letzten Anweisungs-Handle-Operation

PDOStatement::execute – Führen Sie eine vorbereitete Anweisung aus

PDOStatement ::fetch – Ruft die nächste Zeile aus der Ergebnismenge ab

PDOStatement::fetchAll – Gibt ein Array zurück, das alle Zeilen in der Ergebnismenge enthält

PDOStatement::fetchColumn – Gibt die nächste Zeile aus zurück die Ergebnismenge einzeln einer Spalte.

PDOStatement::fetchObject – Ruft die nächste Zeile ab und gibt sie als Objekt zurück.

PDOStatement::getAttribute – Ein Anweisungsattribut abrufen

PDOStatement::getColumnMeta – Metadaten für eine Spalte in einem Ergebnissatz zurückgeben

PDOStatement::nextRowset – In einem Multi- Rowset-Anweisung Gehe zum nächsten Rowset im Handle

PDOStatement::rowCount – Gibt die Anzahl der Zeilen zurück, die von der vorherigen SQL-Anweisung betroffen sind

PDOStatement::setAttribute – Legt ein Anweisungsattribut fest

PDOStatement::setFetchMode – Legen Sie den Standardabrufmodus für Anweisungen fest.

Das obige ist der detaillierte Inhalt vonPDO in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn