-1

我有一个 PDO 类包装器:

class DB {

        private $dbh;
        private $stmt;

        public function __construct($user, $pass, $dbname) {

            $dsn = 'mysql:host=localhost;dbname=' . $dbname;

            $options = array(
                PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
                PDO::ATTR_PERSISTENT => true
            );

            try {
                $this->dbh = new PDO($dsn, $user, $pass, $options);
            }
            catch (PDOException $e) {
                echo $e->getMessage();
                die();
            }
        }

        public function query($query) {
            $this->stmt = $this->dbh->prepare($query);
            return $this;
        }

        public function bind($pos, $value, $type = null) {

            if( is_null($type) ) {
                switch( true ) {
                    case is_int($value):
                        $type = PDO::PARAM_INT;
                        break;
                    case is_bool($value):
                        $type = PDO::PARAM_BOOL;
                        break;
                    case is_null($value):
                        $type = PDO::PARAM_NULL;
                        break;
                    default:
                        $type = PDO::PARAM_STR;
                }
            }

             $this->stmt->bindValue($pos, $value, $type);
             return $this;
        }

        public function execute() {
            $this->stmt->execute();
        }

        public function resultset() {
            $this->execute();
            return $this->stmt->fetchAll(PDO::FETCH_ASSOC);

        }

        public function single() {
            $this->execute();
            return $this->stmt->fetch();
        }
    }

问题1: 我有以下要求:

$ids_set = implode(",", $ids); // return 2,4
$sql = 'SELECT `id`, `qty` FROM `products` WHERE `id` IN (:products_ids) ORDER BY `id`';
$arr = $this->db->query($sql)->bind(":products_ids", $ids_set)->resultset();

但是这个请求将只返回数组中的一个元素:

Array
(
    [0] => Array
        (
            [id] => 2
            [qty] => 1
        )

)

但它应该返回两个元素。为什么以及如何修改我的课程?

问题2

我的类绑定函数对数据库注入安全吗?

问题 3

我有动态查询:

$sql    = 'SELECT COUNT(*) FROM `orders` WHERE 1=1';

if ($filter["order"] != 0) {
    $sql .= ' AND `gatewayid` = '.intval($filter["order"]).'';
}

$count  = $this->db->query($sql)->single()[0];

在这种情况下如何使用我的绑定功能?谢谢!

4

1 回答 1

2

坦率地说,我现在觉得你的课没什么。您可以使用原始 PDO 进行所有操作:

$arr = $this->db->prepare($sql)->execute([":product_id" => $id])->fetchAll();

说到绑定复杂的数据类型——唯一明智的解决方案设计额外的占位符类型。支持这样的占位符将是这个类的真正目的。

问题 1

您必须动态创建一个带有占位符的字符串,如this answer中所述

问题2

是的

问题 3

您必须动态创建查询,以及带有数据的数组以将
Shown 与 PDO 绑定,因为您的类对此非常不可靠:

$sql  = 'SELECT COUNT(*) FROM `orders` WHERE 1=1';
$data = [];
if ($filter["order"] != 0) {
    $sql .= ' AND `gatewayid` = :getewayid';
    $data[":getewayid"] = $filter["order"];
}
$count = $this->db->prepare($sql)->execute($data)->fetchColumn();
于 2013-09-04T06:01:44.787 回答