2013-07-05 43 views
3
$name=$_GET['name']; 
$sql="SELECT `productname`, `price` FROM `stock` WHERE productname=".$name." 
and (userid=".$_SESSION['user_id']." or userid='100')"; 

基本上我從一個頁面獲取產品名稱。我正在傳遞查詢,其中productname是$ name,而userid是當前簽名的或管理員用戶標識(100)。以下查詢有什麼問題

但我得到錯誤

Notice: Undefined variable: productname in /path_to_file.php on line 431

line 431: <?php echo $productname;?> 

其中$產品名稱= $行[ '產品名'];

我感覺SQL查詢中有些問題是錯誤的。但是,什麼是錯的?

+0

請發表完整的密碼。 –

+0

對於你的錯誤: 你的變量,如錯誤所述,未定義。 典型的解決方案是利用isset()(http://php.net/manual/en/function.isset.php)來檢查變量是否已經初始設置,如果是的話(使用if()( http://php.net/manual/en/control-structures.if.php)語句),繼續設置變量。 我會把你引到這裏:http://stackoverflow.com/questions/4261133/php-notice-undefined-variable-and-notice-undefined-index –

+0

你應該[使用像PDO這樣的現代界面](http: //net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/)[可靠的SQL轉義](http://bobby-tables.com/PHP)。使用字符串連接是一個非常糟糕的主意,你在這裏有一個**大量的[SQL注入漏洞](http://bobby-tables.com/)。 – tadman

回答

3
$name = $_GET['name']; 
$sql = sprint("SELECT `productname`, `price` FROM `stock` WHERE productname='%s' 
    and (userid=%d or userid=100);", 
    mysql_escape_string($name), intval($_SESSION['user_id'])); 

你需要用的productname='%s'單引號單引號。往上看。

+2

用於放置'mysql_escape_string($ name)' – RolandoMySQLDBA

+0

@RolandoMySQLDBA +1希望他能弄清楚這個用法...我也強制'user_id'爲'int'來防止SQL注入:) – CodeAngry

+0

我想我將不得不從MySQL切換到mysqli很快擺脫sql注入!感謝您指出錯誤。 – Santosh

2

您需要周圍的$name

$name=$_GET['name']; 
$sql="SELECT `productname`, `price` FROM `stock` WHERE productname='". mysql_escape_string($name). "' and (userid=".$_SESSION['user_id']." or userid='100')"; 
+0

他還需要轉義'$ name'變量以避免SQL注入。 –

+0

@JoachimIsaksson你是對的。我剛剛添加了它。 – RolandoMySQLDBA

+0

感謝您的回答! – Santosh

1

有幾件事情錯了:

首先,你是不是逃避輸入數據,所以你很容易受到SQL注入。

其次,如果$name確實是一個字符串值,它將需要在您的查詢中用單引號括起來。

除此之外,您的查詢沒有任何問題,只要它與您的表架構匹配並且您正在查找的數據存在於數據庫中即可。

1

下面是一個更安全的方式與PDO寫這個的一個例子:

$name=$_GET['name']; 
$sql="SELECT `productname`, `price` FROM `stock` 
    WHERE productname = ? AND userid IN (100, ?)"; 
$stmt = $pdo->prepare($sql); 
$stmt->execute(array($name, $_SESSION["user_id"])); 

使用參數,而不是插PHP變量轉換成字符串不僅是對SQL注入防禦更安全,它也更容易編寫代碼和更容易閱讀代碼。

你也可以用mysqli做一些類似的事情,但是我發現PDO是最簡單的。

+0

PDO還支持像':name'和':user_id'這樣的命名佔位符,這通常會使查詢更易於閱讀。將$ sql作爲中間變量也是多餘的。 – tadman

+0

@tadman,我喜歡將SQL放入一個變量中以幫助調試和測試。 –