略微加速

PHP官方手册 - 互联网笔记

PHP - Manual: PDOStatement

2024-12-22

PDOStatement 类

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 1.0.0)

简介

代表一条预处理语句,并在该语句被执行后代表一个相关的结果集。

类摘要

class PDOStatement implements Traversable {
/* 属性 */
readonly string $queryString;
/* 方法 */
bindColumn(
    mixed $column,
    mixed &$param,
    int $type = ?,
    int $maxlen = ?,
    mixed $driverdata = ?
): bool
bindParam(
    mixed $parameter,
    mixed &$variable,
    int $data_type = PDO::PARAM_STR,
    int $length = ?,
    mixed $driver_options = ?
): bool
bindValue(mixed $parameter, mixed $value, int $data_type = PDO::PARAM_STR): bool
closeCursor(): bool
errorCode(): string
errorInfo(): array
execute(array $input_parameters = ?): bool
fetch(int $fetch_style = ?, int $cursor_orientation = PDO::FETCH_ORI_NEXT, int $cursor_offset = 0): mixed
fetchAll(int $fetch_style = ?, mixed $fetch_argument = ?, array $ctor_args = array()): array
fetchColumn(int $column_number = 0): string
fetchObject(string $class_name = "stdClass", array $ctor_args = ?): mixed
getAttribute(int $attribute): mixed
getColumnMeta(int $column): array
nextRowset(): bool
rowCount(): int
setAttribute(int $attribute, mixed $value): bool
setFetchMode(int $mode): bool
}

属性

queryString

所用的查询字符串

目录

add a noteadd a note

User Contributed Notes 2 notes

up
23
Gino D.
4 years ago
I don't know why PDOStatement don't return "execution time" and "found rows" so here I created an extended class of PDOStatement with these attributes.

Just have to "setAttribute" of PDO's object to $PDO->setAttribute(\PDO::ATTR_STATEMENT_CLASS , ['\customs\PDOStatement', [&$this]]);

<?php

/**
*
*
*
*/

namespace customs;

/**
*
*
*
*/

final class PDOStatement extends \PDOStatement {

   
/**
    *
    *
    *
    */

   
protected $PDO = null;
    protected
$inputParams = [];
    protected
$executionTime = 0;
    protected
$resultCount = 0;

   
/**
    *
    *
    *
    */

   
protected function __construct(PDO &$PDO) {
       
$this->PDO = $PDO;
       
$this->executionTime = microtime(true);
    }

   
/**
    *
    *
    *
    */

   
final public function getExecutionError(int $i = 2) {
       
$executionError = $this->errorInfo();

        if (isset(
$executionError[$i]))
            return
$executionError[$i];

        return
$executionError;
    }

   
/**
    *
    *
    *
    */

   
final public function getExecutionTime($numberFormat = false, $decPoint = '.', $thousandsSep = ',') {
        if (
is_numeric($numberFormat))
            return
number_format($this->executionTime, $numberFormat, $decPoint, $thousandsSep);
       
        return
$this->executionTime;
    }

   
/**
    *
    *
    *
    */

   
final public function getResultCount($numberFormat = false, $decPoint = '.', $thousandsSep = ',') {
        if (
is_numeric($numberFormat))
            return
number_format($this->resultCount, $numberFormat, $decPoint, $thousandsSep);
       
        return
$this->resultCount;
    }

   
/**
    *
    *
    *
    */

   
final public function getLastInsertId() {
        return
$this->PDO->lastInsertId();
    }

   
/**
    *
    *
    *
    */

   
final public function bindValues(array $inputParams) {
        foreach (
$this->inputParams = array_values($inputParams) as $i => $value) {
           
$varType = is_null($value) ? \PDO::PARAM_NULL : is_bool($value) ? \PDO::PARAM_BOOL : is_int($value) ? \PDO::PARAM_INT : \PDO::PARAM_STR;

            if (!
$this->bindValue(++ $i, $value, $varType))
                return
false;
        }

        return
true;
    }

   
/**
    *
    *
    *
    */

   
final public function execute($inputParams = null) {
        if (
$inputParams)
           
$this->inputParams = $inputParams;

        if (
$executed = parent::execute($inputParams))
           
$this->executionTime = microtime(true) - $this->executionTime;

        return
$executed;
    }

   
/**
    *
    *
    *
    */

   
final public function fetchAll($how = null, $className = null, $ctorArgs = null) {
       
$resultSet = parent::fetchAll(... func_get_args());

        if (!empty(
$resultSet)) {
           
$queryString = $this->queryString;
           
$inputParams = $this->inputParams;

            if (
preg_match('/(.*)?LIMIT/is', $queryString, $match))
               
$queryString = $match[1];

           
$queryString = sprintf('SELECT COUNT(*) AS T FROM (%s) DT', $queryString);

            if ((
$placeholders = substr_count($queryString, '?')) < count($inputParams))
               
$inputParams = array_slice($inputParams, 0, $placeholders);

            if ((
$sth = $this->PDO->prepare($queryString)) && $sth->bindValues($inputParams) && $sth->execute())
               
$this->resultCount = $sth->fetchColumn();
               
           
$sth = null;
        }

        return
$resultSet;
    }
}
?>
up
0
nmurzin at mail dot ru
1 year ago
I think I found a way to execute a protected SQL query and at the same time find out the number of affected records.
I have the table 'tbl_users' with the following fields: id, login, password, age

<?
const DB_DRIVER = "mysql";
const DB_HOST = "localhost";
const DB_NAME = "my_db_name";
const DB_LOGIN = "root";
const DB_PASS = "root"; //OpenServer.

$connectionString = DB_DRIVER.':host='.DB_HOST.';dbname='.DB_NAME;
try
{
    //Connect to database.
    $db = new PDO($connectionString, DB_LOGIN, DB_PASS);
}
catch(PDOException $e)
{
    die("Error: ".$e->getMessage());
}
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

try
{
   
    //Decreasing age for user 'nick1'.
    $prep1 = $db->prepare("UPDATE tbl_users SET age=age-1 WHERE login='nick1'");

    //Increasing age for user 'nick2'.
    $prep2 = $db->prepare("UPDATE tbl_users SET \r\n age=age+1 WHERE login='nick2'");

    //Start transaction.
    $db->beginTransaction(); //Table type must be InnerDB!

    //We assume that everything will be fine.
    $flagDone = true;

    //The exec() method returns the number of rows affected by the query.
    //$prep1->queryString is already an escaped SQL string.
    $result = $db->exec($prep1->queryString);
    if($result==false || $result!=1) //var_dump($result) - int(1) or bool(false).
        $flagDone = false;

    $result = $db->exec($prep2->queryString);
    if($result==false || $result!=1)
        $flagDone = false;

    if($flagDone)
    {
        if($db->commit())
            echo "Transaction was successful";
    }       
    else{
            echo "Transaction fail";
            $db->rollback();
    }
    echo "<br>";

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

官方地址:https://www.php.net/manual/en/class.pdostatement.php

北京半月雨文化科技有限公司.版权所有 京ICP备12026184号-3