Mysql
 sql >> Base de données >  >> RDS >> Mysql

INSÉRER des valeurs d'une table dans une autre table

Tout d'abord, n'utilisez jamais SELECT * dans du code :il vous mordra (ou quiconque doit maintenir cette application) si la structure de la table change (ne dites jamais jamais).

Vous pourriez envisager d'utiliser un INSERT qui tire ses valeurs d'un SELECT directement :

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

Vous n'avez pas besoin de passer par PHP pour le faire.

(Excuses d'avoir utilisé un exemple ci-dessus qui reposait sur mysql_real_escape_string dans une version antérieure de cette réponse. Utilisation de mysql_real_escape_string n'est pas une bonne idée , même si c'est probablement légèrement mieux que de mettre le paramètre directement dans la chaîne de requête.)

Je ne sais pas quel moteur MySQL vous utilisez, mais vous devriez également envisager de faire ces déclarations dans une seule transaction (vous auriez besoin d'InnoDB au lieu de MyISAM).

De plus, je suggérerais d'utiliser mysqli et relevés préparés pouvoir lier des paramètres :c'est une façon beaucoup plus propre de ne pas avoir à échapper les valeurs d'entrée (afin d'éviter les attaques par injection SQL).

MODIFICATION 2 :

(Vous voudrez peut-être désactiver les guillemets magiques s'ils sont activés.)

$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();

MODIFICATION 3 : Je n'avais pas réalisé votre userID était un entier (mais c'est probablement ce que c'est puisque vous avez dit qu'il est auto-incrémenté dans un commentaire) :convertissez-le en un entier et/ou ne l'utilisez pas comme une chaîne (c'est-à-dire avec des guillemets) dans WHERE userID = '$userID' (mais encore une fois, n'insérez jamais votre variable directement dans une requête, qu'elle soit lue à partir de la base de données ou d'un paramètre de requête).