Thứ nhất, không bao giờ sử dụng SELECT *
trong một số mã:nó sẽ cắn bạn (hoặc bất cứ ai phải duy trì ứng dụng này) nếu cấu trúc bảng thay đổi (không bao giờ nói không bao giờ).
Bạn có thể cân nhắc sử dụng INSERT
lấy các giá trị của nó từ một SELECT
trực tiếp:
"INSERT INTO admin(userID, forename, ..., `password`, ...)
SELECT userID, forename, ..., `password`, ...
FROM jobseeker WHERE userID = ..."
Bạn không cần phải sử dụng PHP để thực hiện việc này.
(Xin lỗi vì đã sử dụng một ví dụ ở trên dựa trên mysql_real_escape_string
trong một phiên bản trước của câu trả lời này. Sử dụng mysql_real_escape_string
không phải là một ý kiến hay
, mặc dù nó có lẽ tốt hơn một chút so với việc đặt tham số trực tiếp vào chuỗi truy vấn.)
Tôi không chắc bạn đang sử dụng công cụ MySQL nào, nhưng bạn cũng nên cân nhắc thực hiện các câu lệnh đó trong một giao dịch duy nhất (bạn sẽ cần InnoDB thay vì MyISAM).
Ngoài ra, tôi khuyên bạn nên sử dụng mysqli
và các tuyên bố chuẩn bị sẵn
để có thể liên kết các tham số:đây là một cách dễ dàng hơn nhiều để không phải thoát các giá trị đầu vào (để tránh các cuộc tấn công SQL injection).
CHỈNH SỬA 2:
(Bạn có thể muốn tắt các dấu ngoặc kép nếu chúng đang bật.)
$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();
CHỈNH SỬA 3: Tôi không nhận ra userID
của bạn là một int (nhưng có thể đó là những gì bạn đã nói vì nó tự động tăng trong một nhận xét):truyền nó thành một int và / hoặc không sử dụng nó như một chuỗi (tức là có dấu ngoặc kép) trong WHERE userID = '$userID'
(nhưng một lần nữa, đừng bao giờ chèn trực tiếp biến của bạn vào một truy vấn, dù là đọc từ DB hay tham số yêu cầu).