我正在将我的 mysql_.* 函数转换为 PDO。在此之前,我将通过基于其他因素连接它来构建我的查询。这是一个例子:
class carriersInfo
{
protected $start_date;
protected $end_date;
protected $data = array();
public function __construct($start = 0, $end = 0)
{
$this->start_date = $start;
$this->end_date = $end;
$this->topCarrier();
}
protected function buildQ()
{
$sql = "SELECT `shipped_by`, COUNT(`shipped_by`) AS `total` FROM `deliveries` ";
if($this->start_date!=0 and $this->end_date!=0)
{
$sql .= " WHERE ship_date>='".$this->start_date."' AND ship_date<='".$this->end_date."' ";
}
$sql .= " GROUP BY `shipped_by` ";
$sql .= " ORDER BY total ASC ";
return $sql;
}
public function topCarrier()
{
$query = $this->buildQ();
$SQL = mysql_query($query) or die(mysql_error());
while($data = mysql_fetch_array($SQL))
{
$this->data[$data['shipped_by']] = $data['total'];
}
return $this->data;
}
}
SQL 查询是根据用户是否选择指定日期范围而构建的。如何使用 PDO 准备好的语句和名称占位符达到相同的效果?
试图
class carriersInfo
{
protected $start_date;
protected $end_date;
protected $data = array();
protected $_INSTANCE;
public function __construct($start = 0, $end = 0)
{
$this->_INSTANCE = Core::getInstance();
$this->start_date = $start;
$this->end_date = $end;
$this->topCarrier();
}
protected function buildQ()
{
$sql = "SELECT `shipped_by`, COUNT(`shipped_by`) AS `total` FROM `deliveries` ";
if($this->start_date!=0 and $this->end_date!=0)
{
$sql .= " WHERE ship_date>=:start_date AND ship_date<=:end_date ";
}
$sql .= " GROUP BY `shipped_by` ";
$sql .= " ORDER BY total ASC ";
return $sql;
}
public function topCarrier()
{
$Q = $this->buildQ();
$query = $this->_INSTANCE->pdo->prepare($Q);
$query->bindValue(":start_date",$this->start_date);
$query->bindValue(":end_date",$this->end_date);
$query->execute();
while($data = $query->fetch())
{
$this->data[$data['shipped_by']] = $data['total'];
}
return $this->data;
}
}
如果用户没有输入日期范围并且会导致错误,则绑定参数在这种情况下将不起作用。