我正在将我的 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;
    }   
}
如果用户没有输入日期范围并且会导致错误,则绑定参数在这种情况下将不起作用。