ВСТАВЛЕНИЕ значений из одной таблицы в другую таблицу - PullRequest
1 голос
/ 15 февраля 2012

У меня есть этот код, чтобы выбрать все поля из таблицы 'jobseeker', и с его помощью предполагается обновить таблицу 'user', установив userType в 'admin', где userID = $ userID (этот userID имеетПользователь в моей базе данных).Затем оператор должен вставить эти значения из таблицы «ищущий работу» в таблицу «администратор», а затем удалить этого пользователя из таблицы «ищущий работу».Таблицы 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 ]

5 голосов
/ 15 февраля 2012

Во-первых, никогда не используйте 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' (но опять же, никогда не вставляйте вашу переменную непосредственно в запрос, будь то чтение из БД или параметр запроса).

0 голосов
/ 15 февраля 2012

Нет ничего плохого в вашем коде (кроме того, что он небезопасен при использовании неэкранированных значений непосредственно из $ _GET).

Я бы посоветовал вам попробовать следующее для отладки:

  1. var_dump $ userData, чтобы проверить, что значения соответствуют ожидаемым
  2. var_dump $ rQuery, скопируйте и вставьте его в phpMyAdmin, чтобы увидеть, не соответствует ли ваш запрос ожидаемому

Если вы не нашли свою проблему, то, пожалуйста, опубликуйте свои выводы вместе со структурой таблиц, с которыми вы имеете дело

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...