将值从一个表插入到另一个表中

时间:2012-02-14 23:05:01

标签: php mysql sql insert

我有这个代码来选择'jobseeker'表中的所有字段,并且它应该通过将userType设置为'admin'来更新'user'表,其中userID = $ userID(此userID是a用户在我的数据库中)。然后该语句应该将这些值从'jobseeker'表中插入'admin'表中,然后从'jobseeker表中删除该用户。 sql表很好,我的语句正在将userType更改为admin并从'jobseeker'表中获取用户...但是,当我进入数据库(通过phpmyadmin)时,管理员已被添加,没有任何详细信息。任何人都可以解释为什么$ userData没有从'jobseeker'表中传递用户的详细信息并将它们插入'admin'表中?

以下是代码:

<?php

include ('../database_conn.php');

$userID = $_GET['userID'];

$query = "SELECT * FROM jobseeker WHERE userID = '$userID'";
$result = mysql_query($query);
$userData = mysql_fetch_array ($result, MYSQL_ASSOC);
$forename = $userData ['forename'];
$surname = $userData ['surname'];
$salt = $userData ['salt'];
$password = $userData ['password'];
$profilePicture = $userData ['profilePicture'];

$sQuery = "UPDATE user SET userType = 'admin' WHERE userID = '$userID'";

$rQuery = "INSERT INTO admin (userID, forename, surname, salt, password, profilePicture) VALUES ('$userID', '$forename', '$surname', '$salt', '$password', '$profilePicture')";

$pQuery = "DELETE FROM jobseeker WHERE userID = '$userID'";


mysql_query($sQuery) or die (mysql_error());
$queryresult = mysql_query($sQuery) or die(mysql_error());


mysql_query($rQuery) or die (mysql_error());
$queryresult = mysql_query($rQuery) or die(mysql_error());

mysql_query($pQuery) or die (mysql_error());
$queryresult = mysql_query($pQuery) or die(mysql_error());


mysql_close($conn);


header ('location:     http://www.numyspace.co.uk/~unn_v002018/webCaseProject/index.php');

?>

2 个答案:

答案 0 :(得分:5)

首先,永远不要在某些代码中使用SELECT *:如果表结构发生变化(从不说永远不会),它会咬你(或者必须维护这个应用程序的人)。

您可以考虑使用直接从INSERT获取其值的SELECT

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

您不必通过PHP来执行此操作。

(在此答案的早期版本中使用上述依赖于mysql_real_escape_string的示例的道歉。Using mysql_real_escape_string is not a good idea,虽然它可能比将参数直接放入查询字符串要好一些。)

我不确定您使用的是哪个MySQL引擎,但您也应该考虑在单个事务中执行这些语句(您需要InnoDB而不是MyISAM)。

此外,我建议使用mysqli and prepared statements来绑定参数:这是一种更清晰的方法,不必转义输入值(以避免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读取还是请求参数)。

答案 1 :(得分:-1)

您的代码没有明显的错误(除了直接从$ _GET使用非转义值不安全)。

我建议您尝试以下方法进行调试:

  1. var_dump $ userData用于检查值是否符合您的预期
  2. var_dump $ rQuery并将其复制并粘贴到phpMyAdmin中以查看您的查询是否与预期不符合
  3. 如果您没有发现问题,请将您的调查结果与您正在处理的表格结构一起发回