Gebruik ten eerste nooit SELECT *
in sommige code:het zal je bijten (of degene die deze applicatie moet onderhouden) als de tabelstructuur verandert (zeg nooit nooit).
Je zou kunnen overwegen om een INSERT
. te gebruiken die zijn waarden haalt uit een SELECT
direct:
"INSERT INTO admin(userID, forename, ..., `password`, ...)
SELECT userID, forename, ..., `password`, ...
FROM jobseeker WHERE userID = ..."
Je hoeft hiervoor niet via PHP te gaan.
(Excuses voor het gebruik van een voorbeeld hierboven dat was gebaseerd op mysql_real_escape_string
in een eerdere versie van dit antwoord. mysql_real_escape_string
gebruiken is geen goed idee
, hoewel het waarschijnlijk iets beter is dan de parameter rechtstreeks in de queryreeks te plaatsen.)
Ik weet niet zeker welke MySQL-engine u gebruikt, maar u zou moeten overwegen om die verklaringen ook binnen een enkele transactie te doen (u zou InnoDB nodig hebben in plaats van MyISAM).
Daarnaast raad ik aan om mysqli
te gebruiken en opgestelde verklaringen
om parameters te kunnen binden:dit is een veel schonere manier om niet te hoeven ontsnappen aan de invoerwaarden (om SQL-injectie-aanvallen te voorkomen).
BEWERK 2:
(Misschien wilt u de magische aanhalingstekens uitschakelen als ze aan staan.)
$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();
BEWERK 3: Ik had je userID
niet gerealiseerd was een int (maar dat is waarschijnlijk wat het is omdat je hebt gezegd dat het automatisch wordt verhoogd in een opmerking):cast het naar een int en/of gebruik het niet als een string (d.w.z. met aanhalingstekens) in WHERE userID = '$userID'
(maar nogmaals, voeg uw variabele nooit rechtstreeks in een query in, of deze nu wordt gelezen uit de DB of een verzoekparameter).