2012-02-14 18 views
1

'jobseeker'テーブルからすべてのフィールドを選択するコードがあり、userTypeを 'admin'に設定することで 'user'テーブルを更新するはずです。userID = $ userID(このuserIDは私のデータベースのユーザのものです)。ステートメントは、これらの値を 'jobseeker'テーブルから 'admin'テーブルにINSERTし、そのユーザーを 'jobseeker'テーブルから削除することになっています。 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

Mを扱っているテーブルの構造と一緒にあなたの調査結果をバック投稿してくださいy userIDは ''または1 = 1です。 - ' –

+0

@EugenRieck彼は魔法の言葉を引用しています。 – Petah

+0

クエリの前に$ userIDと$ userDataのデバッグプリントを追加して参照してください。 – alfasin

答えて

5

まず、いくつかのコードでSELECT *を使用しない:それはあなた(または誰でも、このアプリケーションを維持しなければならない)をかむテーブル構造の変更が(決して言うことはありません)場合。

あなたは直接SELECTからその値をとるINSERTの使用を検討できます。

"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エンジンを使用しているのですか?MyISAMではなくInnoDBが必要です。

さらに、パラメータをバインドできるようにmysqli and prepared statementsを使用することをお勧めします。これは、(SQLインジェクション攻撃を回避するために)入力値をエスケープする必要がない非常にクリーンな方法です。

EDIT 2:

(あなたは、彼らがにしている場合はマジッククオートをオフにすることをお勧めします。)EDIT 3

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

userIDはあなただった私は実現していなかったあなたがintにキャストしたり、文字列として引用符で囲んで使用したりしないでください(ただし、これはコメント内で自動的にインクリメントされているので、これはおそらくそれです)。WHERE userID = '$userID'変数をクエリに直接挿入しないでください。 DBまたは要求パラメータ)。

+0

Hehe私は完全に同意していますが、「決して」ないで開き、「決して言わないで」決して閉じないでください。 – CBusBus

+0

@ブリュノ、申し訳ありません。しかし、はい、それは値があるかどうかに関係なく、新しい行を挿入します。私の問題は今、値を取得しているようです。私は、このファイルがフォームから

+0

(私はいくつかのコメントを削除しました、おそらくもっと削除する必要があります、それは長くなります;私はこれを削除します)とにかく '$ _GET ['userID']'から得たもので、あなたのデータベースに?それにも関わらず、 '' $ someVar ''のように値をまっすぐ入れないでください。あなたのPHP設定でもマジック引用符をオフにしてください。 – Bruno

-1

コードには明らかに間違ったことは何もありません($ _GETから直接エスケープされていない値を使用することは安全ではありません)。

私はあなたがデバッグするために、次のことを試してくださいお勧めしたい:

  1. のvar_dump $のuserDataをあなたは
  2. のvar_dump $ rQuery期待通りの値であることを確認し、確認するためにphpMyAdminの中にそれをコピーして貼り付けますあなたは

を期待するとして、あなたのクエリがない場合は、あなたの問題が見つからない場合、あなたは

+0

私の質問にお答えいただきありがとうございます。私はuserDataとrQueryの両方でvar_dumpを実行しました。出力は次のとおりです。 bool(false)string(308) "INSERT INTO admin(ユーザーID、姓、名字、塩、パスワード、profilePicture)VALUES( ' Notice: /var/www/vhosts/numyspace.co.uk/web_users/home/~unn_v002018/public_html/webCaseProject/includes/adminEditJS.php on line 107のユーザーID '、' '、' '、' '、' ' ')」 –