2012-02-14 222 views
1

我有這個代碼來選擇'求職者'表中的所有字段,並且它應該通過將userType設置爲'admin'來更新'user'表,其中userID = $ userID(這個用戶ID是我數據庫中的一個用戶)。然後聲明將這些值從「求職者」表中插入到「管理員」表中,然後從「求職者」表中刪除該用戶。 sql表很好,我的語句正在將userType更改爲admin,並將用戶從'jobseeker'表中...然而,當我進入數據庫(通過phpmyadmin)時,管理員已添加了所有細節。請任何人都可以闡明爲什麼$ userData沒有從'求職者'表中傳遞用戶的詳細信息並將其插入到'管理員'表中?從一個表插入值到另一個表

下面是代碼:

<?php 

include ('../database_conn.php'); 

$userID = $_GET['userID']; 

$query = "SELECT * FROM jobseeker WHERE userID = '$userID'"; 
$result = mysql_query($query); 
$userData = mysql_fetch_array ($result, MYSQL_ASSOC); 
$forename = $userData ['forename']; 
$surname = $userData ['surname']; 
$salt = $userData ['salt']; 
$password = $userData ['password']; 
$profilePicture = $userData ['profilePicture']; 

$sQuery = "UPDATE user SET userType = 'admin' WHERE userID = '$userID'"; 

$rQuery = "INSERT INTO admin (userID, forename, surname, salt, password, profilePicture) VALUES ('$userID', '$forename', '$surname', '$salt', '$password', '$profilePicture')"; 

$pQuery = "DELETE FROM jobseeker WHERE userID = '$userID'"; 


mysql_query($sQuery) or die (mysql_error()); 
$queryresult = mysql_query($sQuery) or die(mysql_error()); 


mysql_query($rQuery) or die (mysql_error()); 
$queryresult = mysql_query($rQuery) or die(mysql_error()); 

mysql_query($pQuery) or die (mysql_error()); 
$queryresult = mysql_query($pQuery) or die(mysql_error()); 


mysql_close($conn); 


header ('location:  http://www.numyspace.co.uk/~unn_v002018/webCaseProject/index.php'); 

?> 
+2

M上的表的結構沿後回你的發現y userID是「'或1 = 1; - ' – 2012-02-14 23:07:54

+0

@EugenRieck他有魔術引號。 – Petah 2012-02-14 23:12:37

+0

在查詢和查看之前添加$ userID和$ userData的調試打印。 – alfasin 2012-02-14 23:17:28

回答

5

首先,永遠不要在一些代碼中使用SELECT *:它會咬你(或誰擁有保持這個應用程序)如果表結構的變化(永遠不能說永不)。

你可以考慮使用INSERT從一個SELECT直接取其值:

"INSERT INTO admin(userID, forename, ..., `password`, ...) 
    SELECT userID, forename, ..., `password`, ... 
    FROM jobseeker WHERE userID = ..." 

你不必通過PHP去做到這一點。

(道歉使用上面的例子在這個答案的早期版本依靠mysql_real_escape_stringUsing mysql_real_escape_string is not a good idea,儘管它可能略高於直接把參數到查詢字符串更好。)

我不知道你正在使用哪種MySQL引擎,但是你也應該考慮在單個事務中執行這些語句(你需要InnoDB而不是MyISAM)。另外,我建議使用mysqli and prepared statements來綁定參數:這是一種更簡潔的方式,不必轉義輸入值(以避免SQL注入攻擊)。

編輯2:

(你可能想,如果他們是在關閉魔術引號)。

$userID = $_GET['userID']; 

// Put the right connection parameters 
$mysqli = new mysqli("localhost", "user", "password", "db"); 

if (mysqli_connect_errno()) { 
    printf("Connect failed: %s\n", mysqli_connect_error()); 
    exit(); 
} 

// Use InnoDB for your MySQL DB for this, not MyISAM. 
$mysqli->autocommit(FALSE); 

$query = "INSERT INTO admin(`userID`, `forename`, `surname`, `salt`, `password`, `profilePicture`)" 
    ." SELECT `userID`, `forename`, `surname`, `salt`, `password`, `profilePicture` " 
    ." FROM jobseeker WHERE userID=?"; 

if ($stmt = $mysqli->prepare($query)) { 
    $stmt->bind_param('i', (int) $userID); 
    $stmt->execute(); 
    $stmt->close(); 
} else { 
    die($mysqli->error); 
} 

$query = "UPDATE user SET userType = 'admin' WHERE userID=?"; 

if ($stmt = $mysqli->prepare($query)) { 
    $stmt->bind_param('i', (int) $userID); 
    $stmt->execute(); 
    $stmt->close(); 
} else { 
    die($mysqli->error); 
} 

$query = "DELETE FROM jobseeker WHERE userID=?"; 

if ($stmt = $mysqli->prepare($query)) { 
    $stmt->bind_param('i', (int) $userID); 
    $stmt->execute(); 
    $stmt->close(); 
} else { 
    die($mysqli->error); 
} 

$mysqli->commit(); 

$mysqli->close(); 

編輯3:我沒有意識到你的userID是一個int(但這可能是因爲你已經說過它在註釋中自動遞增):在WHERE userID = '$userID'中將其轉換爲int並/或不將其用作字符串(即帶引號)(但同樣,不要直接在查詢中插入變量,無論是從中讀取DB或請求參數)。

+0

赫赫我完全同意,但開放與「永不」,並與「永不說永遠不會」 – CBusBus 2012-02-14 23:21:12

+0

@布魯諾,對不起,我有3個陳述。但是,是的,你是對的,它插入一個新的行,不管它是否有值。我現在的問題似乎是獲取值,但是,即使在代碼的頂部使用$ _GET ['userID'],應該從求職者的信息應用到它時,通過。 – 2012-02-15 00:16:00

+0

(我刪除了一些註釋,也許我們應該刪除更多,它會變長;我會刪除這個。)無論如何,你從$ _GET ['userID']得到正確嗎?它是否有條目在你的數據庫?不管怎樣,不要像「$ someVar」那樣直接輸入任何值。也關閉PHP設置中的魔術引號。 – Bruno 2012-02-15 00:20:02

-1

你的代碼沒有什麼明顯的錯誤(除了直接從$ _GET中使用非轉義值的不安全)。

我建議你試試下述順序的調試:

  1. 的var_dump $用戶數據來檢查值按預期
  2. 的var_dump $ rQuery複製並粘貼到phpMyAdmin來看看如果您的查詢並不像你期望

如果你沒有找到你的問題,那麼請你處理

+0

謝謝你回答我的問題。我在userData和rQuery上做了var_dump,輸出結果如下: bool(false)string(308)「INSERT INTO admin(userID,forename,surname,salt,password,profilePicture)VALUES(' 注意:Undefined variable: userID in /var/www/vhosts/numyspace.co.uk/web_users/home/~unn_v002018/public_html/webCaseProject/includes/adminEditJS.php on line 107 ','','','','','' 「)」 – 2012-02-14 23:43:33