2010-05-05 67 views
0

我有這樣的代碼來加載對應的ID號的生日月份,當更新MySQL數據:如何使用爆炸

<?php 
    $query = "SELECT DISTINCT BIRTHDAY FROM student WHERE IDNO='".$_GET['id']."'"; 
    if($result = mysql_query($query)) 
    { 
     if($success = mysql_num_rows($result) > 0) 
     { 
?> 
<select title="- Select Month -" name="mm" id="mm" class="" > 
<?php 

    while ($row = mysql_fetch_array($result)) 
      list($year,$month,$day)=explode("-", $row['BIRTHDAY']); 
?> 
      <option value="<?php echo $month;?>"><?php echo $month; ?></option>\n"; 

這是表單的動作:

$birthday = mysql_real_escape_string($_POST['mm']); 

mysql_query("UPDATE student SET YEAR = FIRSTNAME='$fname', BIRTHDAY='$birthday' 
WHERE IDNO ='$idnum'"); 

我該怎麼做,當我點擊更新按鈕時,它會執行,但我看到未定義的偏移量錯誤存儲在MySQL數據庫中,而不是月份。 我只是一個初學者,你可以給我一些提示,我怎樣才能實現更新數據

+0

數據庫中BIRTHDAY的數據類型是什麼,如果它是日期類型,那麼值無法插入 – nik 2010-05-05 14:55:32

+1

AAAHHHH SQL注入AUGHHHHHHH – mattbasta 2010-05-05 15:24:02

+0

您使用$ _GET的查詢不安全。有人可以輸入mypage.php?idno ='OR 1 = 1;更新學生SET firstname ='Trolololo'; - – 2010-05-05 18:28:51

回答

1

在這樣的情況下,...你將不得不使用3個選擇,然後加入到其中來更新數據庫...所以,其形式爲你喜歡的東西這樣的:

<select name='month'> 
    <option value='1'>January</option> 
    <option value='xx'>etc</option> 
</select> 
<select name='day'> 
    <option value='1'>1</option> 
    <option value='xx'>etc</option> 
</select> 
<select name='year'> 
    <option value='1980'>1980</option> 
    <option value='xx'>etc</option> 
</select> 

則...接收這些數據應該做的事情,如PHP:

$year = mysql_real_escape_string($_REQUEST['year']); 
$month = mysql_real_escape_string($_REQUEST['month']); 
$day = mysql_real_escape_string($_REQUEST['day']); 

$birthday = $year.'-'.$month.'-'.$day; 
mysql_query("UPDATE student SET YEAR = FIRSTNAME='$fname', BIRTHDAY='$birthday' 
WHERE IDNO ='$idnum'"); 

當然......你必須首先驗證是否所有變量都已設置。您可以使用isset方法來完成此操作。

-1

檢查您的更新查詢,這可能是錯誤的。

mysql_query("UPDATE student SET YEAR = FIRSTNAME='$fname', BIRTHDAY='$birthday' 
WHERE IDNO ='$idnum'"); 

看今年和firstname,在今年被分配爲null字符給你。

就分配這樣,

$birthday = mysql_real_escape_string($_POST['mm']); 
+2

不!壞! 'mysql_real_escape_string'是必須的! SQL注入!不要忽視最佳實踐! – mattbasta 2010-05-05 15:26:38

+0

嗨mattbasta,我知道它會得到什麼類型的SQL注入? – Karthik 2010-05-05 17:19:45

+1

任何時候,只要將用戶的原始數據(即:$ _GET,$ _POST等)直接放入MySQL查詢中,而不通過mysql_real_escape_string運行,就有可能黑客攻擊您的數據庫,造成大量的傷害。始終總是使用'mysql_real_escape_string'。 – mattbasta 2010-05-08 17:05:33