2011-11-30 27 views
4

我告訴獅身人面像索引他們的CRC32形式的一些字符串作爲屬性,像這樣:PHP缺乏無符號整數的和MySQL的CRC32功能

sql_query = SELECT [...], CRC32(LOWER(color)) AS color, [...], FROM table 

sql_attr_uint = color 

我試圖得到一些面搜索在PHP,要去往何處用戶可以點擊一個鏈接上述colors之一,獅身人面像會得到另一個搜索請求與縮小的結果,像去:

Previous page: 
<h3>Narrow down results:</h3> 
<p><a href="search.php?query=something&color=1678454">Red (11)</a></p> 
<p><a href="search.php?query=something&color=4133605867">Yellow (5)</a></p> 

<?php 
    if (isset($_GET[$name])) 
    { 
     $sphinx->SetFilter('color', intval($_GET['color'])); // <-- Uh-oh 
    } 

    [...] 

    $sphinx->Query($query, 'table'); 
?> 

事情不順心這裏,因爲MySQL的CRC32()返回一個32位無符號整數,哪個PHP非常有幫助不支持rt和2^31-1上限。上面的顏色黃色鏈接暴露了我的問題。

StackOverflow,什麼可能是一個可接受的解決方法呢?我想在SQL查詢方面做一些數學運算是可能的,但我擔心會讓更令人擔憂的碰撞機會變得更糟。

在此先感謝。

+0

如果你正在做'intval'驗證的目的(沒有奇怪的字符去獅身人面像除數字),我會去'filter_var(FILTER_SANITIZE_NUMBER_INT,$ _GET ['顏色']);'which'll允許數字,加號和減號登錄。 –

回答

2

從PHP的crc32() manual page報價:

由於PHP的整數類型是有符號的,許多crc32校驗碼將 結果負整數,你需要使用「%U」 的sprintf()或printf函數格式()獲取未簽名的 crc32校驗和的字符串表示形式。

換句話說,PHP不能處理大整數,但在這種情況下,精確,你可以模擬無符號整數,以雙精度。投射到字符串時,您可以獲得真正的價值。

這應該是足夠的,因爲你不需要做數學運算,比如加法或乘法。


更新:我想我不理你的問題的重要組成部分。而不是這樣的:

intval($_GET['color']) 

...你可以驗證或使用正則表達式過濾:

preg_match('/^\d+$/', $_GET['color']) 
preg_replace('[^\d]', '', $_GET['color']) 

...和處理CRC值的字符串。

+0

不知道獅身人面像可以把它作爲一個字符串。感謝您的洞察! – fixception