小编典典

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

sql

我有这段代码可以从“ jobseeker”表中选择所有字段,并可以通过将userType设置为“ admin”来更新“ user”表,其中userID =$ userID(此userID是我用户中的一个用户数据库)。然后,该语句应将这些值从“ jobseeker”表插入到“ admin”表中,然后从“
jobseeker表”中删除该用户。sql表很好,我的语句正在将userType更改为admin并从’jobseeker’表中获取用户…但是,当我进入数据库(通过phpmyadmin)时,没有添加任何细节的admin
。请问有人可以阐明为什么$ 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');

?>

阅读 169

收藏
2021-04-07

共1个答案

小编典典

首先,切勿使用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引擎,但是您也应该考虑在单个事务中执行这些语句(您将需要InnoDB而不是MyISAM)。

另外,我建议使用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'(但同样,永远不要将变量直接插入查询中,无论是从数据库中读取还是从请求参数中读取)。

2021-04-07