2012-09-06 303 views
1

對於PHP來說相當新穎,我正在製作一個基本的CRUD樣式管理系統。我有一個更新頁面,它顯示來自新聞表的數據,並用它填充表單。當前圖片?(參考)被拖動並顯示在表單上。但是,如果用戶想要更改圖片,他們可以按'刪除'按鈕,然後我寫了一些PHP來顯示上傳按鈕,將數據庫中的值設置爲空,並隱藏刪除按鈕,從而允許用戶上傳一張新照片。

刪除按鈕僅從數據庫中刪除對圖片的引用(路徑),但不會刪除實際圖片。

這是用於顯示圖像和刪除按鈕的HTML控件。它也顯示了刪除按鈕的工作原理:

<td align="right">Image 1:</td> 
<td align="left"><img src="uploads/newsimages/<?php echo $row["Image"]; ?>" width="230" border="0">&nbsp;<a href="UpdateNews.php?change=imagex&cid=<?php echo $row["NewsID"]; ?>">delete</a></td> 

正如你可以看到,當點擊它設置變化= ImageX和CID =當前的新聞ID。

然後有我寫的if語句,但它似乎並沒有只有在點擊刪除按鈕時被激活。因爲我總是得到一個'cid'未定義的錯誤。這是因爲如下:

<?php 
if (isset($_GET['change'] = "image1") { 
    $query = "UPDATE Table_Name SET Image = '' WHERE NewsID =".$_GET['cid']." "; 
} 

?> 

我敢肯定,我缺乏的PHP知識讓我失望,我試圖去了解這個錯誤的方式,然而,因爲我改變了if語句它總是給我一個錯誤。首先它是cid未定義,所以我更改爲id但我已經將其用於其他查詢/功能。我希望所有的意義,誰能告訴我哪裏會出錯?

+0

你只是想刪除服務器上的文件? – David

+0

您是否檢查過要輸出的HTML以確保其全部正確? – andrewsi

+4

**警告**您的代碼容易受到sql注入攻擊。 –

回答

4

你缺少一個括號+你必須單獨註明:

if (isset($_GET['change'] = "image1") { 

更改爲:

if (isset($_GET['change']) && $_GET['change'] == "image1") { 
+0

另外,'==' - 這是你得到的,但是是錯誤的一個重要部分 – FrankieTheKneeMan

+0

注意Danial A. White的註釋,不要在SQL語句中直接使用輸入數據,無論是通過'$ _GET'還是'$ _POST',總是過濾數據,所以你完全知道將要請求的信息的類型,嘗試使用'mysql_real_escape_string($ _ GET ['cid'])'並且確保它是一個帶有'is_int($ _ GET ['cid'])的整數' 。 – user1477388

+0

它是一個MSSQL數據庫,而不是MySQL。所以我不認爲mysql-real_escape可以工作,並且據我所知,沒有MSSQL的等價物?我確實使用字符串格式化了大部分查詢,但不是當我只是測試功能。懶惰,我知道。:p謝謝:) – Bohdi

0

試試這個

<?php 
if (isset($_GET['change']) && $_GET['change'] == "image1") { 
    $query = "UPDATE Table_Name SET Image = '' WHERE NewsID =".$_GET['cid']." "; 
} 

?> 
+1

'if(isset($ _ GET ['change'] ==「image1」)'不正確 –

+0

我已經準備好更新我的答案請看看 –

2

做更多的事情要考慮:

1)不要在MySQL查詢

WHERE NewsID =".$_GET['cid']." 

這是很容易與一些時髦的SQL注入利用此使用直接從$ _GET unsanitized值(見http://xkcd.com/327/)。

如果您正在使用CID數值,你應該投你的$ _GET價值爲整數,以防止SQL注入:

$cid = (int)$_GET['cid]; 
$query = '(...)WHERE NewsID = '.$cid.' limit 1'; 

甚至更​​好:

$cid = (int)(array_key_exists('cid', $_GET) ? $_GET['cid'] : 0); 
if ($cid) { 
    $query = (...) 
} 

如果您需要這種在不同的地方進行消毒,你應該考慮爲它編寫一個輔助函數,以保持代碼的可讀性。

2)不要使用GET請求來改變你的服務器

數據試想一下,一個谷歌機器人瀏覽您的網站,以下所有那些你用它來刪除圖像的鏈接。其他場景涉及用戶爲其瀏覽器提供預取插件(例如Fasterfox)。此外,GET請求可能會被代理和瀏覽器緩存,因此如果您點擊鏈接,請求將不會觸及服務器。

HTTP規範配備了衆多的請求方法,最重要的是:

  • GET從服務器
  • PUT獲取內容存儲在服務器上的新信息
  • POST更新現有在服務器上的信息

要更新您的新聞記錄(通過刪除圖像)ap propriate方法將是POST。要發送POST請求,您可以使用<form method="POST">標記。