class Db
{
protected $dbh;
public function __construct()
{
$this->dbh = new \PDO('mysql:host=127.0.0.1;dbname=test', 'root', '');
}
public function execute($sql)
{
$sth = $this->dbh->prepare($sql);
$res = $sth->execute();
return $res;
}
public function query($sql, $class)
{
$sth = $this->dbh->prepare($sql);
$res = $sth->execute();
if (false !== $res) {
return $sth->fetchAll(\PDO::FETCH_CLASS, $class);
}
return [];
}
}
...$arr
. Но у меня просто белое полотно в голове, когда я пытаюсь понять, как же это дело осуществить.$stmt->execute([':age' => 20]);
...$arr
вы не получите ключи в массиве. Поэтому почему бы не сделать третий агрумент обычным агрументом, и не передавать туда массив, который без изменений будет передаваться в execute?public function query($sql, $class, $params){ // $params = [":age"=>20]
$sth = $this->dbh->prepare($sql);
$res = $sth->execute($params); // <----
if (false !== $res) {
return $sth->fetchAll(\PDO::FETCH_CLASS, $class);
}
return [];
}
function db($query, $arr=false){
global $mysqli;
if(!$mysqli or isset($mysqli)){
$mysqli = new mysqli('localhost', 'user', '???', 'db');
$mysqli->set_charset("utf8");
}
$stmt = $mysqli->stmt_init();
if($stmt->prepare($query)){
if(is_array($arr)){
$refarg = array($stmt, str_pad('', count($arr), 's'));
foreach ($arr as $key => $value){
$refarg[] =& $arr[$key];
}
call_user_func_array("mysqli_stmt_bind_param", $refarg);
}
$stmt->execute();
$qb = $stmt->get_result();
if(preg_match("/select (.*)/i", $query)){
if(preg_match("/(.*) limit 1/i", $query)){
$result = mysqli_fetch_array($qb);
}else{
$result = array();
while($arr = mysqli_fetch_array($qb)){
$result[] = $arr;
}
}
}elseif(preg_match("/insert (.*)/i", $query)){
$result = $mysqli->insert_id;
}else{
$result = true;
}
$stmt->close();
}else{
$result = false;
}
return $result;
}
public function query($sql, $params = NULL){
$sth = $this->dbh->prepare($sql);
$sth->execute($params); // <----
return $sth;
}
$db->query("DELETE FROM t WHERE id=?", [$id]);
$count = $db->query("SELECT count(*) FROM t")->fetchColumn();
$list = $db->query("SELECT count(*) FROM t")->fetchAll(\PDO::FETCH_CLASS, "class");
public function listObjects($sql, $class, $params){
return $this->query($sql, $params)->fetchAll(\PDO::FETCH_CLASS, $class);
}