Look over:
<?php
namespace App\Helpers;
use Illuminate\Support\Facades\DB;
use PDO;
class DbPdo
{
protected static $dbh = null;
protected function __construct()
{
}
protected function __clone()
{
}
public static function dbh()
{
try {
$dbh = DB::connection()->getPdo();
} catch (PDOException $e) {
throw new pdoDbException($e);
}
return $dbh;
}
/**
* run raw sql queries
* @param string $sql sql command
* @return return query
*/
public static function raw($sql)
{
return self::dbh()->query($sql);
}
/**
* method for selecting records from a database
* @param string $sql sql query
* @param array $array named params
* @param object $fetchMode
* @param string $class class name
* @return array returns an array of records
*/
public static function select($sql, $array = array(), $fetchMode = PDO::FETCH_OBJ, $class = '')
{
$stmt = self::dbh()->prepare($sql);
foreach ($array as $key => $value) {
if (is_int($value)) {
$stmt->bindValue("$key", $value, PDO::PARAM_INT);
} else {
$stmt->bindValue("$key", $value);
}
}
$stmt->execute();
if ($fetchMode === PDO::FETCH_CLASS) {
return $stmt->fetchAll($fetchMode, $class);
} else {
return $stmt->fetchAll($fetchMode);
}
}
public static function selectOne($sql, $array = array(), $fetchMode = PDO::FETCH_OBJ, $class = '')
{
$stmt = self::dbh()->prepare($sql);
foreach ($array as $key => $value) {
if (is_int($value)) {
$stmt->bindValue("$key", $value, PDO::PARAM_INT);
} else {
$stmt->bindValue("$key", $value);
}
}
$stmt->execute();
if ($fetchMode === PDO::FETCH_CLASS) {
return $stmt->fetch($fetchMode, $class);
} else {
return $stmt->fetch($fetchMode);
}
}
//// several other methods:
}
Take note of this part:
public static function dbh()
{
try {
$dbh = DB::connection()->getPdo();
} catch (PDOException $e) {
throw new pdoDbException($e);
}
return $dbh;
}
It gives the instance
Note I don't use anymore
I used this for a while while converting to laravel code.
You call the methods as needed.
I also have this:
<?php
namespace App\Helpers;
require(__DIR__ . '/DbConnection.php');
use PDO;
class DbConn
{
protected static $PDOdb = null;
protected static $gp = true;
protected function __construct()
{
}
protected function __clone()
{
}
public static function PDOdb($group = true)
{
self::$gp = $group;
if (self::$PDOdb === null) {
try {
if (self::$gp === true) {
$opt = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
];
}
if (self::$gp === false) {
$opt = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"'
];
}
$dsn = DBPDO_TYPE . ':host=' . DBPDO_HOST . ';dbname=' . DBPDO_NAME . ';charset=utf8';
self::$PDOdb = new PDO($dsn, DBPDO_USER, DBPDO_PASS, $opt);
return self::$PDOdb;
} catch (PDOException $e) {
throw new pdoDbException($e);
}
} else {
return self::$PDOdb;
}
}
public static function getPdo($group = true)
{
//return $this->get();
return static::PDOdb($group);
}
}
Especially for this:
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"'
So I don't have to mess with full group by in laravel settings.
Usage:
public function myTest2_good()
{
$sql = "SELECT dc_pets.ownerid, dc_pets.petowner, COUNT(petid) AS total FROM dc_pets ";
$sql .= "WHERE dc_pets.ownerid IS NOT NULL AND dc_pets.ownerid < 5 ";
$sql .= "GROUP BY dc_pets.ownerid ";
$sth = conn::getPdo(false)->prepare($sql);
$sth->execute();
$quy = $sth->fetchAll(\PDO::FETCH_ASSOC);
echo '<pre>';
print_r($quy);
echo '</pre>';
}
Notice the
PDO::FETCH_ASSOC
The in-built pdo instance is
PDO::FETCH_OBJ