3

レコードが存在しない場合は追加して、それ以外の場合は更新することを望みます...しかし、機能しません。このコードの何が問題なのですか:

<?php
      $user_id=$_POST['user_id'];
      $user_email="user_email";
      $last_stage=$_POST['last_stage'];
      $score=$_POST['score'];
      $note=$_POST['note'];

      $con=mysqli_connect("localhost","ferfer","Drfrj","ferfw");
      $result = mysqli_query($con,"SELECT user_email FROM rating WHERE user_email='".$user_email."'");
      $num_rows = mysqli_num_rows($result);

      if ($num_rows > 0) {
        //echo "exist";
        mysqli_query($con,"UPDATE rating SET user_id=".$user_id.", user_email='".$user_email."', last_stage=".$last_stage.", score=".$score.", note='".$note."'  WHERE user_email='".$user_email."'";
        mysqli_close($con);
      }else{
        //echo "does not exist";
        mysqli_query($con,"INSERT INTO rating(user_id, user_email, last_stage, score, note)VALUES (".$user_id.",'".$user_email."',".$last_stage.",".$score.",'".$note."') ");          
        mysqli_close($con);
      }
 ?>
4

5 に答える 5

9

INSERT ... ON DUPLICATE KEY UPDATEMySQLが実装されているため、実際には単一のクエリで実行できます。これは、レコードが存在しない場合は基本的にレコードです。INSERTUPDATE

UNIQUE最初に行う必要があるのは、テーブルに列を追加することです。あなたの例では、それuser_emailが存在を探している列であることがわかります。これが一意でない場合は、UNIQUE制約のためにテーブルを変更する必要があります

ALTER TABLE rating ADD CONSTRAINT tb_uq UNIQUE(user_email)

実装後、次のようなクエリを作成し、

INSERT INTO rating(user_id, user_email, last_stage, score, note)
VALUES($user_id, '$user_email', last_stage, score, '$note')
ON DUPLICATE KEY UPDATE
   user_id = $user_id, 
   last_stage = $last_stage, 
   score = $score, 
   note= '$note'

補足として、変数のSQL Injection値が外部から取得された場合、クエリは脆弱です。予防方法については、以下の記事をご覧ください。を使用すると、値を一重引用符で囲む必要がなくなります。PreparedStatements

于 2013-04-30T07:29:19.960 に答える
3
$user_email="user_email";

に変更する必要があります

$user_email=$_POST['user_email'];

@Yogesh Suthar が言ったように、( シンボルがありません。mysql_real_escape_string 関数などを使用して、文字列内の文字をエスケープすることも検討する必要があります。

于 2013-04-30T07:26:42.697 に答える
2

you forgot ) here

mysqli_query($con,"UPDATE rating SET user_id=".$user_id.", user_email='".$user_email."', last_stage=".$last_stage.", score=".$score.", note='".$note."'  
WHERE user_email='".$user_email."'");
                                   ^ // here
于 2013-04-30T07:25:49.243 に答える
2

より良い方法は使用することです

REPLACE INTO `rating` (user_id,user_email,last_stage,score,note)
VALUES(@user_id,@user_email,@last_stage,@score,@note) WHERE user_email=@email

バインドおよび準備済みステートメントも使用して、より安全にします。エスケープ関数もキャストもしていないため、コードは非常に安全ではありません。

PHP でバインディングを使用する例。$dbh は PDO オブジェクトです。

$stmt = $dbh->prepare("REPLACE INTO `rating` (user_id,user_email,last_stage,score,note)
VALUES(@user_id,@user_email,@last_stage,@score,@note) WHERE user_email=@email");
$stmt->bindParam('@name', (int)$user_id);
$stmt->bindParam('@user_email', $user_email);
$stmt->bindParam('@last_stage', $last_stage);
$stmt->bindParam('@score', $score);
$stmt->bindParam('@note', $note);

http://pl1.php.net/pdoの詳細

バインディングを使用すると、文字列をエスケープする必要がありません。これは、SQL ステートメントに大まかにつなぎ合わせる必要なく、データベース層に直接入るためです。

MySQL REPLACE ステートメントは、追加のルールを持つ INSERT ステートメントのように機能します。

挿入したいレコードが存在しない場合、MySQL REPLACE は新しいレコードを挿入します。挿入したいレコードがすでに存在する場合、MySQL REPLACE はまず古いレコードを削除してから、新しいレコードを挿入します。

于 2013-04-30T07:29:09.723 に答える
0

$user_email="user_email"; should be $user_email=$_POST["user_email"];

于 2013-04-30T07:25:42.243 に答える