1

ユーザー入力に応じてデータベースの2つのフィールドを更新したいのですが、コードは次のようになります。

 <body>
<?php
 $db_server["host"] = "localhost"; //database server
$db_server["username"] = "root"; // DB username
$db_server["password"] = "mypass"; // DB password
$db_server["database"] = "mudb";// database name

$dbc = mysql_connect($db_server["host"], $db_server["username"], $db_server["password"]);
mysql_select_db($db_server["database"], $dbc);
$user =  $_COOKIE['mycookie'];

    $q = "SELECT * FROM members WHERE username='$user'"; 
    $r = mysql_query( $q,$dbc);
    while ($row = mysql_fetch_array($r, MYSQLI_ASSOC)) { 
    echo 'username: '.$row['username'], '<br/>';

    $password=$row['password'];
?>

<form method="post" id="changepasswordform" > 
<input type="password" id="newpassword" name="newpassword"/>
<input type="submit"  name="changepasswordbutton"  >  
       </form>

<?php

        echo 'email:        '.$row['email'], '<br/>'; 
        }
?>

<form method="post" id="changeemailform" >  

        <input type="text" id="newemail" name="newemail"/>

       <input type="submit" value="αλλαγή"  name="changeemailbutton"  >
       </form>

<?php
}


    if (isset($_POST['changepasswordbutton'])){

                       $newpassword=$_POST['newpassword'];
                $q2 = "UPDATE members SET password=$newpassword WHERE username='$user'"; 

                $r2 = mysql_query($q2,$dbc);

}   

if (isset($_POST['changeemailbutton'])){
                    $newemail=$_POST['newemail'];
                    $q3 = "UPDATE members SET email=$newemail WHERE username='$user'"; 
                $r3 = @mysql_query( $q3,$dbc);  
}
?>
</body>

ただし、更新しようとすると、データベースへの接続は正常です(SELECTは期待どおりに結果を表示します)が、データベース内の値は同じままです。$newpasswordと$newemailの値を確認したところ、毎回ユーザー入力が含まれています。 。ここで何が欠けていますか?

4

2 に答える 2

4

''パスワードフィールドを囲むはずの(引用符)がありません。変化する:

UPDATE members SET password=$newpassword WHERE username='$user'

に:

UPDATE members SET password='{mysql_real_escape_string($password)}' 
WHERE username='{mysql_real_escape_string($user)}'

重要:
関連性はありませんが、関数は使用しないでくださいmysql_*。非推奨であり、sql-injectionに対して脆弱です。PDOまたはMySQLiを使用することをお勧めします。

于 2012-08-28T20:42:02.527 に答える
2

これはトリックを行い、SQLインジェクション()のために保存されますmysql_real_escape_string

 $q2 = "UPDATE members SET 
   password='". mysql_real_escape_string($password) ."' 
   WHERE username='". mysql_real_escape_string($user) ."';

しかし、もちろんmysql_*、もう使用するべきではありません。特定のケースの例を示しています。

于 2012-08-28T20:47:25.537 に答える