PrepareStatement vs "?"
透過?來動態置入查詢參數,讓SQL語句可以發揮得更淋漓盡致...
問題是....如果有不需要置換的?怎麼辦...
下面是個例子:
select concat('http://www.google.com/search?q=', param0, '&aq=f') as q,
param1, param2 ... from some_table;
這邊希望?是sql產出值的一部分,然後透過SQL直接組織產出成為一個url string,當然,string中包含有?是url終場見到的...,此時,單純的query不會有問題,但是若在此時加上where子句,並且改寫成prepare statement格式...
select concat('http://www.google.com/search?q=', param0, '&aq=f') as q,
param1, param2 ... from some_table where condition1 = ? and condition2 = ?;
如果上述SQL以及對應的條件送進prepare statement查詢的話,系統會很明確的告訴你...EXCEPTION!
嘗試了一下,總覺得可以透過某些方式讓SQL變成合理...
最後腦筋動到MySQL的ASCSII上面...透過MySQL的官方文件說明,可以透過CHAR這個Function來置換ASCSII的字元,而要知道字元的ASCSII碼,則可以透過ASCII Function來查詢...做了一個簡單的測試:
select ASCII('?'), CHAR(63)
執行結果如所預期... :D,修改上面的Prepare Statement後:
select concat('http://www.google.com/search',CHAR(63),'q=', param0, '&aq=f') as q,
param1, param2 ... from some_table where condition1 = ? and condition2 = ?;
直接把?給藏起來,也就避免了程式會誤判的問題了∼YA!