The PDOStatement class

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

Introduction

Represents a prepared statement and, after the statement is executed, an associated result set.

Class synopsis

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

Properties

queryString

Used query string.

Table of Contents

Коментарии

Автор:
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($inputParams0$placeholders);

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

        return 
$resultSet;
    }
}
?>
2017-10-17 13:01:34
http://php5.kiev.ua/manual/ru/class.pdostatement.html
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($connectionStringDB_LOGINDB_PASS);
}
catch(
PDOException $e)
{
    die(
"Error: ".$e->getMessage());
}
$db->setAttribute(PDO::ATTR_ERRMODEPDO::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());
}
2020-12-09 10:22:26
http://php5.kiev.ua/manual/ru/class.pdostatement.html

    Поддержать сайт на родительском проекте КГБ