2012-12-23 158 views
-1

請幫助我這個語法。它是否正確?什麼是正確的mysql語法

$query = mysql_query("SELECT * FROM axispl WHERE companyname LIKE $searchterm% LIMIT 11"); 

在網上的幾個例子中,我已經看到`符號被用來包圍axispl或公司名稱。少數人不在場。有什麼不同?

我的數據庫有2列。首先有公司名稱。其次是他們所屬的類別。當公司名稱與searchterm匹配時,我基本上希望查詢選擇其中的11個對。

我應該提及SELECT *還是應該提及SELECT companyname,axiscategory? (這是兩列的名字)。

如果上述語法不正確,應該更改哪些內容?

+7

[**請不要在新代碼中使用'mysql_ *'函數**](http://bit.ly/phpmsql)。他們不再被維護[並被正式棄用](https://wiki.php.net/rfc/mysql_deprecation)。看到[**紅框**](http://j.mp/Te9zIL)?學習[*準備的語句*](http://j.mp/T9hLWi),並使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli) - [這篇文章](http://j.mp/QEx8IB)將幫助你決定哪個。如果你選擇PDO,[這裏是一個很好的教程](http://j.mp/PoWehJ)。 – ThiefMaster

回答

0

您需要用單引號引用搜索詞。

$query = mysql_query("SELECT * FROM axispl WHERE companyname LIKE '".mysql_real_escape_string($searchterm)."%' LIMIT 11"); 

它,如果你使用SELECT *或指定的列並不重要 - 後者通常是有點快,但它通常,如果你需要的所有列反正無所謂。

關於你的報價問題:

  • 始終逃脫傳遞到查詢字符串。
  • 使用單引號引用查詢中使用的字符串
  • 反引號用於引用數據庫/表/列名稱,並且僅當它們與保留關鍵字衝突時才需要。
+0

根據你的反饋,我改變了以下代碼:mysql_connect('localhost','username','password'); mysql_select_db('pl')或死(「無法選擇數據庫」);到PDO('mysql:host = localhost; dbname = pl; charset = UTF-8','username','password');這是正確的,還是我必須把它傳遞給一個變量(在PDO教程中,它被傳遞給變量db;這是什麼目的?) – REJOLA

0

反引號用於確保它們包含的內容被視爲數據庫,表或列名稱,無論上下文需要如何調用。除了讓它更易於閱讀外,它還允許您直接使用任何列名稱,包括保留字如count,timestamp,from,數字列名稱25,50,100以及所有類型的瘋狂符號(如果您真的想要的話)。

然而,拋開那,你的搜索詞應該用引號括起來,因爲它是一個字符串。

+0

感謝您的反饋! – REJOLA

0

的區別是什麼?

沒有區別。

反引號符號與標識符無效作爲標識符名稱一起使用。例如,如果您有一個名爲保留字的列,在這種情況下,您必須使用反引號來轉義它們。

在你的情況下,它是可選的,因爲是有效標識符的名字使用`符號與列。

我應該提及SELECT *還是應該提及SELECT公司名稱, axiscategory?

建議不要使用SELECT *並明確指定列名。

+0

感謝您的反饋! – REJOLA

0

首先,告訴你正在返回的列是一個好主意,所以你可以確保只返回實際需要的數據。對於這樣一個小的表格可能並不重要,但如果你有50列和100 000行,而你只想要前兩列的列表呢?

引用列名和表名是一種很好的做法,雖然在您碰巧在名稱中使用reserved word(如SELECT,FROM,ADD,DELETE等)時它並不會一直保存。

同樣在您的查詢中,您需要單引號查詢LIKE,因爲它需要一個字符串。

$query = mysql_query("SELECT `companyname`, `axiscategory` FROM `axispl` WHERE `companyname` LIKE '$searchterm%' LIMIT 11"); 
+0

感謝您的反饋! – REJOLA