1

mysqldbに更新情報用のphpファイルを作成しました。htmlフォームから入力を取得し、IDを照合してデータを更新します。はい、これ:

<?
$con = mysql_connect("localhost","root","");
mysql_select_db("workshop", $con);
$sql = "UPDATE apply 
          SET staffname=' ".$_POST['name']." ', 
              staffno=' ".$_POST['contact']." ',
              staffemail=' ".$_POST['mail']." ',
              staffaddress=' ".$_POST['address']." ',
              paytype=' ".$_POST['paytype']."'
        WHERE 
            staffid=' ".$_POST['ic']." '";
$result = mysql_query($sql);
printf("Records updated: %d\n", mysql_affected_rows());
    if($result){
        echo "Successful";
}
    else {
        echo "ERROR";
}

mysql_close($con);
?>

うまく実行されますが、問題はテーブルの行に影響がないことです。phpmyadminでクエリを実行しても、運がありません。誰かがバグがどこにあるか教えてもらえますか?ありがとう!

4

5 に答える 5

2

以下のクエリを使用します。

$sql = "UPDATE `apply`
        SET `staffname` = '" . mysql_escape_string($_POST['name']) . "',
            `staffno` = '" . mysql_escape_string($_POST['contact']) . "',
            `staffemail` = '" . mysql_escape_string($_POST['mail']) . "',
            `staffaddress` = '" . mysql_escape_string($_POST['address']) . "',
            `paytype` = '" . mysql_escape_string($_POST['paytype']) . "'
        WHERE `staffid` = '" . mysql_escape_string($_POST['ic']) . "'";

編集

mysql_ *関数の代わりにPDOまたはmysqliを使用することを常にお勧めします が、今のところ、上記の解決策が機能する可能性があります。

于 2012-12-11T07:11:57.203 に答える
2

あなたのコードには言うべきことがたくさんあります:

非推奨ですが、最初にmysql_ APIを使用する場合は、PDOまたはmysqliを使用する必要があります。

次に、毎回空白を追加しますが、IDの照合には適していません。

そして、あなたはSQLインジェクションに対して脆弱です。

mysql_ apiを使用してコードを取得するには、「i」を削除するだけなので、mysqliapiを使用してコードを提供します。

$sql = "UPDATE apply 
      SET staffname='".mysqli_real_escape_string($con,$_POST['name'])."', 
          staffno='".mysqli_real_escape_string($con,$_POST['contact'])."',
          staffemail='".mysqli_real_escape_string($con,$_POST['mail'])."',
          staffaddress='".mysqli_real_escape_string($con,$_POST['address'])."',
          paytype='".mysqli_real_escape_string($con,$_POST['paytype'])."'
    WHERE 
        staffid='".mysqli_real_escape_string($con,$_POST['ic'])."'";
  $result = mysqli_query($con,$sql);
printf("Records updated: %d\n", mysql_affected_rows());
if($result){
    echo "Successful";
}
else {
    echo "ERROR";
}
于 2012-12-11T07:04:57.627 に答える
0

コードは非常に悪い方法でSQLインジェクション用に開かれています。あなたのウェブサイトでそれを使用しないでください。PDOまたはMySQLi関数を使用します。

しかし、あなたには間隔の問題があります。

staffid=' ".$_POST['ic']." '";

する必要があります

staffid='".$_POST['ic']."'";
于 2012-12-11T07:07:12.733 に答える
0

クエリをコミットするか、autoCommitフラグをtrueに設定する必要があります(そのようなものがコンテキストに存在する場合)。

where-Clauseはどのレコードとも一致しますか?printf("Records updated: %d\n", mysql_affected_rows());影響を受ける行をいくつか印刷しますか?

staffid=' ".$_POST['ic']." '"artragisが述べたように、スペースを囲んでいるため、おそらくどのレコードとも一致しません。

于 2012-12-11T06:59:11.727 に答える
0

このコードはSQLインジェクションに対して脆弱に見えるため、本番環境での使用には注意が必要です。安全なmysqlデータベース通信を行うためにPDOをチェックします。

http://www.thegeekstuff.com/2012/02/sql-injection-attacks/

まだこれを行っていない場合は、必ず$ _POST ['ic']変数をログに記録するかエコーして、信頼できる値に設定されていることを確認してください。

于 2012-12-11T07:03:38.127 に答える