PHP PDO MySQL Blob

Read PHP MySQL BLOB today to learn how to work with BLOBs. Basically:

public function insertBlob($filePath,$mime){
    $blob = fopen($filePath,'rb');
 
    $sql = "INSERT INTO files(mime,data) VALUES(:mime,:data)";
    $stmt = $this->conn->prepare($sql);
 
    $stmt->bindParam(':mime',$mime);
    $stmt->bindParam(':data',$blob,PDO::PARAM_LOB);
 
    return $stmt->execute();
}

function updateBlob($id,$filePath,$mime) {
 
    $blob = fopen($filePath,'rb');
 
    $sql = "UPDATE files
            SET mime = :mime,
            data = :data
            WHERE id = :id";
 
    $stmt = $this->conn->prepare($sql);
 
    $stmt->bindParam(':mime',$mime);
    $stmt->bindParam(':data',$blob,PDO::PARAM_LOB);
    $stmt->bindParam(':id',$id);
 
    return $stmt->execute();
 
}

public function selectBlob($id) {
 
    $sql = "SELECT mime,
            data
        FROM files
        WHERE id = :id";
 
    $stmt = $this->conn->prepare($sql);
    $stmt->execute(array(":id" => $id));
    $stmt->bindColumn(1, $mime);
    $stmt->bindColumn(2, $data, PDO::PARAM_LOB);
 
    $stmt->fetch(PDO::FETCH_BOUND);
 
    return array("mime" => $mime,
             "data" => $data);
 
}

PHP spl_autoload_register

Today I used spl_autoload_register again.

This time to load default concrete classes. For example in my framework I have a class called SlibUser:

class SlibUser extends SlibRecord {
  public static function Load( $id ) {
    $args = array( 'id' => $id );    
    $data = db()->get_row( 'select * from /*prefix*/user where id = :id', $args );
    if ( $data ) { return new User( $data ); }
    return null;
  }
}

As you can see SlibUser creates a new User. That User can be provisioned by a user of my framework, but if they don’t specify a particular User definition I give them a default implementation with spl_autoload_register, e.g.:

<?php

function load_slib_mock( $class = false ) {

  //var_dump( $class );
  
  static $classes;
  static $files;
  
  if ( ! $files ) { $files = array(); }
  
  if ( ! $classes ) {
    
    $classes = array(
        
      // URL
      'Uri',
      'UriPath',
      'UriPathBuilder',
      'UriQuery',
      'UriQueryBuilder',
      'UriQueryNode',
        
      // framework:
      'Auth',
      'Column',
      'FrontController',
      'Option',
      'OptionGroup',
      'ResourceManager',
      'Schema',
      'Settings',
      'Table',
      'Variable',
      
      // database:
      'Database',
      'DatabaseUpgrader',
        
      // ORM:
      'Browser',
      'GeoipLocation',
      'HttpAccept',
      'HttpAcceptEncoding',
      'HttpAcceptLanguage',
      'HttpMethod',
      'HttpUserAgent',
      'Partition',
      'Request',
      'Role',
      'Session',
      'SessionSettings',
      'User',
      'UserPartition',
      'UserSettings'
    );
    
  }

  if ( ! in_array( $class, $classes ) ) { return false; }

  $path = "/var/tmp/slib-$class.php";

  if ( ! file_exists( $path ) ) {
  
    $content = "<?php class $class extends Slib$class {}";

    $file = fopen( $path, 'w' );

    if ( ! $file ) { throw new IOException( "Cannot write '$file'." ); }

    fwrite( $file, $content );

    fclose( $file );
    
  }
  
  require_once( $path );
  
  return true;
  
}

// autoload handler:
spl_autoload_register( 'load_slib_mock', true, true );

PHPUnit Skeleton Generator

Today I installed PHPUnit Skeleton Generator like this:

 $ vim ~/.composer/composer.json

Added:

 "minimum-stability": "dev"

 $ composer global require 'phpunit/phpunit-skeleton-generator=*'

But… then it turned out that the interface was broken when invoking from NetBeans, so over here:

$ pear channel-discover components.ez.no
$ pear install phpunit/PHPUnit_SkeletonGenerator

Then I created a phpunit-skelgen.php file in my project and added:

#!/usr/bin/php
<?php

require_once '/usr/share/php/SebastianBergmann/PHPUnit/SkeletonGenerator/autoload.php';
require_once '/usr/share/php/SebastianBergmann/PHPUnit/SkeletonGenerator/Command.php';

SebastianBergmann\PHPUnit\SkeletonGenerator\Command::main();

Simple! :)

PDO Persistent Connection in PHP left broken if connected to dropped database

So you use PDO and specify PDO::ATTR_PERSISTENT => true. Then you drop your database. Then you open a new persistent connection and bang! Not working. The trick is to not use persistent connections to databases that may be dropped. And probably an ‘apache2ctl graceful’ after you drop a database being used by Apache…