まず、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エンジンはわかりませんが、これらのステートメントを1つのトランザクション内で実行することも検討する必要があります(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'
(ただし、DBから読み取るか、リクエストパラメータから読み取るかにかかわらず、変数をクエリに直接挿入しないでください)。