Php PDO类和MYSQL请求

Php PDO类和MYSQL请求,php,mysql,arrays,pdo,inject,Php,Mysql,Arrays,Pdo,Inject,我有一个PDO类包装器: class DB { private $dbh; private $stmt; public function __construct($user, $pass, $dbname) { $dsn = 'mysql:host=localhost;dbname=' . $dbname; $options = array( PDO::MYSQ

我有一个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

我的类绑定函数对db注入安全吗

问题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];
在这种情况下,如何使用bind函数?
谢谢

老实说,我现在觉得你的课很没用。您可以使用原始PDO获得所有相同的结果:

$arr = $this->db->prepare($sql)->execute([":product_id" => $id])->fetchAll();
说到绑定复杂数据类型,唯一合理的解决方案是设计额外的占位符类型。支持这样的占位符将是这个类的真正目的

问题1 必须动态创建带有占位符的字符串

问题2 对

问题3 您必须动态创建查询以及要绑定数据的数组 与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();
我有一个PDO类包装捕获PDO异常$e{echo$e->getMessage;die;}另外,不要这样做,否则可能会重复