最近幾天在寫一個小程式的時候遇到一個問題,就是我想要直接在我的SQL查詢語句裡面夾帶$_POST變數,不想要用串接運算子來做串接,可是因為引號的問題所以讓我搞了很久才會用,這裡簡單的介紹一下,並且我要感謝Bu跟蒼時弦教會我這個方法!如果不是他們我可能還不知道這個方式,另外這個方式不只可以用在$_POST,也可以用在其他陣列
P.S.使用本文的夾帶方式有SQL注入的危險,建議先將變數處理過在放到SQL Query中
大家都知道在PHP裡面,雙引號裡面可以放變數,例如:
$x=4;
echo "print $x";
以上程式碼會輸出:「print 4」
但如果是:
$x=4;
echo 'print $x';
則會輸出:「print $x」
而我現在的意思就是說我把SQL查詢命令用雙引號包住,然後再裡面放變數,放一般變數是可以的,但如果放$_POST的話就會出一點小問題…..
SQL查詢命令夾帶一般變數:
mysql_query("select * from `sql_tab` where `name`='$name'");
上面這樣是可以正常運作的
但如果改成:
mysql_query("select * from `sql_tab` where `name`='$_POST["name"]' ");
mysql_query("select * from `sql_tab` where `name`='$_POST['name']' ");
以上兩種寫法都是會出錯的,因為引號的問題
所以, 該怎麼寫呢? 原來,在PHP裡面,你的$_POST其實不一定要用引號框住
也就是說我們可以寫成:
mysql_query("select * from `sql_tab` where `name`='$_POST[name]'");
這樣的寫法,name不需要用單引、雙引框住
但是這樣的寫法對效能有些傷害,因為PHP會先去搜尋程式裡面是否有$name這個變數,如果沒有,才會把$_POST[name]當成$_POST[“name”]來處理,所以效能變差了
既然如此,還有什麼更好的寫法嘛?這時候就要感謝Bu大大在我頭上開了一盞明燈! 可以改寫成:
mysql_query("select * from `sql_tab` where `name`='{$_POST["name"]}'");
以上的寫法,把$_POST用大括弧包住,然後name的部份一樣用雙引號處理,透過這種寫法,就可以在SQL查詢語句裡面夾帶$_POST或是陣列囉~
對於變數的變數,官方還有更多玩法就是。
http://www.php.net/manual/en/language.variables.variable.php
只是我個人覺得你sql來當範例,並不是很好的。
恩
是說我的確是在用sql時遇到的
想說可能有人也會遇到
Sql 注入的問題其實有注意就還好
謝謝你的分享
解決了我的問題
他剛好在這個地方碰到這問題,所以就把他的問題Share上來~
(用SQL當範例確實怪,不過這裡是他紀錄過程的網誌也不為過拉……)
呵呵
嗯xd
同學你知道有種東西叫做 SQL injection 嗎…
虧你還會上一些所謂的資安論壇= =
大大抱歉耶:)
其實我知道 SQL injection這個東西:)
嗯…..
不過可以的話,可以把文章看清楚嘛?
還有,小弟不才,可是我記得:
並不是使用這種方式進行串接就一定會造成 SQL injection
事實上只要你有處理好你的傳入值就不會有事
如果我解釋有錯,還請大大指教:)
附帶一個問題,大大你說「所謂的資安論壇」
也就是你認為這些網站其實都是沽名釣譽嘛?
果然是大大阿!
…. SQL Query 請愛用 Prepare Statement QQ
嗯嗯XD
你的文章最近經常出現 BU 呢 XD..
嫉妒嘛XDD
下次就出現風痕影~
哦~
我一直都是用大括號來寫的,
這樣能做一些有彈性的變化=.=
嗯~
我是最近才知道這寫法的XD
太好了又學到一招…
技能+1
不過真的要注意安全問題!