2012-06-19 74 views
0

我有這個快速的問題,我有一個表單的用戶名變量,我需要插入一個查詢,你能告訴我我要去哪裏錯了,它說:未知列在「字段列表」解析數值到一個mysql查詢

這裏「$用戶名」是代碼:

echo $HTTP_POST_VARS['username']; 

    echo $username; 
    $query = sprintf('SELECT $username FROM hostess'); 
+3

不要這樣做。停。閱讀並瞭解[SQL注入攻擊](http://bobby-tables.com),然後再進一步使用這種編碼。 –

回答

0

Uhmm一切似乎錯了..

首先,你從來沒有定義變量$的用戶名。 你所做的只會在仍然支持suberglobals的PHP版本中有效。

其次,你爲什麼使用sprintf進行查詢?

順便說一下,不推薦使用HTTP_POST_VARS。使用POST

正確的代碼會是這樣的;

$username = $_POST['username']; 
echo $username; 

$query = mysql_query("SELECT ".$username." FROM hostess"); 
+0

這工作得很好:)謝謝! –

+0

好聽!你能將我的答案標記爲正確答案嗎?謝謝 – edwardmp

+0

當然,我只需要再等4分鐘就可以做到這一點:) –

0
$query = sprintf('SELECT %s FROM hostess', $username); 

- 或者,如果這是一個字符串值,我懷疑你可能要包括在單引號查詢文本 -

$query = sprintf("SELECT '%s' FROM hostess", $username); 

注意:生成的SQL語句看起來有點奇怪,因爲它將爲女主人表中的每一行返回相同的文字值。如果女主人表中有一百行,您將返回具有相同字面值的100行。這可能是你想要的,但它讓我感到非常奇怪。

注:sprintf函數查找%S,%d,等在第一個參數佔位符,並與值替換它們從其餘參數)

注意:如果$username包含進來的值一種形式,並沒有得到驗證,以挫敗SQL注入攻擊,我會使用(不可否認的老派)功能mysql_real_escape_string函數。 (其他人會提供建議,爲更好,更現代化的技術來實現相同的結果。)

$query = sprintf("SELECT '%s' FROM hostess",mysql_real_escape_string($username)); 
+0

嘿謝謝,這是正常的輸出是:你的SQL語法錯誤;檢查與您的MySQL服務器版本相對應的手冊,以便在第1行'FROM hostess'附近使用正確的語法。我在本地主機上。 –

+0

@Gazeta Almedicus:如果查詢文本格式錯誤,是的, 。如果$ username包含一個整數值,它不應該是一個問題。 「選擇1從女主人」。如果$ username是一個字符串,那麼它可能是一個問題,如果$ username不是一個有效的SQL表達式... – spencer7593

0
在PHP

,使用單引號的字符串將無法解析變量的字符串。請使用串聯或雙引號:

$query = sprintf('SELECT ' . $username . ' FROM hostess'); 
$query = sprintf("SELECT $username FROM hostess"); 

當然,這是說任何關於使用POST變種這種方式意味着可怕的風險。

+0

謝謝你的建議! :) –

1
  1. 在提供你的代碼永遠不會設置$username
  2. 您對Sql injection開放。
  3. 您使用sprintf沒有任何理由 - 它格式的字符串,但你不提供任何格式,下面我舉的例子的確
  4. 你試圖'SELECT $username FROM hostess'但是這不是一個有效的SQL語句都沒有。

你會想要更多的東西一樣:AFTER確保您清潔$的用戶名

$query = sprintf("SELECT * FROM hostess WHERE username='%s'", $username);