我正在使用Yii框架为符合条件的所有行执行条件选择。 我试图获取一个表的ID并搜索包含ID前缀的另一个表代码。 (exp ID-code或1-sdfa)。目前,下面的代码返回所有行。以下是详细信息,任何见解都会有所帮助。谢谢。
[table 1] tbl_School --------------------------- | ID | Name | --------------------------- | 1 | forist hills | | 2 | Dhs | ---------------------------
[table 2] tbl_ticket ------------------ | ID | code | ------------------ | 1 | 1-fd23s | | 2 | 2-fdet2 | | 3 | 1-4wscd | | 4 | 2-oifjd | | 5 | 1-zzds6 | ------------------
在ID = 1上运行函数后,我希望看到
------------------ | ID | code | ------------------ | 1 | 1-fd23s | | 3 | 1-4wscd | | 5 | 1-zzds6 | ------------------
这是我的代码:
public static function get_tickets($ticket_ID){
$match = '';
$match = addcslashes($match, "$ticket_ID".'_%');
$q = new CDbCriteria( array(
'condition' => "code LIKE :match",
'params' => array(':match' => "$match%")
) );
$rows = Ticket::model()->findAll( $q );
return $rows;
}
答案 0 :(得分:1)
PDO确实为您逃脱,因此您不需要自己addcslashes
(我甚至不知道存在的,总是使用addslashes
:))
其次,您最终选择了[NUMBER]_%%
,这些是3个通配符。
由于Ryan已在评论中进行了更改,您可能需要选择 - %而不是:
public static function get_tickets($ticket_ID){
$ticket_ID = intval($ticket_ID);
if (!$ticket_ID)
return null;
$q = new CDbCriteria( array(
'condition' => "code LIKE :match",
'params' => array(':match' => $ticket_ID . "-%")
) );
$rows = Ticket::model()->findAll( $q );
return $rows;
}
正如您所看到的,我确实对票号进行了数字健全性检查,就像保持谨慎一样。
最后:我希望您不要介意这个建议,但是不能将票号作为单独的列添加吗?如果此表中有很多行,您将最终遇到完全可避免的性能问题。使用单独的列作为索引,您可以使用更少的cpu来获得相同的结果。