2012年12月15日 星期六

難以理解的SQL語法錯誤

今天在家複習php時,在做登入的功能 : (*acc是account的縮写)
明明是挺簡單的SQL語法結果一直出錯 ,太傻眼了@@,我都想搥牆了...

第一次下的SQL語法 :
$sql =sprintf("SELECT * FROM manager WHERE acc=$acc AND pwd=$pwd");

(把整句$sql語法echo出來)
得到的結果卻是 :
SELECT * FROM manager WHERE acc=win AND pwd=You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
結論 : 語法有問題。

第二次下的SQL語法 :
$sql =
sprintf("SELECT * FROM `manager` WHERE `acc`='".$acc."' AND `pwd`=admin_win LIMIT 1;");
(把整句$sql語法echo出來)
得到的結果卻是 :
SELECT * FROM `manager` WHERE `acc`='win' AND `pwd`=admin_win LIMIT 1;Unknown column 'admin_win' in 'where clause'
甚麼是 Unknown column 'admin_win' in 'where clause' ???
上網找了一下好像也沒什麼特別的解答,但簡單來說撈不到資料應該都是sql語法下錯
果然將整句SQL語法都echo出來就抓到問題了....
看一看才發現原來是admin_win少了 一對單引號把它刮起來

最後一次下的SQL語法 :
$sql =sprintf("SELECT * FROM `manager` where `acc`='".$acc."' and `pwd`='admin_win';");

成功撈到資料:
SELECT * FROM `manager` where `acc`='win' and `pwd`='admin_win';Resource id #6Array ( [id] => 2 [acc] => win [pwd] => admin_win [user_name] => WinWu [last_signin_time] => 0000-00-00 [create_date] => 2012-12-14 )

不曉得發生甚麼事情,就是一直跌跌撞撞,我記得第一種寫法我以前寫過是成功的.....
不管了,總之,完成了!~

6 則留言:

  1. 要注意 SQL Injection 的問題噢

    回覆刪除
  2. 其實可以改用mysqli,就可以避免sql injection的問題了

    回覆刪除
  3. 另外推薦 php pdo 的連線方式, 方便好用:)
    但僅支援 php5 以上版本,據說也是 php6 的默認連線方式,
    防護大部分的 sql injection 問題,通常會另外自訂一個 pdo class 包裝成類似以下寫法
    pdo->insert(xx,xx) , pdo->update(xx,xx) , ...etc

    回覆刪除
    回覆
    1. pdo 恩,我來研究看看!
      第一次聽到
      謝謝你的分享:)

      刪除

若你看的文章,時間太久遠的問題就別問了,因為我應該也忘了... XD

Vue multiselect set autofocus and tinymce set autofocus

要在畫面一進來 focus multiselect 的方式: 參考: https://jsfiddle.net/shentao/mnphdt2g/ 主要就是在 multiselect 的 tag 加上 ref (例如: my_multiselect), 另外在 mounted...