找了個輕量級的資料庫類 medoo,感覺不錯,但是使用時發現了一個很奇怪的問題
在使用mysql的時候他組裝的sql表名、欄位名都是用雙引號的,這樣產生的語句不能直接執行
mysql> SELECT * FROM "dd_xq_user_info" WHERE "uid" = '1' AND "status" = '1' ORDER BY "id" LIMIT 1;ERROR 1064 (42000): 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 '"dd_xq_user_info" WHERE "uid" = '1' AND "status" = '1' ORDER BY "id" LIMIT 1' at line 1
但是用pdo執行這個語句執行成功了,而且沒有錯誤,請問大家這個是為什麼呢?pdo做了什麼處理?
回複討論(解決方案)
這是不可能的!
貼出你的真實代碼
剛才通讀了下medoo的代碼 https://github.com/catfan/Medoo/blob/master/medoo.php
發現在串連資料庫的時候執行一個語句
SET SQL_MODE=ANSI_QUOTES
發現這個模式的作用就是把雙引號改為反引號
ANSI_QUOTES將‘”’視為識別符引號(‘`’引號字元),不要視為字串的引號字元。在ANSI模式,你可以仍然使用‘`’來引用識別符。啟用ANSI_QUOTES後,你不能用雙引號來引用字串,因為它被解釋為識別符。
這解釋了為什麼上面的語句可以執行
暫時想不到會不會有帶來其他的問題
SQL_MODE 的預設值是 STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
改成 ANSI_QUOTES 後,如果沒有其他的操作,自然是不會有影響的
這是 MySQL 的功能,並非 PDO 的
這是 MySQL 的功能,並非 PDO 的
是啊 我還以為pdo有這個功能
順便祝端午安康,多謝過節還幫忙答疑解惑