2013-05-08 182 views
6

我對SQLite查詢有疑問。我在iOS sqlite數據庫的一些示例代碼中有一個包含四行三列的表。帶問號的Sqlite查詢

,我從表與查詢獲取數據: -

Select * from table where column_name=? ; 

我根據示例代碼..what是否具有與column_name=?問題?的意思是......

它用於遞增行嗎?

+0

放在這裏你的列名 – 2013-05-08 12:39:58

+0

? - 佔位符的實際價值 – Eugene 2013-05-08 12:40:26

+0

但它會得到真正的價值? bcz我們不是在使用像字符串中的「%@」來傳遞實際值 – user2353519 2013-05-08 12:42:02

回答

5

The?是一個真實值的佔位符,您必須綁定到編譯語句的值。這個link詳細說明了綁定。

綁定值而不是將它們放在查詢字符串中的原因是,它防止了SQL注入攻擊 - 如果您使用的是直接從用戶提供的值,則可能發生這種情況。

1

我希望它可以幫助你...「?」標記用於...。

這通常意味着一個準備好的語句,其中參數在稍後填寫。 (例如參見http://en.wikipedia.org/wiki/Prepared_statements#Parameterized_statements)。

OR

在一些陳述,當製備語句,因爲不同的值可以在每次執行該語句時被插入參數是未知的。在這些語句中,您可以使用問號(?)佔位符,其中必須在執行語句時提供參數。

OR

儘管PreparedStatement對象可用於SQL語句不帶參數,你可能會使用他們最經常的帶參數的SQL語句。使用帶參數的SQL語句的優點是,您可以使用相同的語句並在每次執行時使用不同的值。

2

?表示您會得到一個值綁定的佔位符(如設置文本值,使用sqlite3_bind_text後您sqlite3_prepare_v2的語句,但你sqlite3_step執行它。

sqlite3_bind文檔。

這是一個非常重要的構造知道和使用,因爲你永遠不想使用stringWithFormat建立你的SQL。通過使用sqlite3_bind,你不必編寫代碼來逃避你可能在你的輸入中有任何引號,例如你正試圖插入值o f Joe's Bar and Grill(如果您使用單引號,則撇號會混淆您的SQL)或Dwayne "The Rock" Johnson(如果您使用雙引號,引號會導致SQL混亂)。它還可以防止SQL注入攻擊。絕對使用sqlite3_bind而不是手動構建SQL語句。

+1

嘿感謝得到它:) – user2353519 2013-05-08 13:04:58