我有以下方法:( Codeigniter模型)
/**
* Get an Ad based on its hash
*
* @param $hash
* @return bool
*/
public function getAdbyHash($hash)
{
$this->db->select('category.id as category_id, category.subcat as category_name, provinces.id as provinces_id, provinces.prov_name, users.id as users_id, users.*, ads.*');
$this->db->where('ads.hash', $hash);
$this->db->join('category', 'category.id = ads.subcat_id');
$this->db->join('provinces', 'provinces.id = ads.province_id');
$this->db->join('users', 'users.id = ads.user_id', 'left');
$r = $this->db->get('ads');
//echo $this->db->last_query();
if ($r->num_rows() == 1) {
$ad = $r->result()[0];
return $ad;
}
return FALSE;
}
它的工作正常。但今天我试图破解自己在URL中引入类似的哈希,以及它的工作,但这并不是理想的行为。
所以这个哈希:edit / zIpM41NkS8igFXaC必须与edit / zIpM41NkS8igFXac相同
注意最后一个字符(C / c) 如何查询区分大小写?
我的方法是使用Codeigniter的特定方法而不使用直接SQL语句。但无论如何都是有效的。
答案 0 :(得分:2)
尝试:
path
$ this-> db->其中()接受可选的第三个参数。如果你设置它 为FALSE,CodeIgniter不会尝试保护您的字段或表格 带反叛的名字。 的 CodeIgniter Doc. Where 强>
要清理数据,您可以尝试以下方法:
$this->db->where('ads.hash like binary "'.$hash.'"', NULL, FALSE)
答案 1 :(得分:2)
正如@Vixed建议的那样,您可以修改where
条件。
但是,您也可以将ads.hash
列修改为区分大小写
ALTER TABLE `ads` MODIFY `hash` VARCHAR(255) CHARACTER SET utf8 COLLATE `utf8_bin`;
请注意,对于Unicode,您只能使用utf8_bin
进行区分大小写的比较。这是因为MySQL没有区分大小写的Unicode排序规则(请参阅此post)
但如果您的排序规则为latin
,只需将其更改为latin_general_cs
。
此外,如果您的专栏中有一些特定数据,您可以查看此SO帖子 - How to change Column Collation without losing or changing data?
<强> UPD。表现说明
好吧,like binary
看起来像一个非常昂贵的操作(如上所述here)。另外,我认为您希望看到这些帖子:SQL 'like' vs '=' performance和What effects does using a binary collation have?
无论如何,它需要测试