预准备语句的MySQLi包装器

时间:2019-11-03 00:36:02

标签: php mysqli

很长一段时间以来,我一直在使用包装类来实现数据库功能。几年前,我对其进行了升级,以使用mysqli_而不是已贬值的mysql_函数,该函数使网站在PHP版本升级时完美地超越了。

在对包装程序进行了最近的升级时,我编写了一个类,可以从多数组中编写准备好的statemtnt,以使事情保持整洁。

这就是我做到的方式。

index.php -测试文件

/* Set Parameters
    i - integer
    d - double
    s - string
    b - BLOB
 */
 $params = array(
    array('s' => $_GET["id"]),
    array('i' => $_GET["two"])
 );

 $db->prepare("INSERT INTO `".$db->prefix."articles` SET `categoryID`= ? , `articleID`= ? ");
 $select2 = $db->execute($params);
 $db->close();     

您还可以使用其他数据集重置$params数组,然后再次$db->execute($params)插入另一行。

database.class.php

function prepare($sql) {
    $this->last_query = $sql; //Save query to show later on.
    $this->stmt = $this->conn->prepare($sql);
}

function close() {
    $this->stmt->close();
}

function execute($params) {
    $ident = '';
    $parameters = '';
    $vars = array();
    if($this->stmt) {
        foreach($params as $k => $v) {
            foreach($v as $a => $b) {
                $ident  .= $a;
                $vars[] .= $b;
                $parameters .= $a.' => '.$b.'<br>'; // For MySQL error reporting
            }
        }
        $this->stmt->bind_param( $ident , ...$vars );
        $this->parameters = $parameters;
        $this->stmt->execute();
        $result = $this->stmt->get_result();
        return $result;
    }
    else {
        if($this->conn->error) {
            $this->last_error = $this->conn->error;
            $sql = trim(preg_replace('/\s+/', ' ', $sql));
            $this->log_error("MySQL",$this->last_error." ☼ ".$sql);
        }
    }
    //$data = $result->fetch_all();
}

我的问题是:

  1. 我会让它减慢速度吗?

  2. 谁能提出更好的解决方案并使它保持整洁?我喜欢将信息排列在数组中的简洁性;并不是说这是最好的解决方案,但是它确实有效。我还没有找到一种使事情完全井井有条的好方法。

  3. 您看到这条路线有什么下降吗?

我工作的网站都将运行PHP 7.0(或者至少是PHP 5.7,直到我可以将它们升级到较新的版本为止)。

0 个答案:

没有答案