如何直接在PHP字串(SQL Query)中夾帶陣列、$_POST、$_GET

最近幾天在寫一個小程式的時候遇到一個問題,就是我想要直接在我的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或是陣列囉~

在〈如何直接在PHP字串(SQL Query)中夾帶陣列、$_POST、$_GET〉中有 15 則留言


    1. 是說我的確是在用sql時遇到的
      想說可能有人也會遇到

      Sql 注入的問題其實有注意就還好

    2. 他剛好在這個地方碰到這問題,所以就把他的問題Share上來~
      (用SQL當範例確實怪,不過這裡是他紀錄過程的網誌也不為過拉……)

  1. 同學你知道有種東西叫做 SQL injection 嗎…
    虧你還會上一些所謂的資安論壇= =

    1. 大大抱歉耶:)
      其實我知道 SQL injection這個東西:)
      嗯…..
      不過可以的話,可以把文章看清楚嘛?
      還有,小弟不才,可是我記得:
      並不是使用這種方式進行串接就一定會造成 SQL injection
      事實上只要你有處理好你的傳入值就不會有事

      如果我解釋有錯,還請大大指教:)

      附帶一個問題,大大你說「所謂的資安論壇」
      也就是你認為這些網站其實都是沽名釣譽嘛?
      果然是大大阿!

發佈回覆給「企鵝」的留言 取消回覆

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料