2013-07-09 28 views
-2

我有我的PHP頁面上的刪除選項,但我已添加選項來刪除前存檔的數據,但同時我想更新用戶名與人會話用戶名。更新用戶列與會話

$id=$_GET['id']; 

$sql="INSERT INTO c_archive_table(tech, eng, dr) SELECT tech, eng, dr FROM `Com` WHERE `id`='$id'"; 
$sql_user = "INSERT INTO c_archive_table('','user','$_SESSION['username']') WHERE `id`='$id'"; 
$sql_delete="DELETE FROM `Com` WHERE `id`='$id'"; 

如此移動歸檔和刪除工作,但添加用戶會話到用戶列不起作用。

+4

看在上面的問題的高亮。它會告訴你一個可能的問題。 – andrewsi

+6

另外,請修復代碼中的漏洞SQL注入漏洞。 – 2013-07-09 20:30:18

回答

2

它不會是一個INSERT這將是一個UPDATE

$sql_user = "UPDATE c_archive_table SET 'user'='".$_SESSION['username']."' WHERE `id`='$id'"; 

更換user列與任何列名$_SESSION名進入

+0

我想,你需要用反引號代替用戶的引號。 – andrewsi

+0

謝謝,但有些原因仍然沒有更新用戶名sql'echo $ _SESSION ['username'];'顯示用戶名但不知道爲什麼不保存在sql上。 – user1212143

+0

'$ sql_user =「UPDATE c_archive_table SET'user'='」。$ _ SESSION ['username']。''WHERE UPDATE c_archive_table.id ='$ id'「;'做功了!謝謝您的幫助!! – user1212143

1
$sql = new mysqli(MYSQL_HOST, MYSQL_USERNAME, MYSQL_PASSWORD, MYSQL_DATABASE); 

// 1. Find the row in the existing table and get the contents 
$query1 = ' 
SELECT 
    `tech`, 
    `eng`, 
    `dr` 
FROM `Cnom` 
WHERE 
    `id` = "'.$sql->real_escape_string($_GET['id']).'" 
;'; 
    // Use real_escape_string to sanitize anything that the user could modify 
$result1 = $sql->query($query1) or die ("<pre>Query failed:\n$query1</pre>"); 
    // die()ing with the query is always helpful for debugging 
$row1 = $result1->fetch_assoc() or die ("<pre>No result returned for id {$_GET['id']}</pre>"); 

// 2. Insert the contents into the archive 
$query2 = ' 
INSERT INTO `c_archive_table` (
    `user`, 
    `tech`, 
    `eng`, 
    `dr` 
) 
VALUES (
    "'.$sql->real_escape_string($_SESSION['username']).'", 
    "'.$sql->real_escape_string($row1['tech']).'", 
    "'.$sql->real_escape_string($row1['eng']).'", 
    "'.$sql->real_escape_string($row1['dr']).'" 
);'; 
$sql->query($query2) or die ("<pre>Query failed:\n$query2</pre>"); 

// 3. Delete from the original table 
$query3 = ' 
DELETE FROM `Cnom` 
WHERE 
    `id` = "'.$sql->real_escape_string($_GET['id']).'" 
;'; 
$sql->query($query3) or die ("<pre>Query failed:\n$query3</pre>"); 

這可能是一個良好的開端,依據是什麼我猜你的數據庫表看起來像。順便說一句,我建議,在診斷MySQL問題時,你喜歡在這個例子中使用:用多行縮進寫你的查詢;並使用PHP的die (string)構造來打印出錯的查詢。然後,您可以清楚地查看查詢以查看任何明顯的語法錯誤,並且MySQL還可以告訴您錯誤發生在哪一行。您也可以將die() d查詢複製並粘貼到phpMyAdmin中。


更重要的是,這可能不是正確的設置。你應該擁有的,而不是兩個冗餘表中載有幾乎相同的信息,是一個列表archived列。然後,您只需將archived更改爲布爾值(true),並檢查是否嘗試訪問它。

例如(僞代碼):

if (accessing_all_records) { 
    // Access all records that aren't archived 
    $query = ' 
SELECT 
    * 
FROM `Cnom` 
WHERE 
    `archived` = 0 
;'; 
} 

if (inserting_new_record) { 
    // Create a new record and set archived to 0 by default (better yet, give it a default value) 
    $query = ' 
INSERT INTO `Cnom` (
    `field_1`, 
    ..., 
    `archived` 
) 
VALUES (
    value_1, 
    ..., 
    0 
);'; 
} 

if (archiving) { 
    // Update the record and set the archived value to 1 
    $query = ' 
UPDATE `Cnom` 
SET 
    `archived` = 1 
WHERE 
    `id` = id 
;'; 
} 
+0

非常感謝您的詳細信息。 – user1212143