0

首先,我只想说,我理解不使用 CakePHP 的内置功能来查找数据会导致漏洞。但是,用户可以选择的查询中绝对没有输入。它是预先确定和配置的,因此无需注入任何东西。另外,我正在做一个联合选择,但我还没有为这种情况找到一个简单的解决方案。

我有以下表格(从 PHPmyadmin 导出)

 CREATE TABLE `orders` (
  `id` int(10) NOT NULL auto_increment,
  `userid` int(10) default NULL,
  `order_status` varchar(12) NOT NULL default 'Not Filled',
  `email` varchar(50) NOT NULL,
  `total` varchar(50) NOT NULL,
  `fullName` varchar(60) NOT NULL,
  `address` varchar(50) NOT NULL,
  `city` varchar(50) NOT NULL,
  `state` varchar(50) NOT NULL,
  `zip` varchar(15) NOT NULL,
  `created` datetime default NULL,
  `modified` datetime default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;


 CREATE TABLE `order_items` (
  `id` int(20) NOT NULL auto_increment,
  `orderid` int(10) default NULL,
  `userid` int(10) default NULL,
  `item_number` varchar(200) default NULL,
  `itemName` varchar(200) NOT NULL,
  `price` varchar(10) default NULL,
  `quantity` int(10) default NULL,
  `total` varchar(10) default NULL,
  `item_status` varchar(20) NOT NULL,
  `created` datetime default NULL,
  `modified` datetime default NULL,
  PRIMARY KEY  (`id`),
  KEY `orderid` (`orderid`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;

由于有不同数量的字段,我不能对两个表使用联合选择来选择 *。这是我的查询(使用 $this->model->query())

select  orders.id, orders.userid, orders.order_status, orders.email, orders.total, orders.fullName, orders.Address, orders.city, orders.state, orders.zip, orders.created from orders where userid = '$id' and order_status = 'filled'
UNION
select * from order_items where userid = '$id' and item_status = 'filled'"

这导致 order_items.orderid 未被选中,因此我尝试单独选择字段

select  orders.id, orders.userid, orders.order_status, orders.email, orders.total, orders.fullName, orders.Address, orders.city, orders.state, orders.zip, orders.created from orders where userid = '$id' and order_status = 'filled'
UNION
select order_items.id, order_items.orderid, order_items.userid, order_items.item_number, order_items.itemName, order_items.price, order_items.quantity, order_items.total, order_items.item_status, order_items.created, order_items.modified where userid = '$id' and item_status = 'filled'"

除了order_items.orderid 之外的所有内容都被选中。当我在 PHPmyadmin 中运行查询时,它会选择 order_items.orderid,所以我几乎可以肯定它与 CakePHP 相关。

我什至尝试将 orderid 更改为 order_id 并且它仍然跳过它

4

1 回答 1

1

没有理由编写自己的查询。

通过使用作为核心的一部分的可包含行为,可以轻松解决此问题。

我会假设OrderOrderItem是你的模型并且是相关的。Order有很多OrderItem

// Model/Order.php
public $actsAs = array('Containable'); // Attach containable to your model

// Controller/OrdersController.php
public function view($id) {
  $orders = $this->Order->find('all', array(
    'conditions' => array(
      'Order.id' => $id
    ),
    'contain' => array(
      'OrderItem'
    )
  ));
  debug($orders);
}
于 2013-06-13T09:31:20.260 回答