2014-03-01 42 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」。 –