2015-04-28 71 views
-1

我檢查如果網址首先存在,看看他是否第一次投票,如果是的話,那麼我會添加用戶聲譽upvoted列,但我想只添加到該網址不是所有的URL,這段代碼添加到「upvotes」列中的所有元組,我希望它只添加到特定的元組。需要更新只有一個元組,但這是更新整個列在表

<!Doctype html> 
<html> 
<?php 
$c=$_GET['a'];// users name 
$d=$_GET['b'];// usesrs id 
$e=$_GET['c'];// users repute 
$ur=$_POST['url']; 

// Create connection 
$con=mysqli_connect("localhost","root","","repute system"); 
    if(mysqli_connect_errno()){ 
     echo "ERROR ".mysqli_connect_error(); 
} 

$sql = mysqli_query($con,"SELECT * FROM sites"); 
if (mysqli_num_rows($sql) > 0) { 
    // output data of each row 
    while($row = mysqli_fetch_assoc($sql)) 
    { 

     if($ur == $row['URL'] && $d != $row['id']) 
     { 
     $ne = $row['upvotes'] + $e; 
     $sol = mysqli_query($con, "UPDATE sites SET upvotes = $ne "); 
     $bew = mysqli_query($con,"INSERT INTO v_sites(teacher_id,URL,vote) VALUES ('$d','$ur','$e')"); 
     echo "Upvoted the site "; 
     echo $ur;  
     } 
    } 
} else { 
    echo "Sorry before upvoting you have to block it first or you are trying to upvote your own report, in which you cant"; 
} 
?> 
</html> 
+1

您需要更新語句中的where子句。 – Maximus2012

+0

它應該更新哪個特定的元組?它應該怎麼知道它是什麼? – Barmar

+0

'更新網站設置upvotes = $ ne'是的,這樣做。如上所述....哪裏在哪裏?請閱讀更新https://dev.mysql.com/doc/refman/5.0/en/update。html –

回答

1

由於您未使用where子句,因此所有行都正在更新。

UPDATE sites SET upvotes = $ne 

應改爲:

UPDATE sites SET upvotes = $ne WHERE id='$d' 

但是,如果$ne也是一個字符串,$ne也應該被引用:

UPDATE sites SET upvotes = '$ne' WHERE id='$d' 

閱讀上UPDATE

「我的表在網站名字有5列,分別是URL,狀態,upvotes,downvotes,身份證和所有的VARCHAR與30的長邊」

這告訴我認爲id也是VARCHAR;不是一個好主意,但這取決於你。對於像這樣的查詢,最好使用int,因爲所有的ID都是基於數字的。

這就是爲什麼在$d變量周圍使用引號WHERE id='$d'的原因。


您現在的代碼對SQL injection開放。使用prepared statementsPDO with prepared statements,他們更安全

+0

這一行'UPDATE sites SET upvotes = $ ne WHERE id ='$ d''更新upvotes爲用戶的id嘗試upvote塊,多數民衆贊成不是我的意圖,我想upvotes的更新具有相同的url在分貝和相同的網址輸入 – razor

+0

@razor'WHERE id ='$ d'AND URL ='$ ur''或'WHERE URL ='$ ur'' –

+0

@razor或'WHERE URL ='$ ur'AND id = ''''''''''''''''TBH,我的頭繞着它纏了一點麻煩。但根據您使用的變量嘗試一些組合。 –

1

您需要的URL匹配的WHERE條款:

$stmt = mysqli_prepare($con, "UPDATE sites 
           SET upvotes = upvotes + 1 
           WHERE url = ? AND id = ?"; 
mysqli_stmt_bind_param($stmt, "ss", $ur, $d); 
mysqli_stmt_execute($stmt); 

你不需要SELECTwhile循環,因爲MySQL能夠找到匹配的行,並通過自身全部更新。

您也不應該在循環內部有INSERT查詢,因爲它每次都插入相同的行。

如上所示,您應該切換到準備好的語句,而不是將字符串插入到查詢中,因爲您的代碼需要SQL注入。

+0

Upvoted爲使用預準備語句的實際示例。 –

相關問題