सबसे पहले, कभी भी SELECT *
. का इस्तेमाल न करें कुछ कोड में:यदि तालिका संरचना बदलती है (कभी भी कभी नहीं कहें) तो यह आपको काट देगा (या जिसे भी इस एप्लिकेशन को बनाए रखना है)।
आप INSERT
. का उपयोग करने पर विचार कर सकते हैं जो इसके मान SELECT
. से लेता है सीधे:
"INSERT INTO admin(userID, forename, ..., `password`, ...)
SELECT userID, forename, ..., `password`, ...
FROM jobseeker WHERE userID = ..."
ऐसा करने के लिए आपको PHP के माध्यम से जाने की आवश्यकता नहीं है।
(उपरोक्त उदाहरण का उपयोग करने के लिए खेद है जो mysql_real_escape_string
पर निर्भर करता है इस उत्तर के पुराने संस्करण में। mysql_real_escape_string
का उपयोग करना एक अच्छा विचार नहीं है
, हालांकि यह पैरामीटर को सीधे क्वेरी स्ट्रिंग में डालने से थोड़ा बेहतर है।)
मुझे यकीन नहीं है कि आप किस MySQL इंजन का उपयोग कर रहे हैं, लेकिन आपको उन कथनों को एक ही लेन-देन में भी करने पर विचार करना चाहिए (आपको MyISAM के बजाय InnoDB की आवश्यकता होगी)।
इसके अलावा, मैं mysqli
का उपयोग करने का सुझाव दूंगा। और तैयार बयान
मापदंडों को बांधने में सक्षम होने के लिए:यह एक बहुत साफ तरीका है कि इनपुट मूल्यों से बचने के लिए नहीं (ताकि 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 था (लेकिन शायद यह वही है क्योंकि आपने कहा है कि यह एक टिप्पणी में स्वत:वृद्धि हुई है):इसे एक int पर डालें और/या इसे WHERE userID = '$userID'
(लेकिन फिर से, कभी भी अपने वेरिएबल को सीधे किसी क्वेरी में न डालें, चाहे वह डीबी से पढ़ा जाए या अनुरोध पैरामीटर)।