2014-03-01 39 views
-1

海兰,我敢尝试执行此代码SQL CONTAINS不起作用

public function CardsTextSearch($text){ 

    $hashed_text = md5($text); 
    echo "HASHED ".$text." IN ".$hashed_text."<br>"; 
    $result = array(); 
    $sql = "SELECT cardID,cardName FROM Cards WHERE CONTAINS(hashedCardName, '$hashed_text')"; 

    if ($sth = $this->DBH->query($sql)){ 
     //echo "PREPARED <br>"; 
     //$sth->execute(array($hashed_text)); 
     echo "EXECUTED: "; 
     var_dump($sth); 
     echo "<br>"; 
     $row = $sth->fetchAll(PDO::FETCH_ASSOC); 
     var_dump($row); 
     echo "<br>ROW: ".$row."<hr>"; 


    }else{ 
     echo "ERRORE<br>"; 
     print_r($this->DBH->errorInfo()); 
    } 
    var_dump($result); 
    echo "RESULT<hr>"; 
    return $result; 

} 

撇开因为加密的字符串(只是因为现场cardName为varchar(150)搜索的,所以不编入索引),你能告诉我,如果有代码中的任何错误,因为查询不工作,并生成输出如下:

HASHED坏月亮9e326d217f275a19ba1df92cb64be771

EXECUTED :对象(PDOS tatement)#5(1){[ “的queryString”] =>串(100) “SELECT CardId中,cardName FROM卡WHERE CONTAINS(hashedCardName, '9e326d217f275a19ba1df92cb64be771')”} 阵列(0){} ROW:数组

我确定数据库中hashedCardName ='9e326d217f275a19ba1df92cb64be771'的现有值,不太确定列hashedCardName是否已被编入索引。 这可能是该列未被编入索引或我在代码中做了什么错误?

P.S. 我也试着用$ stmt = $ this-> DBH-> prepare()和execute(),因为你可以在一些评论中看到我已经离开了。

回答

0

Contains不起作用。尝试LikeInstr

SELECT * FROM Cards 
WHERE hashCardName like '$hashed_text'; 

SELECT * FROM Cards 
WHERE INSTR(hashCardName, '$hashed_text'); 

SqlFiddle here

+0

谢谢! 我知道我可以使用喜欢,但在大数据库包含比更喜欢比perormant,必须搜索表中的所有行,而不是...和INSTR它似乎是相同的。我不知道CONTAINS不起作用。你知道为什么吗? –

+1

如果你知道哈希是完全'9e326d217f275a19ba1df92cb64be771',为什么不直接比较'hashCardName ='$ hashed_text''并在'hashCardName'上添加一个索引 - 这将是所有的最高性能:) – StuartLC

+0

就是这样。 ..我也认为,基于哈希的文本搜索没有用,因为哈希总是一个32char字符串,它对所有单词都是不同的...所以如果我输入“hello”的seacrh找不到完整的字符串“Hello World”。 –