簡體   English   中英

將值從一個表插入另一個表

[英]INSERTING values from one table into another table

我有這段代碼可以從“ 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');

?>

首先,切勿在某些代碼中使用SELECT * :如果表結構發生變化(永遠不要說從不),它將(或必須維護此應用程序的人)咬住您。

您可以考慮使用直接從SELECT獲取其值的INSERT

"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和prepared語句能夠綁定參數:這是一種更干凈的方法,不必轉義輸入值(以避免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' (但同樣,永遠不要將變量直接插入查詢中,無論是從數據庫中讀取還是從請求參數中讀取)。

您的代碼沒有什么明顯的錯誤(除了使用$ _GET中的非轉義值不安全之外)。

我建議您嘗試以下操作以進行調試:

  1. var_dump $ userData以檢查值是否符合您的期望
  2. var_dump $ r查詢並將其復制並粘貼到phpMyAdmin中,以查看您的查詢是否不符合預期

如果您找不到問題,請回發您的發現以及要處理的表的結構

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM