Php PDO类和MYSQL请求
我有一个PDO类包装器: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
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;}另外,不要这样做,否则可能会重复