2010-02-03 99 views
0

我有一個艱難的時間搜索zip,這不是一個問題以前,最有可能是一個MySQL/PHP程序員的一個簡單的問題。通過郵政編碼搜索MYSQL

我有一個數據庫充滿了房屋列表,我需要通過各個領域進行搜索。按城市搜索我沒問題,直到我用郵政編碼搜索(就像我說過的那樣工作)。

無論如何,這裏是我正在使用的一些代碼,因爲我希望有人能夠快速瀏覽並查看問題。


$sql = "SELECT DISTINCT 

mls_listings.c1, mls_listings_images.c1, mls_listings.c2, mls_listings.c3, mls_listings_images.c3作爲圖像, mls_listings_images.c5, mls_listings.c4, mls_listings.c5 , mls_listings.c6, mls_listings.c7, mls_listings.c8, mls_listings.c9 FROM mls_listings,mls_listings_images WHERE (mls_listings.c1 = mls_listings_images.c1) AND(mls_listings_images.c5 ='1') AND(mls_listings_images.c1 LIKE'%{$ _ GET ['uniqueid']}%') AND(mls_listings.c3 IN {$ _GET ['redondobeach']}','{$ _ GET ['santamonica']}','{$ _ GET ['specificcity']}','{$ _GET ['hermosabeach']}','{$ _GET ['elsegundo']}','{$ _ GET ['manhattanbeach']}', '{$ _GET ['marinadelrey']}','{$ _ GET ['palosverdes']}','{$ _ GET ['playadelrey']}', '{$ _GET ['playavista']}','{$ _ GET ['torrance']}','{$ _ GET ['venice']}', '{$ _GET [ '威']} '))

AND(mls_listings.c7 LIKE '%{$ _ GET [' zipwestla']}%')

AND(mls_listings.c5 LIKE '%{$ _ GET [' 牀 ']}%')

AND(mls_listings.c6 LIKE '%{$ _ GET [' 浴 ']}%')

AND(mls_listings.c4> =' {$ _GET ['minprice']}'

AND mls_listings.c4 < ='{$ _GET ['maxprice']}') ORDER BY mls_listings.c4「;


***對不起,我無法讓前/代碼工作在最後一半的代碼。

而且 -

mls_listings.c7持有郵政編碼

mls_listings.c3拿着城市名稱(即文。)**搜索按城市工作

這裏的一個例子形式的搜索裏面複選框按城市和郵政編碼:


<input type='checkbox' value='Torrance' name='torrance' class="results1"> 
Torrance<br> 
<input type='checkbox' value='Venice' name='venice' class="results1"> 
Venice<br> 
<input type='checkbox' value='90403' name='zipwestla' class="results1"> 
West LA<br> 
<input type='checkbox' value='West Chester' name='westchester' class="results1"> 
Westchester<br> 

我真的很感謝一些幫助/建議,甚至一些鏈接指導我在正確的方向。

如果您需要更多信息,請讓我知道。也來自我。

謝謝。

回答

1

開始之前: 您絕不應將用戶收到的值直接放入您的SQL中。

讓我做的事情更清楚一點幫助:

$sql = " 
SELECT DISTINCT 
    mls_listings.c1, 
    mls_listings_images.c1, 
    mls_listings.c2, 
    mls_listings.c3, 
    mls_listings_images.c3 as image, 
    mls_listings_images.c5, 
    mls_listings.c4, 
    mls_listings.c5, 
    mls_listings.c6, 
    mls_listings.c7, 
    mls_listings.c8, 
    mls_listings.c9 
FROM 
    mls_listings, 
    mls_listings_images 
WHERE 
    (mls_listings.c1 = mls_listings_images.c1) AND 
    (mls_listings_images.c5 = '1') AND 
    (mls_listings_images.c1 LIKE '%{$_GET['uniqueid']}%') AND 
    (mls_listings.c3 IN (
     '{$_GET['redondobeach']}', 
     '{$_GET['santamonica']}', 
     '{$_GET['specificcity']}', 
     '{$_GET['hermosabeach']}', 
     '{$_GET['elsegundo']}', 
     '{$_GET['manhattanbeach']}', 
     '{$_GET['marinadelrey']}', 
     '{$_GET['palosverdes']}', 
     '{$_GET['playadelrey']}', 
     '{$_GET['playavista']}', 
     '{$_GET['torrance']}', 
     '{$_GET['venice']}', 
     '{$_GET['westchester']}') 
    ) AND 
    (mls_listings.c7 LIKE '%{$_GET['zipwestla']}%') AND 
    (mls_listings.c5 LIKE '%{$_GET['beds']}%') AND 
    (mls_listings.c6 LIKE '%{$_GET['baths']}%') AND 
    (
     mls_listings.c4 >= '{$_GET['minprice']}' AND 
     mls_listings.c4 <= '{$_GET['maxprice']}' 
    ) 
ORDER BY mls_listings.c4"; 

任何複選框是取消選中將返回任何結果返回到PHP。如果您打開了錯誤,您將收到關於所有這些未勾選的框的未定義值的通知。當你嘗試使用它們時,PHP解釋器會給出一個空字符串。

現在,當您使用的城市,因爲(ml_listings.c3 IN (....))條件會找到一個匹配,並且因爲它,轉予(mls_listings.c7 LIKE '%%')(mls_listings.c7 LIKE '%{$_GET['zipwestla']}%')條件相匹配的一切工作的。

如果你只是用zipwestla搜索打勾(和我猜這是你正在嘗試),那麼(ml_listings.c3 IN (....))條件沒有相匹配,則,轉予(ml_listings.c3 IN ('','','', '','','', '','','', '','','', ''))所以除非在ml_listings.c3的入口爲空字符串有將沒有匹配。

你真的需要回去返工這一點,但既然你問這裏是我的建議:

SELECT DISTINCT 
    mls_listings.c1, 
    mls_listings_images.c1, 
    mls_listings.c2, 
    mls_listings.c3, 
    mls_listings_images.c3 as image, 
    mls_listings_images.c5, 
    mls_listings.c4, 
    mls_listings.c5, 
    mls_listings.c6, 
    mls_listings.c7, 
    mls_listings.c8, 
    mls_listings.c9 
FROM 
    mls_listings, 
    mls_listings_images 
WHERE 
    (mls_listings.c1 = mls_listings_images.c1) AND 
    (mls_listings_images.c5 = '1') AND 
    (mls_listings_images.c1 LIKE '%{$_GET['uniqueid']}%') AND 
    ((mls_listings.c3 IN (
     '{$_GET['redondobeach']}', 
     '{$_GET['santamonica']}', 
     '{$_GET['specificcity']}', 
     '{$_GET['hermosabeach']}', 
     '{$_GET['elsegundo']}', 
     '{$_GET['manhattanbeach']}', 
     '{$_GET['marinadelrey']}', 
     '{$_GET['palosverdes']}', 
     '{$_GET['playadelrey']}', 
     '{$_GET['playavista']}', 
     '{$_GET['torrance']}', 
     '{$_GET['venice']}', 
     '{$_GET['westchester']}') 
    ) OR 
    (mls_listings.c7 LIKE '%{$_GET['zipwestla']}%')) AND 
    (mls_listings.c5 LIKE '%{$_GET['beds']}%') AND 
    (mls_listings.c6 LIKE '%{$_GET['baths']}%') AND 
    (
     mls_listings.c4 >= '{$_GET['minprice']}' AND 
     mls_listings.c4 <= '{$_GET['maxprice']}' 
) 
ORDER BY mls_listings.c4 

請記住,如果沒有被選中,將返回數據庫中的一切,因爲它會很高興匹配mls_listings.c7中的所有行。因爲它看起來像你的洞,甚至可能是有用的行爲。

但是,請好的,可愛的請用頂上的櫻桃,去看手冊中的綁定變量。

+0

邁克,我非常感謝您的幫助。我只是複製你放入並粘貼的東西,現在一切都完美無瑕! 你說得對,westla值是我遇到問題的地方。此外,在這種情況下,在房地產網站上列出數據庫中的所有內容都非常有用。 哦,既然我複製並粘貼了你放的東西,我知道我不會從中學到一些東西,所以我今天會很努力的去學習。我做了一個搜索綁定變量,並提出了這個:http://dev.mysql.com/doc/refman/5.1/en/apis-php-class.mysqli-stmt.html 這是你推薦閱讀? – 2010-02-03 18:43:10

+0

很高興我能幫到你。那篇文章是一個好的開始。另一個很好的例子是http://devzone.zend.com/article/686,當然還有PHP手冊本身http://php.net/manual/en/mysqli.prepare.php。這個想法是通過從變量中分離SQL來阻止任何用戶將SQL注入到語句中。綁定時,MySQL服務器不會將變量解析爲SQL,它只會檢查變量類型,因此不會發生注入。 – Mike 2010-02-03 20:19:47

+0

太棒了!現在有時間閱讀。再次感謝邁克! – 2010-02-04 00:58:48