2013-04-30 23 views
3

我想,如果一個記錄犯規設i添加它,否則更新...但它不工作,什麼錯,此代碼:插入一條記錄,或者如果存在,那麼在MySQL行不通更新

<?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); 
     } 
?> 
+2

不起作用?你有什麼錯誤嗎? – 2013-04-30 07:24:27

+1

你是什麼意思?不工作意味着不更新或不插入? – DevT 2013-04-30 07:25:02

+0

爲什麼你要做多個查詢?使用INSERT OR ON DUPLICATE KEY UPDATE像這樣:INSERT INTO tblclientoptions(ClientID,LateTarget)VALUES($ lid,$ latetarget)ON DUPLICATE KEY UPDATE LateTarget = $ latetarget' – Dave 2013-04-30 07:28:47

回答

9

實際上,你可以做一個單一的查詢,因爲MySQL已實施INSERT ... ON DUPLICATE KEY UPDATE基本上INSERT是個記錄,如果不存在,否則它UPDATE這樣。

您需要做的第一件事是在表格中添加一個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' 

一點題外話,查詢是脆弱的如果變量的值(s)來自外部,則爲SQL Injection。請看下面的文章,瞭解如何防止它。通過使用PreparedStatements你可以擺脫使用單引號圍繞值。

0

$user_email="user_email";應該$user_email=$_POST["user_email"];

2

您忘記)這裏

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 
3
$user_email="user_email"; 

應改爲

$user_email=$_POST['user_email']; 

和失蹤(辛博爾,如@Yogesh Suthar說。您還應該考慮使用mysql_real_escape_string函數來轉義字符串中的字符。

2

更好的辦法是使用

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

也使用綁定和準備的語句,使之更加安全。你的代碼是非常不安全的,因爲你既沒有轉義函數也沒有轉義。

使用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 [email protected]"); 
$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首先刪除舊記錄,然後插入一條新記錄。

相關問題