2013-07-01 21 views
1

我正試圖在表格中找到一個人並更新他們的分數。這是我現在的代碼。由於某種原因,它無法正常工作。它不會改變人的分數,它只會創建一個與該人同名的新行。在表格行中查找值,如果存在,請更新它

$name = $_POST["strtolower(name)"]; 
$team = $_POST["team"]; 
$num = $_POST["number"]; 
$goals = $_POST["goals"]; 

if($query = mysqli_query("SELECT goals FROM goalscorers WHERE name=$name ", $db)){ 
    while($row = mysqli_fetch_assoc($query)){ 
    $origgoals = $row['goals']; 
    $newgoals = (int)$origgoals + (int)$goals; 
    mysqli_query($db, "UPDATE goalscorers SET goals=$newgoals WHERE name=$name "); 
    echo "<h1>Thank you for submitting your details! <br /> <a href=\"goalscorers.php\">Add another</a></h1>"; 
    } 
    mysqli_free_result($query); 
} 
else { 
    $query = "INSERT INTO goalscorers (name, team, num, goals) VALUES ('$name','$team','$num','$goals') "; 
    $result = mysqli_query($query, $db); 
    if (mysqli_error()) { print "Database ERROR: " . mysql_error(); } 

    echo "<h1>Thank you for submitting your details! <br /> <a href=\"goalscorers.php\">Add another</a></h1>"; 
} 

我對PHP和MySQL都很陌生,所以這可能是一個基本的錯誤。

此外,我已經連接到數據庫。

+1

我不知道是誰告訴你以這種方式使用mysqli,但是不要「T。 –

+0

MySQL有更新重複主鍵的選項:http://dev.mysql.com/doc/refman/5.6/en/insert-on-duplicate.html這將讓你只有插入語句與ON DUPLICATE KEY UPDATE語法 – jxpx777

回答

1

你的直接問題是你的SQL查詢中沒有字符串值的引號。更改

"SELECT goals FROM goalscorers WHERE name=$name " 

"SELECT goals FROM goalscorers WHERE name = '$name'" 
              ^ ^

"UPDATE goalscorers SET goals=$newgoals WHERE name=$name " 

"UPDATE goalscorers SET goals=$newgoals WHERE name = '$name'" 
                ^ ^

在一個側面說明:學習和使用prepared statements。你的代碼很容易被sql注入。


UPDATE1:您可以用大幅簡化INSERT ... ON DUPLICATE KEY UPDATE代碼。爲了使其正常工作,您必須在name列上具有唯一(主鍵)索引。 然後insert語句應該看起來像

INSERT INTO goalscorers (`name`, `team`, `num`, `goals`) 
VALUES (?, ?, ?, ?) 
ON DUPLICATE KEY UPDATE goals = goals + VALUES(goals) 

這裏是SQLFiddle演示


UPDATE2:現在用INSERT ... ON DUPLICATE KEY UPDATE和事先準備好的聲明你的代碼可以是這樣的

$name = $_POST['name']; 
$team = $_POST['team']; 
$num = $_POST['number']; 
$goals = $_POST['goals']; 

/* connect to the database*/ 
$db = new mysqli('localhost', 'user', 'userpwd', 'test'); 
/* check connection */ 
if ($db->connect_errno) { 
    die('Connection failed: ' .$db->connect_error); 
} 

$sql = 'INSERT INTO goalscorers (`name`, `team`, `num`, `goals`) 
     VALUES (?, ?, ?, ?) 
     ON DUPLICATE KEY UPDATE goals = goals + VALUES(goals)'; 
/* create a prepared statement */ 
if ($stmt = $db->prepare($sql)) { 
    /* bind parameters for markers */ 
    $stmt->bind_param("ssii", $name, $team, $num, $goals); 
    /* execute query */ 
    if ($stmt->execute()) { 
     echo '<h1>Thank you for submitting your details! <br /> <a href="goalscorers.php">Add another</a></h1>'; 
    } else { 
     die('Insert failed: ' .$db->error);  
    } 
    /* close statement */ 
    $stmt->close(); 
} else { 
    die('Statement prepare failed: ' .$db->error);  
} 
+0

變化需要比這更廣泛一點。 –

+0

這對我有用。謝謝! – blubex

+0

@blubex不客氣:)請看看更新後的答案,並考慮切換使用準備好的語句。 – peterm

相關問題