Home Backend Development PHP Tutorial PDO operation of php

PDO operation of php

Jun 05, 2018 pm 05:18 PM
pdo php

This article mainly introduces the PDO operation of PHP, which has certain reference value. Now I share it with everyone. Friends in need can refer to it

PHP Data Object
Introduction
Installation /Configuration
Requirements
Installation
Runtime configuration
Resource type
Predefined constants
Connection and connection management
Transactions and automatic submission
Prepared statements and stored procedures
Errors and Error Handling
Large Objects (LOBs)
PDO — PDO Class
PDO::beginTransaction — Start a transaction
PDO::commit — Commit a transaction
PDO:: __construct — Create a PDO instance representing a database connection
PDO::errorCode — Get the SQLSTATE associated with the last operation on the database handle
PDO::errorInfo — Fetch extended error information associated with the last operation on the database handle
PDO::exec — Execute a SQL statement and return the number of affected rows
PDO::getAttribute — Retrieve the attributes of a database connection
PDO::getAvailableDrivers — Return an array of available drivers
PDO::inTransaction — Checks whether within a transaction
PDO::lastInsertId — Returns the ID or sequence value of the last inserted row
PDO::prepare — Prepares a statement for execution and returns a statement object
PDO::query — Executes an SQL statement, returning a result set as a PDOStatement object
PDO::quote — Quotes a string for use in a query.
PDO::rollBack — Roll back a transaction
PDO::setAttribute — Set attributes
PDOStatement — PDOStatement class
PDOStatement::bindColumn — Bind a column to a PHP variable
PDOStatement::bindParam — Bind a parameter to the specified variable name
PDOStatement ::bindValue — Bind a value to a parameter
PDOStatement::closeCursor — Close the cursor so that the statement can be executed again.
PDOStatement::columnCount — Returns the number of columns in the result set
PDOStatement::debugDumpParams — Prints a SQL preprocessing command
PDOStatement::errorCode — Gets the SQLSTATE related to the last statement handle operation
PDOStatement ::errorInfo — Get extended error information related to the last statement handle operation
PDOStatement::execute — Execute a prepared statement
PDOStatement::fetch — Get the next row from the result set
PDOStatement::fetchAll — Returns an array containing all rows in the result set
PDOStatement::fetchColumn — Returns a single column from the next row in the result set.
PDOStatement::fetchObject — Gets the next row and returns it as an object.
PDOStatement::getAttribute — Retrieve a statement attribute
PDOStatement::getColumnMeta — Return metadata for a column in a result set
PDOStatement::nextRowset — Advance to the next rowset in a multi-rowset statement handle
PDOStatement::rowCount — Returns the number of rows affected by the previous SQL statement
PDOStatement::setAttribute — Sets a statement attribute
PDOStatement::setFetchMode — Sets the default fetch mode for a statement.
PDOException — PDOException exception class
PDO driver
CUBRID (PDO) — CUBRID Functions (PDO_CUBRID)
MS SQL Server (PDO) — Microsoft SQL Server and Sybase Functions (PDO_DBLIB)
Firebird ( PDO) — Firebird Functions (PDO_FIREBIRD)
IBM (PDO) — IBM Functions (PDO_IBM)
Informix (PDO) — Informix Functions (PDO_INFORMIX)
MySQL (PDO) — MySQL Functions (PDO_MYSQL)
MS SQL Server (PDO) — Microsoft SQL Server Functions (PDO_SQLSRV)
Oracle (PDO) — Oracle Functions (PDO_OCI)
ODBC and DB2 (PDO) — ODBC and DB2 Functions (PDO_ODBC)
PostgreSQL (PDO ) — PostgreSQL Functions (PDO_PGSQL)
SQLite (PDO) — SQLite Functions (PDO_SQLITE)
4D (PDO) — 4D Functions (PDO_4D)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

293

294

295

296

297

298

299

300

301

302

303

304

305

306

307

308

309

310

311

312

313

314

315

316

317

318

319

320

321

322

323

324

325

326

327

328

329

330

331

332

333

334

335

336

337

338

339

340

341

342

343

344

345

346

347

348

349

350

351

352

353

354

355

356

357

358

359

360

361

362

363

364

365

366

367

368

369

370

371

372

373

374

375

376

377

378

379

380

381

382

383

384

385

386

387

388

389

390

391

392

393

394

395

396

397

398

399

400

401

402

403

404

405

406

407

408

409

410

411

412

413

414

415

416

417

418

419

420

421

422

423

424

425

426

427

428

429

430

431

432

433

434

435

436

437

438

439

440

441

442

443

444

445

446

447

448

449

450

451

452

453

454

455

456

457

458

459

460

461

462

463

464

465

466

467

468

469

470

471

472

473

474

475

476

477

478

479

480

481

482

483

484

485

486

487

488

489

490

491

492

493

494

495

496

497

498

499

500

501

502

503

504

505

506

507

508

509

510

511

512

513

514

515

516

517

518

519

520

521

522

523

524

525

<?php

Class SafePDO extends PDO {

 

        public static function exception_handler($exception) {

            // Output the exception details

            die(&#39;Uncaught exception: &#39;. $exception->getMessage());

        }     

          public function __construct($dsn, $username=&#39;&#39;, $password=&#39;&#39;, $driver_options=array()) {

 

            // Temporarily change the PHP exception handler while we . . .

            set_exception_handler(array(__CLASS__, &#39;exception_handler&#39;));           

            // . . . create a PDO object

            parent::__construct($dsn, $username, $password, $driver_options);           

            // Change the exception handler back to whatever it was before

            restore_exception_handler();

        }

 

}

?>

Para usarla hay que crear un archivo PHP llamado por ejemplo SafePDO con el contenido del archivo citado m??s arriba.

 

Y en cuando tengamos que conectar a nuestra base de datos:<?php

    include_once(&#39;SafePDO.php&#39; );   

    $dsn = &#39;mysql:host=&#39;.DB_HOST.&#39;;dbname=&#39;.DB_NAME.&#39;;charset=utf8&#39;;   

    $opt = array(

        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,

        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,

        PDO::MYSQL_ATTR_INIT_COMMAND => &#39;SET NAMES utf8&#39;

        );   

        $pdo = new SafePDO($dsn,DB_USER,DB_PASSWORD);?>[#2] matthew at button-mashers dot net [2014-05-07 23:31:23]

 

When using prepared statements there is no official PDO feature to show you the final query string that is submitted to a database complete with the parameters you passed.

 

Use this simple function for debugging. The values you are passing may not be what you expect.

<?php

//Sample query string$query = "UPDATE users SET name = :user_name WHERE id = :user_id";

//Sample parameters$params = [&#39;:user_name&#39; => &#39;foobear&#39;, &#39;:user_id&#39; => 1001];

function build_pdo_query($string, $array) {

    //Get the key lengths for each of the array elements.

    $keys = array_map(&#39;strlen&#39;, array_keys($array));   

    //Sort the array by string length so the longest strings are replaced first.

    array_multisort($keys, SORT_DESC, $array);   

    foreach($array as $k => $v) {       

    //Quote non-numeric values.

        $replacement = is_numeric($v) ? $v : "&#39;{$v}&#39;";       

        //Replace the needle.

        $string = str_replace($k, $replacement, $string);

    }   

    return $string;

}

echo build_pdo_query($query, $params);   

//UPDATE users SET name = &#39;foobear&#39; WHERE id = 1001?>[#3] Sbastien Gourmand [2013-07-08 10:19:25]

 

Merge the prepare() and execute() in one function like a sprintf().

And like sprintf, I choose to use unnamed args (?) ;)

 

you could still use old insecure query() ( not prepared ) with renamed function :)

<?php

class MyPDO extends PDO{

 

    const PARAM_host=&#39;localhost&#39;;   

    const PARAM_port=&#39;3306&#39;;   

    const PARAM_db_name=&#39;test&#39;;   

    const PARAM_user=&#39;root&#39;;   

    const PARAM_db_pass=&#39;&#39;;   

    public function __construct($options=null){

        parent::__construct(&#39;mysql:host=&#39;.MyPDO::PARAM_host.&#39;;port=&#39;.MyPDO::PARAM_port.&#39;;dbname=&#39;.MyPDO::PARAM_db_name,

MyPDO::PARAM_user,

MyPDO::PARAM_db_pass,$options);

    }   

    public function query($query){

    //secured query with prepare and execute

        $args = func_get_args();

        array_shift($args);

        //first element is not an argument but the query itself, should removed

 

        $reponse = parent::prepare($query);       

        $reponse->execute($args);       

        return $reponse;

 

    }   

    public function insecureQuery($query){

    //you can use the old query at your risk ;) and should use secure quote() function with it

        return parent::query($query);

    }

 

}

$db = new MyPDO();$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);

$t1 = isset($_GET["t1"])?$_GET["t1"]:1;

// need to be securised for injonction$t2 = isset($_GET["t2"])?$_GET["t2"]:2;

// need to be securised for injonction$t3 = isset($_GET["t3"])?$_GET["t3"]:3;

// need to be securised for injonction$ret = $db->query("SELECT * FROM table_test WHERE t1=? AND t2=? AND t3=?",$t1,$t2,$t3);

//$ret = $db->insecureQuery("SELECT * FROM table_test WHERE t1=".$db->quote($t1));

while ($o = $ret->fetch())

{   

echo $o->nom.PHP_EOL;

}

?>

[#4] lkmorlan at uwaterloo dot ca [2011-01-04 07:25:38]

 

You may also have to edit /etc/freetds.conf. Make sure the TDS version is recent, e.g., "tds version = 8.0".

 

[#5] lkmorlan at uwaterloo dot ca [2010-06-29 09:38:33]

 

This works to get UTF8 data from MSSQL:<?php$db = new PDO(&#39;dblib:host=your_hostname;dbname=your_db;charset=UTF-8&#39;, $user, $pass);?>[#6] jose at thezcompany dot com [2010-02-17 12:39:09]

 

I ran into a real annoying bug/feature when using PDO for SQL statements that use SQL user variables.  I was working on some logic for a Geo Proximity Search for an events-venues system (sharing is caring so it&#39;s below) and it just wouldn&#39;t take and the errors returned were garbage. The SQL was sound as I verified it.  So if you&#39;re having this issue, I hope this helps.  What you need to do is break apart the query into two...

 

From:

<?php

$sql="set @latitude=:lat;

set @longitude=:lon;

set @radius=20;

 

set @lng_min = @longitude - @radius/abs(cos(radians(@latitude))*69);

set @lng_max = @longitude + @radius/abs(cos(radians(@latitude))*69);

set @lat_min = @latitude - (@radius/69);

set @lat_max = @latitude + (@radius/69);

 

SELECT *,

3956 * 2 * ASIN(SQRT(POWER(SIN((@latitude - ABS(venue_lat)) * PI()/180 / 2),2) + COS(@latitude * PI()/180) * COS(ABS(venue_lat) * PI()/180) * POWER(SIN((@longitude - venue_lon) * PI()/180 / 2),2))) AS distance

FROM events LEFT JOIN venues ON venues.venue_id = events.venue_fk

WHERE (venue_lon BETWEEN @lng_min AND @lng_max)

AND (venue_lat BETWEEN @lat_min and @lat_max)

AND events.event_date >= CURDATE()

AND events.event_time >= CURTIME()

ORDER BY distance DESC;";$stmt = $this->_db->prepare($sql);$stmt->bindParam(&#39;:lat&#39;, $lat, PDO::PARAM_STR);$stmt->bindParam(&#39;:lon&#39;, $lon, PDO::PARAM_STR);$stmt->bindParam(&#39;:offset&#39;, $offset, PDO::PARAM_INT);

$stmt->bindParam(&#39;:max&#39;, $max, PDO::PARAM_INT);$stmt->execute();?>  To:<?php$sql = "SET @latitude=:lat;

SET @longitude=:lon;

SET @radius=20;

SET @lng_min=@longitude - @radius/abs(cos(radians(@latitude))*69);

SET @lng_max=@longitude + @radius/abs(cos(radians(@latitude))*69);

SET @lat_min=@latitude - (@radius/69);

SET @lat_max=@latitude + (@radius/69);";

 

$this->_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);$stmt = $this->_db->prepare($sql);$stmt->bindParam(&#39;:lat&#39;, $lat, PDO::PARAM_STR);$stmt->bindParam(&#39;:lon&#39;, $lon, PDO::PARAM_STR);$stmt->execute();$sql = "SELECT *,

(3956 * 2 * ASIN(SQRT(POWER(SIN((@latitude - ABS(venue_lat)) * PI()/180 / 2),2) + COS(@latitude * PI()/180) * COS(ABS(venue_lat) * PI()/180) * POWER(SIN((@longitude - venue_lon) * PI()/180 / 2),2)))) AS distance

FROM events LEFT JOIN venues ON venues.venue_id = events.venue_fk

WHERE (venue_lon BETWEEN @lng_min AND @lng_max)

AND (venue_lat BETWEEN @lat_min and @lat_max)

AND events.event_date >= CURDATE()

AND events.event_time >= CURTIME()

ORDER BY distance DESC

LIMIT :offset,:max;";$stmt = $this->_db->prepare($sql);

$stmt->bindParam(&#39;:offset&#39;, $offset, PDO::PARAM_INT);

$stmt->bindParam(&#39;:max&#39;, $max, PDO::PARAM_INT);$stmt->execute();?>Hope this helps anyone out there!

 

[#7] paul dot maddox at gmail dot com [2009-08-27 05:54:14]

 

I decided to create a singleton wrapper for PDO that ensures only one instance is ever used.

It uses PHP 5.3.0&#39;s __callStatic functionality to pass on statically called methods to PDO.

 

This means you can just call it statically from anywhere without having to initiate or define the object.

 

Usage examples:<?php DB::exec("DELETE FROM Blah");

 

foreach( DB::query("SELECT * FROM Blah") as $row){

        print_r($row);

}

?>

Code:

<?php

class DB {

 

    private static $objInstance;

 

 

    private function __construct() {} 

 

 

    private function __clone() {}

 

 

    public static function getInstance(  ) {

 

        if(!self::$objInstance){

            self::$objInstance = new PDO(DB_DSN, DB_USER, DB_PASS);

            self::$objInstance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        }

 

        return self::$objInstance;

 

    } # end method

 

 

    final public static function __callStatic( $chrMethod, $arrArguments ) {

 

        $objInstance = self::getInstance();

 

        return call_user_func_array(array($objInstance, $chrMethod), $arrArguments);

 

    } # end method }

?>

[#8] rijnzael at gmail dot com [2008-09-04 13:46:40]

 

If you plan on using prepared statements to issue a series of KILLs, think again.  PDO apparently does not support this, and will tell you, assuming you don&#39;t put any parameters in the statement (a situation in which it would be pointless to use prepared statements anyway).  If you do specify some ?-mark parameters, it will just spit out an error that doesn&#39;t help at all.

 

[#9] cmcculloh [2008-06-25 12:14:44]

 

It appears that PDO SQL statements can not make use of  comments. Or at least, when I was trying to use them with mine it was crashing without error and giving me a blank page (even though I surrounded with try catch block).

 

[#10] ob.php from daevel.fr [2007-12-30 12:57:48]

 

Be careful with PDO extends : if you use the smileaf&#39;s example, PDO will close the connection only at the end of the script, because of the "array( $this )" parameter used with the setAttribute() method.

 

Instead, I use only this :

    $this->setAttribute( PDO::ATTR_STATEMENT_CLASS, array( $this->statementClassName, array() ) );

 

And in prepare() and query() method you can populate the "dbh" if you really need it.

 

[#11] neonmandk at gmail dot com [2007-12-10 04:29:51]

 

If you will make a OBJ row from PDO you can use this eg.

 

$resKampange = $dbc->prepare( "SELECT * FROM Table LIMIT 1" );

$resKampange->execute();

$rowKampange = $resKampange->fetch( PDO::FETCH_OB );

 

echo $rowKampange->felt1;

 

Good lock :0)

 

[#12] Ostap [2007-12-03 02:08:04]

 

There is a book titled "Learning PHP Data Objects" written by Dennis Popel and published by Packt. There is a post with further links (ordering, reviews) at author&#39;s blog: http://www.onphp5.com/article/58

 

[#13] nospam dot list at unclassified dot de [2007-11-13 16:24:31]

 

When using persistent connections, pay attention not to leave the database connection in some kind of locked state. This can happen when you start a transaction by hand (i.e. not through the PDO->beginTransaction() method), possibly even acquire some locks (e.g. with "SELECT ... FOR UPDATE", "LOCK TABLES ..." or in SQLite with "BEGIN EXCLUSIVE TRANSACTION") and then your PHP script ends with a fatal error, unhandled exception or under other circumstances that lead to an unclean exit.

 

To use that database again, it may then be necessary to disable the persistence attribute to get a new database connection or restart the web server. (Persistent connections should not work with a PHP-CGI anyway.) It does not work (tested with PHP 5.2.3/WinXP and SQLite) to close a persistent database connection - it will not actually be closed but instead returned to PDO&#39;s connection pool.

 

The only thing you can do to resolve the lock as a regular user (I imagine) is to try and get all of your persistent connections in a single script and unlock the tables resp. end the transactions with the appropriate SQL statements ("UNLOCK TABLES" in MySQL, "ROLLBACK" for transactions). Should they fail, there is no problem, but one or some of them might succeed and thereby resolve your locking problem.

 

[#14] xorinox at vtxmail dot ch [2007-11-04 15:52:25]

 

I have seen a lot of user struggling with calling mysql procedures with in/out/inout parameters using bindParam. There seems to be a bug or missing feature within the mysql C api. This at least I could find out after reading a lot of posts at different places...

 

At the moment I workaround it like below. $con is a PDO object:

<?php

//in$proc = $con->prepare( "call proc_in( @i_param )" );

$con->query( "set @i_param = &#39;myValue&#39;" );

$proc->execute();

//out$proc = $con->prepare( "call proc_out( @o_param )" );

$proc->execute();$o_param = $con->query( "select @o_param" )->fetchColumn();

//inout$proc = $con->prepare( "call proc_inout( @io_param )" );

$con->query( "set @io_param = &#39;myValue&#39;" );$proc->execute();

$io_param = $con->query( "select @io_param" )->fetchColumn();

?>

[#15] Konstantin at Tokar dot ru [2007-10-16 08:34:21]

 

Example 5:

<?php

try $dbh = new PDO(&#39;odbc:SAMPLE&#39;, &#39;db2inst1&#39;, &#39;ibmdb2&#39;,      array(PDO::ATTR_PERSISTENT => true));

.......

}

catch (Exception $e) { 

$dbh->rollBack(); 

echo "Failed: " . $e->getMessage();

}

?>

 We must change the last two lines to catch the error connecting to the database:

 

} catch (Exception $e) {

  echo "Failed: " . $e->getMessage();

  $dbh->rollBack();

}

?>

 

[#16] anton dot clarke at sonikmedia dot com [2007-09-02 12:12:59]

 

Not all PDO drivers return a LOB as a file stream;

mysql 5 is one example. Therefore when streaming a mime typed object from the database you cannot use fpassthru.

 

The following is a modified example that works with a mysql database. (Tested FreeBSD v 6.2 with mysql 5.0.45 and php 5.2.3)

 

<?php

ob_start();

$db = new PDO(&#39;mysql:host=localhost;dbname=<SOMEDB>&#39;, &#39;<USERNAME>&#39;, &#39;PASSWORD&#39;);

$stmt = $db->prepare("select contenttype, imagedata from images where id=?");

$stmt->execute(array($_GET[&#39;id&#39;]));

$stmt->bindColumn(1, $type, PDO::PARAM_STR, 256);

$stmt->bindColumn(2, $lob, PDO::PARAM_LOB);$stmt->fetch(PDO::FETCH_BOUND);

ob_clean();

header("Content-Type: $type");echo $lob;

// fpassthru reports an error that $lob is not a stream so echo is used in place.ob_end_flush();

?>

Please note the inclusion of buffer control. I only needed this when using &#39;include&#39;,&#39;include_once&#39;,&#39;require&#39;, or &#39;require_once&#39; - my feeling is there is a subtle issue with those options as even an empty include file caused a buffer issue for me. === AND YES, I DID CHECK MY INCLUDE FILES DID NOT HAVE SPURIOUS WHITESPACE ETC OUTSIDE THE  <?php ?>  DELIMITERS! ===

 

[#17] metalim [2007-05-25 05:38:07]

 

From Oracle example:<?php$stmt->beginTransaction();$stmt->execute();$stmt->commit();?>PDOStatement has no beginTransaction(), nor commit(). Please fix documentation.

 

[#18] bart at mediawave dot nl [2007-05-23 07:57:00]

 

It seems MySQL doesn&#39;t support scrollable cursors. So unfortunately PDO::CURSOR_SCROLL wont work.

 

[#19] djlopez at gmx dot de [2007-03-12 05:04:53]

 

Note this:

 

Won&#39;t work:

$sth = $dbh->prepare(&#39;SELECT name, colour, calories FROM fruit WHERE ? < ?&#39;);THIS WORKS!

$sth = $dbh->prepare(&#39;SELECT name, colour, calories FROM fruit WHERE calories < ?&#39;);Parameters cannot be applied on column names!!

 

[#20] smileaf at smileaf dot org [2007-03-01 10:57:14]If you intend on extending PDOStatement and your using setAttribute(PDO::ATTR_STATEMENT_CLASS, ...)you must override the __construct() of your PDOStatement class.failure to do so will result in an error on any PDO::query() call.Warning: PDO::query() [function.PDO-query]: SQLSTATE[HY000]: General error: user-supplied statement does not accept constructor argumentsHere is a minimum PDO and PDOStatement class<?phpclass Database extends PDO {

    function __construct($dsn, $username="", $password="", $driver_options=array()) {

        parent::__construct($dsn,$username,$password, $driver_options);       

        $this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array(&#39;DBStatement&#39;, array($this)));

    }

}class DBStatement extends PDOStatement {

    public $dbh;   

    protected function __construct($dbh) {

        $this->dbh = $dbh;

    }

}

?>

[#21] php at moechofe dot com [2007-02-17 11:52:59]Simple example to extends PDO

<?php

class connexion extends PDO{

  public $query = null; 

  public function prepare( $statement, $driver_options = array() )

  {

    $this->query = $statement;   

    return parent::prepare( $statement, $driver_options = array() );

  

  public function last_query()

  {

    return $this->query;

  }

}

class connexion_statement extends PDOStatement{

  protected $pdoprotected function __construct($pdo)

  {

     $this->pdo = $pdo;

  

  // return first column of first row

  public function fetchFirst()

  {

    $row = $this->fetch( PDO::FETCH_NUM );   

    return $row[0];

  

  // real cast number

  public function fetch( $fetch_style = null, $cursor_orientation = null, $cursor_offset = null )

  {

    $row = parent::fetch( $fetch_style, $cursor_orientation, $cursor_offset );   

    if( is_array($row) )     

    foreach( $row as $key => $value )       

    if( strval(intval($value)) === $value )         

    $row[$key] = intval($value);       

    elseif( strval(floatval($value)) === $value )         

    $row[$key] = floatval($value);    return $row;

  

  // permit $prepare->execute( $arg1, $arg2, ... );

  public function execute( $args = null )

  {

    if( is_array( $args ) )     

    return parent::execute( $args );    else

    {     

    $args = func_get_args();     

    return eval( &#39;return parent::execute( $args );&#39; );

    }

  public function last_query()

  {

    return $this->pdo->last_query();

  }

}

$pdo = new connexion( ... );

$pdo->setAttribute( PDO::ATTR_STATEMENT_CLASS, array( &#39;connexion_statement&#39;, array($pdo) ) );

?>

[#22] webform at aouie dot website [2006-09-27 23:38:02]If you use $dbh = new PDO(&#39;pgsql:host=localhost;

dbname=test_basic01&#39;, $user, $pass);

and you get the following error:PHP Fatal error:  Uncaught exception &#39;PDOException&#39; with message &#39;SQLSTATE[08006] [7] could not connect to server: Connection refused\n\tIs the server running on host "localhost" and accepting\n\tTCP/IP connections on port 5432?&#39;then as pointed out under pg_connect at: http://www.php.net/manual/en/function.pg-connect.php#38291 ******you should try to leave the host= and port= parts out of the connection string. This sounds strange, but this is an "option" of Postgre. If you have not activated the TCP/IP port in postgresql.conf then postgresql doesn&#39;t accept any incoming requests from an TCP/IP port. If you use host= in your connection string you are going to connect to Postgre via TCP/IP, so that&#39;s not going to work. If you leave the host= part out of your connection string you connect to Postgre via the Unix domain sockets, which is faster and more secure, but you can&#39;t connect with the database via any other PC as the localhost.******Sincerely,Aouie[#23] djlopez at gmx dot de [2006-08-30 14:56:04]Please note this:Won&#39;t work:$sth = $dbh->prepare(&#39;SELECT name, colour, calories FROM ?  WHERE calories < ?&#39;);THIS WORKS!

$sth = $dbh->prepare(&#39;SELECT name, colour, calories FROM fruit WHERE calories < ?&#39;);The parameter cannot be applied on table names!!

 

[#24] paulius_k at yahoo dot com [2006-07-25 08:42:58]If you need to get Output variable from MSSQL stored procedure, try this :-- PROCEDURECREATE PROCEDURE spReturn_Int @err int OUTPUT ASSET @err = 11GO$sth = $dbh->prepare("EXECUTE spReturn_Int ?");

$sth->bindParam(1, $return_value, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT);

$sth->execute();

print "procedure returned $return_value\n";

 

[#25] nicolas at serpe dot org [2006-05-21 12:36:29]

 

I use PDO with the ODBC driver to query stored procedures in a MS SQL Server 2005 Database under Windows XP Professional with IIS 5 and PHP 5.1.4. You may have the same problems with a different configuration.

 

I experienced 2 very time consuming errors:

 

1. The first one is when you return the result of a SELECT query, and you get the following clueless message:

>>> Fatal error: Uncaught exception &#39;PDOException&#39; with message &#39;SQLSTATE[24000]: Invalid cursor state: 0 [Microsoft][SQL Native Client]Invalid cursor state (SQLFetchScroll[0] at ext\pdo_odbc\odbc_stmt.c:372)&#39; in (YOUR_TRACE_HERE) <<<Your exact message may be different, the part to pay attention to is "Invalid cursor state".-> I found that I had this error because I didn&#39;t include "SET NOCOUNT ON" in the *body* of the stored procedure. By default the server returns a special piece of information along with the results, indicating how many rows were affected by the stored procedure, and that&#39;s not handled by PDO.

 

2. The second error I had was:

>>> Fatal error: Uncaught exception &#39;PDOException&#39; with message &#39;SQLSTATE[22003]: Numeric value out of range: 0 [Microsoft][SQL Native Client]Numeric value out of range (SQLFetchScroll[0] at ext\pdo_odbc\odbc_stmt.c:372)&#39; in (YOUR_TRACE_HERE) <<<Another meaningless error "Numeric value out of range"... -> I was actually returning a date datatype (datetime or smalldatetime) "as is", that is, without converting it to varchar before including it in the result set... I don&#39;t know if PDO is responsible for converting it to a PHP datatype, but it doesn&#39;t. Convert it before it reaches PHP.

 

[#26] pokojny at radlight dot com [2006-04-23 08:50:58]

 

I wanted to extend PDO class to store statistics of DB usage, and I faced some problems. I wanted to count number of created statements and number of their executings. So PDOStatement should have link to PDO that created it and stores the statistical info. The problem was that I didn&#39;t knew how PDO creates PDOStatement (constructor parameters and so on), so I have created these two classes:<?php

 

    class PDOp {

        protected $PDO;       

        public $numExecutes;       

        public $numStatements;       

        public function __construct($dsn, $user=NULL, $pass=NULL, $driver_options=NULL) {

            $this->PDO = new PDO($dsn, $user, $pass, $driver_options);           

            $this->numExecutes = 0;           

            $this->numStatements = 0;

        }       

        public function __call($func, $args) {

            return call_user_func_array(array(&$this->PDO, $func), $args);

        }       

        public function prepare() {

            $this->numStatements++;           

            $args = func_get_args();           

            $PDOS = call_user_func_array(array(&$this->PDO, &#39;prepare&#39;), $args);           

            return new PDOpStatement($this, $PDOS);

        }        public function query() {

            $this->numExecutes++;           

            $this->numStatements++;           

            $args = func_get_args();           

            $PDOS = call_user_func_array(array(&$this->PDO, &#39;query&#39;), $args);           

            return new PDOpStatement($this, $PDOS);

        }       

        public function exec() {

            $this->numExecutes++;           

            $args = func_get_args();           

            return call_user_func_array(array(&$this->PDO, &#39;exec&#39;), $args);

        }

    }    class PDOpStatement implements IteratorAggregate {

        protected $PDOS;       

        protected $PDOp;       

        public function __construct($PDOp, $PDOS) {

            $this->PDOp = $PDOp;           

            $this->PDOS = $PDOS;

        }       

        public function __call($func, $args) {

            return call_user_func_array(array(&$this->PDOS, $func), $args);

        }       

        public function bindColumn($column, &$param, $type=NULL) {

            if ($type === NULL)               

            $this->PDOS->bindColumn($column, $param);           

            else

                $this->PDOS->bindColumn($column, $param, $type);

        }       

        public function bindParam($column, &$param, $type=NULL) {

            if ($type === NULL)               

            $this->PDOS->bindParam($column, $param);           

            else

                $this->PDOS->bindParam($column, $param, $type);

        }       

        public function execute() {

            $this->PDOp->numExecutes++;           

            $args = func_get_args();           

            return call_user_func_array(array(&$this->PDOS, &#39;execute&#39;), $args);

        }       

        public function __get($property) {

            return $this->PDOS->$property;

        }       

        public function getIterator() {

            return $this->PDOS;

        }

   }

   ?>

   Classes have properties with original PDO and PDOStatement objects, which are providing the functionality to PDOp and PDOpStatement.

From outside, PDOp and PDOpStatement look like PDO and PDOStatement, but also are providing wanted info.

 

[#27] keyvez at hotmail dot com [2006-03-09 12:49:40]

 

PDO doesn&#39;t return OUTPUT params from mssql stored procedures<?php

    $Link = new PDO(&#39;mssql:host=sqlserver;dbname=database&#39;, &#39;username&#39;,&#39;password&#39;);   

    $ErrorCode = 0;    $Stmt = $Link->prepare(&#39;p_sel_all_termlength ?&#39;);   

    $Stmt->bindParam(1,$ErrorCode,PDO::PARAM_INT,4);   

    $Stmt->execute();   

    echo "Error = " . $ErrorCode . "\n";

    ?>

[#28] www.navin.biz [2006-02-19 10:16:04]

 

Below is an example of extending PDO & PDOStatement classes:<?phpclass Database extends PDO{

    function __construct()

    {

        parent::__construct(&#39;mysql:dbname=test;host=localhost&#39;, &#39;root&#39;, &#39;&#39;);        $this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array(&#39;DBStatement&#39;, array($this)));

    }

}class DBStatement extends PDOStatement{

    public $dbh;    protected function __construct($dbh)

    {

        $this->dbh = $dbh;        $this->setFetchMode(PDO::FETCH_OBJ);

    }    public function foundRows()

    {

        $rows = $this->dbh->prepare(&#39;SELECT found_rows() AS rows&#39;, array(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => TRUE));        $rows->execute();        $rowsCount = $rows->fetch(PDO::FETCH_OBJ)->rows;        $rows->closeCursor();        return $rowsCount;

    }

}?>

[#29] Dariusz Kielar [2006-02-12 22:50:42]

 

I found a nice pdo modification written in php called Open Power Driver. It has identical API with the original, but allows you to cache query results: http://www.openpb.net/opd.php

 

[#30] shaolin at adf dot nu [2006-02-07 18:18:50]

 

If your having problems re-compiling PHP with PDO as shared module try this.

 

--enable-pdo=shared

--with-pdo-mysql=shared,/usr/local/mysql

--with-sqlite=shared

--with-pdo-sqlite=shared

 

1. If PDO is built as a shared modules, all PDO drivers must also be

built as shared modules.

2. If ext/pdo_sqlite is built as a shared module, ext/sqlite must also

be built as a shared module.

3. In the extensions entries, if ext/pdo_sqlite is built as a shared

module, php.ini must specify pdo_sqlite first, followed by sqlite.

 

[#31] tomasz dot wasiluk at gmail dot com [2006-01-01 04:09:06]

 

Watch out for putting spaces in the DSN

mysql:host=localhost;dbname=test works

mysql: host = localhost; dbname=test works

mysql: host = localhost; dbname = test doesn&#39;t work...

 

[#32] Matthias Leuffen [2005-12-04 01:36:13]

 

Hi there,

 

because of ZDE 5.0 and other PHP-IDEs do not seem to support PDO from PHP5.1 in code-completion-database yet, I wrote a code-completion alias for the PDO class.

NOTE: This Class has no functionality and should be only included to your IDE-Project but NOT(!) to your application.<?phpclass PDO {const ERR_ALREADY_EXISTS = 0;const ERR_CANT_MAP = 0;const ERR_NOT_FOUND = 0;const ERR_SYNTAX = 0;const ERR_CONSTRAINT = 0;const ERR_MISMATCH = 0;const ERR_DISCONNECTED = 0;const ERR_NONE = 0;const ATTR_ERRMODE = 0;const ATTR_TIMEOUT = 0;const ATTR_AUTOCOMMIT = 0;const ATTR_PERSISTENT = 0;// Values for ATTR_ERRMODEconst ERRMODE_EXCEPTION = 0;const ERRMODE_WARNING = 0;const FETCH_ASSOC = 0;const FETCH_NUM = 0;const FETCH_OBJ = 0;public function __construct($uri, $user, $pass, $optsArr) {}public function prepare ($prepareString) {}public function query ($queryString) {}public function quote ($input) {}public function exec ($statement) {}public function lastInsertId() {}public function beginTransaction () {}public function commit () {}public function rollBack () {}public function errorCode () {}public function errorInfo () {}  

}class PDOStatement {public function bindValue ($no, $value) {}public function fetch () {}public function nextRowset () {}public function execute() {}public function errorCode () {}public function errorInfo () {}public function rowCount () {}public function setFetchMode ($mode) {}public function columnCount () {}

}

 

[#33] ng4rrjanbiah at rediffmail dot com [2005-03-15 22:53:49]Some useful links on PDO:1. PDO Wiki ( http://wiki.cc/php/PDO )2. Introducing PHP Data Objects ( http://netevil.org/downloads/Introducing-PDO.ppt ), [226 KB], Wez Furlong, 2004-09-243. The PHP 5 Data Object (PDO) Abstraction Layer and Oracle ( http://www.oracle.com/technology/pub/articles/php_experts/otn_pdo_oracle5.html ), [60.85 KB], Wez Furlong, 2004-07-284. PDO - Why it should not be part of core PHP! ( http://www.akbkhome.com/blog.php/View/55/ ), Critical review, [38.63 KB], Alan Knowles, 2004-10-22

Copy after login

Related recommendations:

PHP uses pdo to connect to the access database and display data operations in a loop

The above is the detailed content of PDO operation of php. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

PHP 8.4 Installation and Upgrade guide for Ubuntu and Debian PHP 8.4 Installation and Upgrade guide for Ubuntu and Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 brings several new features, security improvements, and performance improvements with healthy amounts of feature deprecations and removals. This guide explains how to install PHP 8.4 or upgrade to PHP 8.4 on Ubuntu, Debian, or their derivati

7 PHP Functions I Regret I Didn't Know Before 7 PHP Functions I Regret I Didn't Know Before Nov 13, 2024 am 09:42 AM

If you are an experienced PHP developer, you might have the feeling that you’ve been there and done that already.You have developed a significant number of applications, debugged millions of lines of code, and tweaked a bunch of scripts to achieve op

How To Set Up Visual Studio Code (VS Code) for PHP Development How To Set Up Visual Studio Code (VS Code) for PHP Development Dec 20, 2024 am 11:31 AM

Visual Studio Code, also known as VS Code, is a free source code editor — or integrated development environment (IDE) — available for all major operating systems. With a large collection of extensions for many programming languages, VS Code can be c

Explain JSON Web Tokens (JWT) and their use case in PHP APIs. Explain JSON Web Tokens (JWT) and their use case in PHP APIs. Apr 05, 2025 am 12:04 AM

JWT is an open standard based on JSON, used to securely transmit information between parties, mainly for identity authentication and information exchange. 1. JWT consists of three parts: Header, Payload and Signature. 2. The working principle of JWT includes three steps: generating JWT, verifying JWT and parsing Payload. 3. When using JWT for authentication in PHP, JWT can be generated and verified, and user role and permission information can be included in advanced usage. 4. Common errors include signature verification failure, token expiration, and payload oversized. Debugging skills include using debugging tools and logging. 5. Performance optimization and best practices include using appropriate signature algorithms, setting validity periods reasonably,

How do you parse and process HTML/XML in PHP? How do you parse and process HTML/XML in PHP? Feb 07, 2025 am 11:57 AM

This tutorial demonstrates how to efficiently process XML documents using PHP. XML (eXtensible Markup Language) is a versatile text-based markup language designed for both human readability and machine parsing. It's commonly used for data storage an

PHP Program to Count Vowels in a String PHP Program to Count Vowels in a String Feb 07, 2025 pm 12:12 PM

A string is a sequence of characters, including letters, numbers, and symbols. This tutorial will learn how to calculate the number of vowels in a given string in PHP using different methods. The vowels in English are a, e, i, o, u, and they can be uppercase or lowercase. What is a vowel? Vowels are alphabetic characters that represent a specific pronunciation. There are five vowels in English, including uppercase and lowercase: a, e, i, o, u Example 1 Input: String = "Tutorialspoint" Output: 6 explain The vowels in the string "Tutorialspoint" are u, o, i, a, o, i. There are 6 yuan in total

Explain late static binding in PHP (static::). Explain late static binding in PHP (static::). Apr 03, 2025 am 12:04 AM

Static binding (static::) implements late static binding (LSB) in PHP, allowing calling classes to be referenced in static contexts rather than defining classes. 1) The parsing process is performed at runtime, 2) Look up the call class in the inheritance relationship, 3) It may bring performance overhead.

What are PHP magic methods (__construct, __destruct, __call, __get, __set, etc.) and provide use cases? What are PHP magic methods (__construct, __destruct, __call, __get, __set, etc.) and provide use cases? Apr 03, 2025 am 12:03 AM

What are the magic methods of PHP? PHP's magic methods include: 1.\_\_construct, used to initialize objects; 2.\_\_destruct, used to clean up resources; 3.\_\_call, handle non-existent method calls; 4.\_\_get, implement dynamic attribute access; 5.\_\_set, implement dynamic attribute settings. These methods are automatically called in certain situations, improving code flexibility and efficiency.

See all articles