2013-11-26 33 views
0

我正在嘗試創建一個程序,用戶將在表單域中輸入一個狀態縮寫,並且輸出將是處於該狀態的大學。這裏是我的代碼:

<?php 
$abbr = $_POST; 
print_r ($abbr); 
$host='x'; 
$dbname='x'; 
$user='x'; 
$pass='x'; 
try { 
    # MySQL with PDO_MYSQL 
    $DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass); 
} 
catch(PDOException $e) { 
    echo $e->getMessage(); 
} 

$STH = $DBH->query(" 
SELECT INSTNM, STABBR 
FROM colleges 
WHERE STABBR ='$abbr' 
"); 

# setting the fetch mode 
$STH->setFetchMode(PDO::FETCH_ASSOC); 

while($row = $STH->fetch()) { 
    echo $row['INSTNM'] . "\n"; 
    echo $row['STABBR'] . "<br>"; 
} 
?> 

輸出:

Array ([STABBR] => AL) 

程序工作正常時,狀態縮寫中的硬編碼因此,舉例來說,如果我這樣做:

$STH = $DBH->query(" 
SELECT INSTNM, STABBR 
FROM colleges 
WHERE STABBR ='AL' 
"); 

。阿拉巴馬州的大學將出現。

我已經嘗試了很多方法,但目前爲止還沒有工作。我很感激幫助。

+0

**通過構建帶有外部變量的SQL語句,您將使自己對SQL注入攻擊敞開大門。**此外,任何帶有單引號的輸入數據(如名爲「O'Malley」)將炸燬你的SQL查詢。請了解使用參數化查詢(最好是使用PDO模塊)來保護您的Web應用程序。 http://bobby-tables.com/php有例子讓你開始,並且[這個問題](http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in- php)有很多例子的細節。 –

回答

2

正如您的輸出所示,$_POST是一個數組,而不是單個元素。

使用

$abbr = mysql_real_escape_string($_POST['STABBR']); 

既得到正確的元素,以防止注入攻擊。

0

這是不正確的:

$abbr = $_POST; 
$sql = " .... = '$abbr'"; 

$ _ POST是一個數組,當你直接在字符串上下文中使用數組,你得到的字面單詞「陣列」,所以您的查詢實際上是

$sql = " .... = 'Array'"; 

您需要使用表單域元素的名稱:

<input type="text" name="state" value="AL" /> 
         ^^^^^---field name 
$abbr = $_POST['state']; 
       ^^^^^--- field name again 

另外請注意,你是vulnera ble to SQL injection attacks