2012-02-14 157 views
1

我有这个代码来选择'求职者'表中的所有字段,并且它应该通过将userType设置为'admin'来更新'user'表,其中userID = $ userID(这个用户ID是我数据库中的一个用户)。然后声明将这些值从“求职者”表中插入到“管理员”表中,然后从“求职者”表中删除该用户。 sql表很好,我的语句正在将userType更改为admin,并将用户从'jobseeker'表中...然而,当我进入数据库(通过phpmyadmin)时,管理员已添加了所有细节。请任何人都可以阐明为什么$ userData没有从'求职者'表中传递用户的详细信息并将其插入到'管理员'表中?从一个表插入值到另一个表

下面是代码:

<?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; - ' – 2012-02-14 23:07:54

+0

@EugenRieck他有魔术引号。 – Petah 2012-02-14 23:12:37

+0

在查询和查看之前添加$ userID和$ userData的调试打印。 – alfasin 2012-02-14 23:17:28

回答

5

首先,永远不要在一些代码中使用SELECT *:它会咬你(或谁拥有保持这个应用程序)如果表结构的变化(永远不能说永不)。

你可以考虑使用INSERT从一个SELECT直接取其值:

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

你不必通过PHP去做到这一点。

(道歉使用上面的例子在这个答案的早期版本依靠mysql_real_escape_stringUsing 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(但这可能是因为你已经说过它在注释中自动递增):在WHERE userID = '$userID'中将其转换为int并/或不将其用作字符串(即带引号)(但同样,不要直接在查询中插入变量,无论是从中读取DB或请求参数)。

+0

赫赫我完全同意,但开放与“永不”,并与“永不说永远不会” – CBusBus 2012-02-14 23:21:12

+0

@布鲁诺,对不起,我有3个陈述。但是,是的,你是对的,它插入一个新的行,不管它是否有值。我现在的问题似乎是获取值,但是,即使在代码的顶部使用$ _GET ['userID'],应该从求职者的信息应用到它时,通过。 – 2012-02-15 00:16:00

+0

(我删除了一些注释,也许我们应该删除更多,它会变长;我会删除这个。)无论如何,你从$ _GET ['userID']得到正确吗?它是否有条目在你的数据库?不管怎样,不要像“$ someVar”那样直接输入任何值。也关闭PHP设置中的魔术引号。 – Bruno 2012-02-15 00:20:02

-1

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

我建议你试试下述顺序的调试:

  1. 的var_dump $用户数据来检查值按预期
  2. 的var_dump $ rQuery复制并粘贴到phpMyAdmin来看看如果您的查询并不像你期望

如果你没有找到你的问题,那么请你处理

+0

谢谢你回答我的问题。我在userData和rQuery上做了var_dump,输出结果如下: bool(false)string(308)“INSERT INTO admin(userID,forename,surname,salt,password,profilePicture)VALUES(' 注意:Undefined variable: userID in /var/www/vhosts/numyspace.co.uk/web_users/home/~unn_v002018/public_html/webCaseProject/includes/adminEditJS.php on line 107 ','','','','','' “)” – 2012-02-14 23:43:33