2012-02-14 6 views
1

У меня есть этот код, чтобы выбрать все поля из таблицы «jobseeker», и с ним предполагается обновить таблицу «user», установив userType в «admin», где userID = $ userID (этот идентификатор пользователя принадлежит моей базе данных). Утверждение затем должно ВСТАВИТЬ эти значения из таблицы «jobseeker» в таблицу «admin», а затем удалить этого пользователя из таблицы «jobseeker». Таблицы sql прекрасны, и мои инструкции меняют userType на admin и принимают пользователя из таблицы «jobseeker» ... однако, когда я вхожу в базу данных (через phpmyadmin), администратор добавлен ни одной из деталей, , Может ли кто-нибудь пролить свет на это, почему $ userData не передает данные пользователя из таблицы «jobseeker» и вставляет их в таблицу «admin»?INSERTING значения из одной таблицы в другую таблицу

Вот код:

<?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

M y userID - 'или 1 = 1; - ' –

+0

@EugenRieck у него есть магические цитаты. – Petah

+0

добавить отладочную печать $ userID и $ userData перед запросами и посмотреть. – alfasin

ответ

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-инъекций).

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

EDIT 3: я не понял ваш userID был int (но это, вероятно, так, как вы сказали, что он автоматически увеличивается в комментарии): отбросьте его к int и/или не используйте его как строку (т. е. с кавычками) в WHERE userID = '$userID' (но опять же, никогда не вставляйте свою переменную непосредственно в запрос, независимо от того, читаете ли вы из DB или параметр запроса).

+0

Хе-хе, я полностью согласен, но открываю с «никогда» и закрываю «никогда не говори никогда» – CBusBus

+0

@Bruno, извините, у меня есть 3 заявления. Но да, вы правы, он вставляет новую строку независимо от того, имеет ли она значения или нет. Моя проблема теперь, похоже, получает значения, однако, используя $ _GET ['userID'] в верхней части кода, который должен иметь информацию от ищущего работу, применяемого к нему, когда этот файл вызывается из формы через . –

+0

(Я удалил некоторые комментарии, возможно, нам нужно удалить их больше, это будет длиться, я удалю это.) В любом случае, это то, что вы получаете от '$ _GET ['userID']' correct и имеет ли он запись в вашей базе данных? Опять же, вне зависимости от того, НЕ ВКЛЮЧАЙТЕ значение прямо в '' $ someVar''. Также отключите магические кавычки в настройках PHP. – Bruno

-1

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

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

  1. var_dump $ USERDATA, чтобы проверить, что значения, как вы ожидаете
  2. var_dump $ RQUERY и скопировать и вставить ее в PhpMyAdmin, чтобы увидеть если ваш запрос не как вы ожидаете

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

+0

Спасибо, что ответили на мой вопрос. Я сделал var_dump как для userData, так и для rQuery, а вывод: bool (false) string (308) "INSERT INTO admin (userID, имя, фамилия, соль, пароль, profilePicture) VALUES (' Примечание: Неопределенная переменная: userID в /var/www/vhosts/numyspace.co.uk/web_users/home/~unn_v002018/public_html/webCaseProject/includes/adminEditJS.php в строке 107 ',' ',' ',' ',' ',' «)» –

Смежные вопросы