sql >> Databáze >  >> RDS >> Mysql

VLOŽENÍ hodnot z jedné tabulky do jiné tabulky

Za prvé, nikdy nepoužívejte SELECT * v nějakém kódu:kousne vás (nebo kohokoli, kdo musí tuto aplikaci udržovat), pokud se struktura tabulky změní (nikdy neříkej nikdy).

Můžete zvážit použití INSERT který přebírá své hodnoty z SELECT přímo:

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

K tomu nemusíte používat PHP.

(Omlouvám se za použití výše uvedeného příkladu, který se spoléhal na mysql_real_escape_string v dřívější verzi této odpovědi. Pomocí mysql_real_escape_string není dobrý nápad , i když je to pravděpodobně o něco lepší než vkládat parametr přímo do řetězce dotazu.)

Nejsem si jistý, který engine MySQL používáte, ale měli byste zvážit provádění těchto příkazů v rámci jedné transakce (potřebovali byste InnoDB místo MyISAM).

Kromě toho bych doporučil použít mysqli a připravené výpisy být schopen vázat parametry:toto je mnohem čistší způsob, jak nemuset unikat vstupním hodnotám (abyste se vyhnuli útokům SQL injection).

ÚPRAVA 2:

(Možná budete chtít vypnout kouzelné uvozovky, pokud jsou zapnuté.)

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

ÚPRAVA 3: Neuvědomil jsem si vaše userID byl int (ale to je pravděpodobně to, co to je, protože jste v komentáři řekli, že se automaticky zvyšuje):převeďte jej na int a/nebo jej nepoužívejte jako řetězec (tj. s uvozovkami) v WHERE userID = '$userID' (ale znovu, nikdy nevkládejte svou proměnnou přímo do dotazu, ať už čteného z DB nebo parametru požadavku).



  1. Jak funguje MYSQL Self-Join?

  2. 8 Nové funkce kompatibility Oracle v EnterpriseDB PPAS 9.2 Beta

  3. Jak zobrazit skutečný příkaz Oracle SQL, který se provádí

  4. Top 5 nástrojů pro monitorování dotazů PostgreSQL