次文化中的次文化

前言:我沒有任何社會學基礎,是以可能連「次文化」一詞都使用的並不恰當。本文嘗試粗略地描述一些同志圈中的次文化,令人難以置信的是,這些次文化常常受到同樣身處於同志圈的其他人排擠著。

相關的題目早已有許多前輩們以各種方式提出來,我再多寫一次類似的文章除了拋磚引玉之外,也希望其他因為別的原因(可能是在查網頁製作或是音樂的文章,可能是想來看我的裸照,也可能只是想要下載[卡農]時不小心蒐尋到)而來到我的部落格的網友們,能夠多一次機會接收到不同於自己目前生活圈的價值觀。

撰寫本文的另一個主要目的,則是希望已經身在某一個次文化(以本文的背景來說,就是「同志圈」)中的朋友們,能夠以「同樣是被當作異類來看待」的同理心,來重新思考一些自己以往並不願接受的其他族群。這是我在同志遊行之當下與之後,訝異著「許多朋友們無法接受某些族群的存在與行為」所引發的的碎碎唸。

在我條列式的本文開始之前,我必須強調以下大多數的分類其實都不侷限在同志圈中,只是我單就同志圈的狀況來描述罷了。而以我狹隘的閱歷來說,本文極有可能過度偏頗到僅包含大學學歷(以上)的男同志圈--也就是我身處在的框架裡。

性行為愛好

你可能不會相信,這是一個還是會「被排擠」的主流文化。但事實上就如同在異性戀的世界中發生的一樣,性行為的愛好者其實並沒有到「大多數」那麼地多(請恕我無法提供有力的數據,這只是在我嘗試毫不遮掩的生活中觀察到的現象)。雖然大眾普遍認為男性比女性更無法抗拒性的誘惑,觀察者們也多次述說著男同志中喜愛性交的比例遠遠高於女同志,但即使是在男同志社群中,有不少比例的人還是排拒著性交的,而其主要原因不外乎雙方對於疼痛的恐懼(這點與異性戀類似,但因為資訊相對缺乏而更加顯著),以及對於排泄物的排斥(即使是隔著保險套)。
至於性交愛好被誤當作是主流文化的原因,則與社群架構有很大的關係。高調的人們大多已經公然出櫃,而這些會決定公然出櫃的人們大多也不排斥與人討論與性有關的話題(畢竟他們已經願意承受出櫃受到的非難),也就更無顧忌地去嘗試性行為,當然也就有較高的機會可以接受-甚而享受-性交的過程。另一方面,性開放者為了尋求目標,也會更加主動的對人談論「性」。換個角度來看,被搭訕者,或說剛接觸圈子時作為一個被動者(包含那些本身並非同志但是曾瞥見同志圈的現象之人),本來就比較容易接受到這些高調與性開放的族群,是以才會有「同志圈的人大多都這樣」的錯覺。
這個現象跟公眾人物給大眾的示範效果有些類似,我們其實自己是知道不應該盲從著這些曝光率高的人們的行為的,但無疑地,這些人卻成功的讓大眾以為這才是主流。

年長

正在看此文的網友們應該大多數都會遇到這個狀況,但我們在圈內的聚會、交友中,其實比在非圈內的場合中容易排擠年齡差距大(20歲以上)的朋友們。承前段,恐同人士們對於同性戀靡爛淫亂的指控也可套用在我們對於年齡差距大的對象們的偏見上,經過歷練、臉皮夠厚的年長者(以及其他不被我們歸納為同一群體的人)比那些內向保守的人們容易被我們接觸到,是以我們也就容易以為那個群體的人「都」是這樣,就跟恐同人士們眼中的我們一樣。

變裝癖

本段相片取自遊行聯盟攝影組義工們的相簿,礙於未取得授權,僅以連結而非圖片內嵌呈現
這是遊行隊伍中最引人注目的一群人。一般來說裝扮成同性別的角色不會引起太大的反感(像是黃金甲),女扮男裝者也大多沒有問題,但是仍被一眼看出是男兒身的女裝則多半會被嫌惡。弔詭的是,即使是異性特質也很強烈的(比較極端的例子是自稱姊妹的男同志),也不一定能夠接受像是這一位的外型,但我必須說我覺得他是我在遊行途中看到最漂亮的一位了。
需要強調的是,願意在特殊場合變裝,並且做出配合該裝扮的肢體動作者,並不一定在現實生活中也是那樣生活。

SM

BDSM團體也參加了同志遊行,當然該團體並非均由同志所組成,只是同樣訴求著自主人權。在為該團體去污名化的文章中,「愉虐」一詞比「性虐」更常被使用,原因無他,乃是有這類喜好的人們其實大多也都是以「自願」作為前提去享受。在[鐵軍的野蠻性史]中,作者多次強調被虐者的自願性,也就是過程中被虐者隨時可以要求停止。這個自願性也是被虐者們之所以不採取一般人所謂「既然喜歡被支配,那就去軍隊啊」的偏激做法的主因。
題外話:今年遊行中有位男士全身穿著皮革裝(下半身是兩件式的那種,我一時找不到照片),據說他在遊行結束時並沒有直接換回正常服裝,還因此招不到計程車。這顯示大眾對於奇裝異服者仍是有所恐懼的。

雙性戀

雖然我給自己的定位為gay,不過曾因前男友的關係參與過Bi The Way的聚會。前陣子在Discovery的《聚焦台灣:彩虹大道》節目中看到曾同住一間房的大家準備著去年遊行的道具,頗有意思。
但很遺憾地,我發現許多同性戀者並不認同雙性戀的存在,而其中又以「根本就是沒膽子出櫃」為最普遍但卻最嚴厲的指控。這樣的指控讓以雙性戀自居的同志們難以在同性戀中自白,而被稱為「櫃中之櫃」--事實上,一個雙性戀者選擇異性作為交往對象之時,都必須面臨「無法證明自己並不是屈就於社會觀感」的折磨,這不只是對於該雙性戀自身,對於他的異性伴侶也一樣。
對於「性」,一般認為女性比較不會有抉擇的困擾(原諒我其實對於女雙性戀的性生活並不了解),但就我認識的男雙性戀者中,確實也有著角色偏好的分界,也因此誕生了另一個無情的指控:「只願意當一號的男雙性戀其實只要有洞就能插就滿足。」
在看Discovery的節目之時,有圈內朋友問著:「你相信有『雙性戀』嗎?」我不禁納悶,這個問題不就跟恐同人士們以激問句的語氣嚷嚷著「你相信有『同性戀』嗎」一模一樣嗎?更甚者,對恐同人士的歧視感到不屑的我們,怎麼竟然用了與他們完全相同的方式去排擠雙性戀了呢?
我承認自己有性別歧視,我同意性別並不是沒有關係,但當我們與恐同者們的壓迫對抗之時,不就從未否認過彼此愛人的權利嗎?
我不是雙性戀,但我將誓死捍衛這些朋友們愛人的權利。
題外冷笑話:Discovery其實是音樂頻道,因為它是"Disco Very"。

暴露狂


因為遊行時參加水男孩又穿了六呎褌的關係,不少因此認識的朋友們問我「為什麼要刻意表現的這麼情慾?」而對於水男孩們「不夠壯也敢出來晃」的指控(註:游泳愛好者通常不似健美的會偏好明顯突出的肌肉)據說也屢見不鮮。
除了強調「遊行是一回事,這些人並不一定在現實生活中也有暴露傾向」之外,更重要的是我們在遊行中裸露身體所展現的訴求--也就是裸露應當是基本人權。眾所皆知法律架構在社會價值觀上,但現行的法令其實並不禁止裸露(而是禁止猥褻,詳見刑法234條與其相關條文),是以我們不應以自身實際觀感來作為禁止他人並無惡意的舉動。講白話一點,我們不能因為有人長的醜或是身材不好就不允許對方出現在自己面前。
註:事實上以裸露身體做為訴求的並不是只有水男孩,除了可口誘人的建中林同學之外,同志天體藝術會館GNG今年也有參加遊行。(礙於當事人隱私,恕不提供連結)

異性特質外顯

電影[功夫]的某個片段(2分5秒)裡,曾與李小龍齊名的趙志凌有著常被譏諷為「娘砲」的肢體演出。而在現實生活中,有著世俗認定的女性特質的男性並不少見,而這在同性戀族群中其實也存在著許多爭議。
有些人就是偏好著有異性特質的同性,而有些人甚至不願意跟這樣的朋友們有所往來。不管是男同志或是女同志都有這樣的現象,就是有猛男喜歡姐妹型的gay,也有正妹討厭男人婆,反之亦然。這與變裝癖的狀況並不完全相同,異性特質外顯的朋友們並不一定喜歡變裝,他們之中也有人是以自身的生理性別自居,當然也有人是以另一個性別自居(但也不一定願意做變性手術)。
說實話我並不了解這個類別,而就如前段所述,這個類別之中又可以輕易再做出分界(也是分裂的起因)。我要陳述的重點是:即使人數不多,這些人仍擁有自主與表現的權利--就跟我們跟整個社會爭取的一樣。
雖然這個特質跟變性不一定有關係,但最後附上兩個我覺得有代表性的新聞,還有一個小笑話:
新聞:英國女模變性成男同性戀
新聞:女同志與男同志陷情網 相約先變性再結婚
小笑話:
A男:如果你發現你兒子是同性戀怎麼辦?
B男:我會打死他!!

A男:那如果你發現你女兒是同性戀怎麼辦?
B男:我會更愛她 >//<


這篇文花了我好幾天的時間,希望不會白費。......
... read more

罰娼不罰嫖 大法官釋憲違法

TVBS 2009/11/7 12:08:38
對於現行法律,只罰娼妓不罰嫖客的法令,大法官做出解釋,認為這條法令,違反人人平等的憲法原則,宣布違憲,2年內法條會失效。至於站壁的流鶯當街拉客,還是屬於違法範圍,為公娼發聲的日日春協會相當高興,也希望能更明令維護性工作者的人權。

大法官的解釋文,讓日日春協會的工作人員相當激動,爭了10幾年的性工作除罪化,終於有了正面回應。

日日春協會執行長鍾君竺:「接2個客人就夠,然後把錢,拿去買魚餵貓的性工作者,為什麼在廢娼之後開始酗酒,到現在已經搞的整個人癱瘓。」

生病、被債務逼迫,性工作者面對的不只是經濟困境,也多了社會觀感給的壓力,大法官解釋,認為在室內從事性交易,娼妓跟嫖客,不罰嫖客只罰娼妓,違反憲法人人平等的原則,法條在兩年內將失效。簡單說,以後在室內從事雙方同意的性交易不違法,但是站壁當街拉客的流鶯還是要罰。

內政部長江宜樺:「我們可能要考慮,是不是要設置專區,或是給予合法的執照,不管怎麼樣,不會再有單罰一方的現象存在。」

原本被忽略的社會問題,現在行政機關得作出明確的規範,怎麼預防性犯罪,要不要設立紅燈區全面規劃,都在2年內得作出配套措施。
......
... read more

被反悔的薦購

交大浩然圖書館剛剛硬是把我之前申請薦購通過的書取消了。
資料名稱:真人版高潮全書

當初(10/8)的信件:

您推薦的圖書,本館已進行訂購,在正常狀況下(提供的書目資訊正確、出版社有存貨、非絕版書等等),國內出版的中文圖書平均購入時間約三?四個星期,西文圖書約二?四個月。建議您主動留意該書狀態,可至館藏查詢系統中查詢,若該書狀態為”登錄中”,表示已到館。


剛剛(11/2)的信件:
親愛的讀者 高睿甫 您好,於20091102我們已取消您預約的資料
由於本校圖書經費有限, 因此無法立即購置您推薦之圖書, 將視經費狀況陸續購置


我是已經習慣被以經費有限做為藉口而駁回薦購申請了啦。但是當初的文字是「已進行訂購」,然後過了三個多禮拜之後才說不買了,總覺得出爾反爾沒什麼公信力啊。

畢竟[奶油派:一個A片導演的菜鳥日記]、[G片工場]、[男同志性愛聖經],這三本書都被我順利薦購而且借出了;我可不希望明天又收到信說沒錢買[男性多重高潮]和[女性多重高潮]了(這兩本也是10/8申請通過的薦購書)。

我要批的並不是浩然的判斷標準,而是誠信問題啊!!......
... read more

在總統府前穿丁字褲


蘋果11/1的A6版有拍到我!!!!(但是我駝背了...orz)

去年出道,今年跟家裡出櫃的我,昨天第一次去同志大遊行,參加了水男孩但不是穿泳褲,很幸運我的六呎褌(穿法可參考YouTube,或是搜尋"fundoshi")沒有在現場就感受到反感的眼光。被拍了不少照片的樣子,不過目前只有看到Vicky網友的無名相簿方便直接連結(而且不用密碼)。

原本還在擔心跟水男孩的大家幾乎都不熟的我,直接穿的跟大家很不一樣,會引起反感。幸好大家的接受度都很高>////<,只可惜今天好像沒有綁的很漂亮 @@
其實在228公園準備的時候有老外拿著攝影機說能不能拍我,那時好像因為要集合而錯失了被訪問的機會,後來想想後覺得:「幹!搞不好是Discovery啊!!!!」

看到好多好可愛的小熊,其中最優的是也在水男孩中但是還帶著小熊耳朵髮箍的朋友啦(因為他的綽號有點特殊,為了怕他沒出櫃被認出來,就不打出來了)。另外還遇到幾位拍過我的攝影師(阿志、Frank、sadman、Neo...,不過沒遇到小管,Bart Chen則好像沒去)。

原本中途有想要去新竹六校聯盟那邊找BLG的大家,不過說實話其實我還是沒有勇氣逆向行走那麼長的距離(水男孩在橙色大隊最前面,新竹六校在藍色大隊中間,這之間還有兩個大隊)。走在遊行隊伍中的缺點,就是沒辦法看到整支隊伍啊....QQ(學Jimmy去當交通指揮好像很不錯)

途中看到何春蕤老師直接拿著大字板站在馬路旁邊位大家加油,覺得好感動。好像很久沒有覺得感動了,瞬間覺得她的付出與貢獻已經與是不是T沒有關係了。(蔡康永和大炳的存在也各是一絕,不過是不同的方式)

最好笑的是走回集合場地穿回褲子之後被大學同學慫恿再脫一次褲子,結果旁邊一群人就圍過來了 >////<

前往西門町等聚餐的時候在捷運站跟戴著喬巴帽的前‧水男孩阿修,他說穿皮革情趣裝的那位男士(應該是皮繩愉虐邦的吧)因為沒有換成正常裝扮,攔不到計程車。顯然大眾還無法接受非大多數人的穿著習慣--但至少我們還是得先祈禱制度與法規對我(們)的認同。

晚上在朋友家過夜,看了一下Discovery(冷笑話:其實DiscoVery是音樂頻道喔),介紹到雙性戀時看到了幾位之前因為前男友而一起去南投玩過的幾位朋友(Bi The Way)(那次好像就我一個Gay和另一位姊姊是Lesbian,其他都是Bi)。許多Gay們似乎對於Bi仍是不太能理解,說著「你相信有雙性戀的存在嗎?」之類的話語,總覺得這就跟無法接受同志的人們嚷嚷著「怎麼可能會有同性戀的存在」的狀況是很類似的。


想要引起注意,就必須誇張。隨之而來的是:反對者以你的「大動作」做為事實立論基礎,抨擊你的行為已經脫序。
......
... read more

PHP + MySQL簡易操作教學

前置作業:


流程:
  1. 連線到資料庫
  2. 執行SELECT SQL
  3. 取出一列列的資料
  4. 其他注意事項和小撇步

PHP的MySQL相關function操作其實不難,但是新手們一開始在使用時卻會很不習慣,以下僅以在下的認知做出簡易示範(應該不是最好的方法,事實上我自己目前已經不是這樣做,但我相信本文應該會是很好理解的流程)
連線到資料庫

連線到資料庫通常都很好解決(如果MySQL Server有設定好的話):mysql_connect('localhost', 'username', 'password');
mysql_select_db('myDB');

這段程式碼通常會寫在一個給所有頁面引入的檔,假設上面兩行被我們存檔為"database.php",那麼遇到需要對資料庫連線的時候只要PHP呼叫:require_once 'database.php';就可以了。這個方法也可以應用在其他想要在每個頁面上做的事情(像是紀錄IP、檢查是否已登入之類的)。

不過只是這樣子有時會有點風險,比方說如果資料庫不是自己設定的,但我們又必須指定編碼(目前的趨勢是使用UTF-8)的話,就得加上一句"SET NAMES 'UTF8'"的SQL,以防止一些亂碼的狀況發生,當然這個前提是你的網頁也是用UTF-8編碼。連線的設定可能就會變成: $db_server = 'db.mycom.com';
$db_user = 'kong0107';
$db_password = '********';
$db_name = 'test';

mysql_connect($db_server, $db_user, $db_password);
mysql_select_db($db_name);
mysql_query("SET NAMES 'UTF8'");
你可能會覺得先把帳號密碼寫在變數裡這件是有點多餘,不過實務面上我們很有可能還會把「帳號資料」和「連線」這兩個區塊分開--通常是做很大的站台的時候。比方說我可能某個頁面同時要跟Google、Yahoo!和FaceBook做連線,那麼我就會分開寫兩個檔:/* 這個檔叫做config.php */
$db_server = 'db.mycom.com';
$db_user = 'kong0107';
$db_password = '********';
$db_name = 'test';

$google_user = 'kong0107';
$google_password = 'hahaha';

$yahoo_user = 'kong_crazykid';
$yahoo_password = 'oh my god';

$fb_user = 'kong0107@gmail.com';
$fb_password = 'this is longer';

/* 這個檔叫做service_connection.php */
require 'config.php'; /*就會把上面那個檔案叫進來*/

mysql_connect($db_server, $db_user, $db_password);
mysql_select_db($db_name);
mysql_query("SET NAMES 'UTF8'");

require_once 'google_api.php'; /*把google的API(最重要的是連線function)叫進來*/
$google = new GoogleAPI();
$google->connect($google_user, $google_password);

require_once 'yahoo_api.php';
$yahoo = new yahooAPI();
$yahoo->connect($yahoo_user, $yahoo_password);

require_once 'facebook_api.php';
$fb = new facebookAPI();
$fb->connect($fb_user, $fb_password);
看吧,只是連線而已就已經開始讓人頭昏眼花,而且我們根本還沒有開始真正操作什麼呢!所以還是把一些設定(諸如帳號、密碼)通通寫在同一區,這樣子之後要改才比較方便。(註:那些API的實際使用方法應該不是這樣子,我只是隨便舉個例子。但總之通常只會更複雜)

執行SELECT SQL
希望你不會覺得光是連線就亂七八糟的,因為下面才要開始操作...orz
在這邊我們先考慮把資料從資料庫中取出來就好,寫入的方法之後會再介紹。
如果你還記得最簡單的SQL:SELECT id, name FROM student
這就是取出student資料表中的id和name兩個欄位。請注意資料庫的SELECT指令只會「取出資料」而不會「排序」--除非你要求他要排序:SELECT * FROM student
ORDER BY id ASC
其中"ASC"是表示遞增排序(遞減排序則是DESC)

在這邊要注意幾點事情:

  • SQL指令可以換行,所以我建議你在寫比較長的指令時,擅用換行來讓指令比較好理解
  • SQL的關鍵字不限大小寫,所以你也可以寫成"select * from student"。但是我個人覺得把關鍵字都大寫比較容易懂
  • "select *"的星號是特殊用法,意思是「取得所有欄位」。通常我會建議這麼做,因為你不一定知道待會可能會想用到哪些欄位
  • 通常資料庫名稱、資料表名稱、欄位名稱是不需要用引號框起來的,不過你可以為了區別他們和關鍵字而特別這麼做。但是要注意的是在MySQL中,把這類名稱框起來的引號並不是單引號或雙引號,而是鍵盤上左上角Esc鍵下面的那個「`」(請小心不要打成全型字),像是:SELECT `id`, `name`
    FROM `student`
    WHERE `id` < 10
    ORDER BY `id` DESC
  • 如果有字串的話,一定要用單引號(不能用雙引號)。舉例來說:SELECT * FROM student WHERE name = '高睿甫'
    如果字串之中有單引號的話,就要用跳脫字元「\」,像是如果要取出留言板中的特定留言:SELECT *
    FROM message
    WHERE content = '野村克也說\'要讓一個選手墮落很簡單啊,只要稱讚他就行了!\'他說的真是太忠肯了'
其實還有其他要注意的,不過先到此為止吧,我們還得回來看PHP呢....

PHP執行SQL的指令是mysql_query()(注意:當然要先對資料庫連線,再執行mysql_query()才有意義),有時我們會把SQL直接寫在裡面:$res = mysql_query("SELECT * FROM student");
不過如果是像上面有比較長的SQL,我倒是比較建議先另外丟進變數裡:$sql = "SELECT `id`, `name`
FROM `student`
WHERE `id` < 10
ORDER BY `id` DESC";
$res = mysql_query($sql);
也別忘了PHP的字串裡面是可以直接換行的(題外話:如果你有在寫JavaScript的話,請注意JavaScript並不能直接這樣做喔)

有注意到我都把mysql_query()回傳的東西丟給$res變數嗎?那就是我們接下來要操作的東西囉

取出一列列的資料
好,這一個區塊其實才是我寫本文的主要目的....(不過上面講SQL好像花了太多篇幅)
mysql_query()回傳的$res變數是PHP的某種資料結構,沒辦法直接取得所有資料,不過可以「一筆一筆」的取出來(在這裡我是用mysql_fetch_assoc(),你也可以用mysql_fetch_row(),後面會再介紹他們的不同): $res = mysql_query("SELECT * FROM student");
$row1 = mysql_fetch_assoc($res); /*第一列*/
$row2 = mysql_fetch_assoc($res); /*第二列*/
$row3 = mysql_fetch_assoc($res); /*第三列*/
注意我們其實是在執行同一個function,但是每次卻回傳不同的結果喔!當然你應該不會想這麼呆呆的把整張資料表取完,這種時候就得用上迴圈啦。但是面對不知道SQL回傳的結果有幾筆資料的時候,回圈應該要在什麼時候停止呢?
其實mysql_fetch_assoc()(和mysql_fetch_row())都會在「已經沒有資料」的時候回傳false,所以我們只要把取出來的東西丟給while判斷就好啦: $res = mysql_query('SELECT * FROM student');
while($row = mysql_fetch_assoc($res)) {
/* 這裡就看你想對這一筆資料幹嘛*/
echo $row['id']; /*像這樣就可以印出該學生的學號*/
}

流程大概都清楚了,我們就來試試用HTML的表格來顯示出所有學生的學號和姓名吧: $res = mysql_query('SELECT `id`, `name` FROM `student`');
echo '<table>';
while($student = mysql_fetch_assoc($res)) {
echo '<tr>';
echo '<td>';
echo $student['id'];
echo '</td>';
echo '<td>';
echo $student['name'];
echo '</td>';
echo '</tr>';
}
echo '</table>';
像是這樣,不過輸出的部份我自己比較喜歡另一個方式:<table>
<?php
while($student = mysql_fetch_assoc($res)) {
?>
<tr>
<td><?=$student['id']?></td>
<td><?=$student['name']?></td>
</tr>
<?php
}
?>
<table>
就是這樣囉,或是看你想怎麼顯示都可以。
其他注意事項和小撇步
  • 如果你只想取得一筆資料(比方說想用學號來查名字),那就不需要用while回圈了,比方說:$id = 9646515;
    $res = mysql_query("SELECT * FROM student WHERE id = $id");
    $kong = mysql_fetch_assoc($res);
    $name = $kong['name'];
    echo "學號$id 的學生,他的名字是$name";
  • mysql_fetch_assoc()指令只是我自己慣用,如果資料表是你自己設計的,也可以使用mysql_fetch_row()。差別在於回傳回來的array結構: $res = mysql_query("SELECT id FROM student");

    $row1 = mysql_fetch_assoc($res);
    echo $row1['id'];

    $row2 = mysql_fetch_row($res);
    echo $row2[0];

    $row3 = mysql_fetch_array($res);
    echo $row3['id'];
    echo $row3[0];

    mysql_fetch_assoc()的好處是你不用記得欄位順序,但缺點是你必須記得欄位名稱;mysql_fetch_row()則相反。當然你也可以用mysql_fetch_array(),這樣就兩種方式都可以取得想要的資料。
    小提醒:上面的例子中,請注意$row1、$row2、$row3是會取得「不同筆」的資料喔。
  • 實務面上我們常常需要藉由使用者表單來湊出SQL指令,比方說前面舉過的搜尋留言板:$txt = $_GET['search'];
    $sql = "SELECT * FROM message WHERE content = '$txt'";
    // 還記得字串要加上單引號吧..
    不過以這個例子來說,我們又必須小心使用者輸入的東西本身就有單引號。比方說使用者輸入了"我好傷心喔 T_T'",那麼整個SQL丟給MySQL的時候就會變成SELECT * FROM message WHERE content = '我好傷心喔 T_T''然後就發生錯誤啦(因為MySQL看不懂那些引號是怎麼回事)
    這種時候就必須另外用程式把那個單引號解決掉:$txt = str_replace("'", "\\'", $_GET['search']);
    /* 如果你看不懂那個"\\'",就先照做吧....*/
    $sql = "SELECT * FROM message WHERE content = '$txt'";

    通常我只處理單引號,不過你可能也想把其他東西代換掉,就依樣畫葫蘆囉。
  • 承上,如果是用留言的流水號(數字)來查的話,直覺上程式碼應該是:$id = $_GET['id'];
    $sql = "SELECT * FROM message WHERE id = $id";
    可是,如果使用者在表單中,根本不是打數字的話(比方說使用者什麼都沒打),SQL就會變成SELECT * FROM message WHERE id = 於是就產生錯誤了(因為等號後面不是數字)。
    要解決這個狀況有兩個方法,一個是無論該欄位是不是數字都加上引號:$id = str_replace("'", "\\'", $_GET['id']);
    $sql = "SELECT * FROM message WHERE id = '$id'";

    另一個就是使用sprintf()函數,這也是我比較偏好的方法:$sql = "SELECT * FROM message WHERE id = %d";
    $sql = sprintf($sql, $_GET['id']);
    以上兩個方法都可以應付使用者亂打的狀況
善用sprintf()
承上,我們有時會需要比較長的SQL,像是:SELECT * FROM car
WHERE brand = 'BMW'
AND oilCart > 2000
AND price < 700000
如果我們是使用sprintf()的話,就可以用比較容易懂得簡短程式碼來執行(簡潔易懂的程式碼可以幫助自己或他人後續的除錯和更新):$sql = "
SELECT * FROM car
WHERE brand = '%s'
AND oilCart > %d
AND price < %d
";
$sql = sprintf($sql, $_GET['brand'], $_GET['oilCart'], $_GET['price']);
這只是個比較簡單的例子,但如果是遇到像是需要報表、統計這一類需要跨多的資料表的SQL,使用sprintf()的替代方式可以讓你快速的編輯和除錯。

先到此為止吧,我手痠了
......
... read more