2012-08-27 81 views
2

我想創建一個cron作業,它將從事務表中選擇點的總和。基於其他表的PHP更新表數據

根據積分和員工ID我必須更新總積分表。 我想確保我使用的是最好的方法,這將工作。

<?php 

    $conn = mysql_connect("localhost", "mysql_user", "mysql_password"); 

    if (!$conn) { 
     echo "Unable to connect to DB: " . mysql_error(); 
     exit; 
    } 

    if (!mysql_select_db("mydbname")) { 
     echo "Unable to select mydbname: " . mysql_error(); 
     exit; 
    } 

    $sql = "SELECT ID, SUM(POINTS) as Points, FROM Transactions WHERE Status = 1 Group By ID"; 

    $result = mysql_query($sql); 

    if (!$result) { 
     echo "Could not successfully run query ($sql) from DB: " . mysql_error(); 
     exit; 
    } 

    if (mysql_num_rows($result) == 0) { 
     echo "No rows found, nothing to print so am exiting"; 
     exit; 
    } 


    while ($row = mysql_fetch_assoc($result)) { 

    mysql_query("UPDATE Totals SET Points=" + $row["Points"] + "WHERE ID=" + $row["id"]); 

    } 


    mysql_free_result($result); 

    ?> 
+0

我很好奇爲什麼你不會在桌子上爲這種事情做一個觸發器。這些表不在同一個數據庫中嗎? – Nikki9696

+1

你可能會傷害熊貓。 [請閱讀這篇文章](http://www.deprecatedphp.com/mysql_) – Kermit

+0

哇我是傷害大熊貓 –

回答

3

,您仍然可以在UPDATE語句連接表(和子查詢)。試試這個,

UPDATE Totals a 
     INNER JOIN 
     (
      SELECT ID, SUM(POINTS) as Points, 
      FROM Transactions 
      WHERE Status = 1 
      Group By ID 
     ) b 
     ON a.ID = b.ID 
SET a.Points = b.Points 

希望這會有所幫助。

使用示例PDO Extension (Code Snippet)

<?php 

$query = "UPDATE Totals a 
      INNER JOIN 
      (
       SELECT ID, SUM(POINTS) as Points, 
       FROM Transactions 
       WHERE Status = ? 
       Group By ID 
      ) b 
      ON a.ID = b.ID 
    SET a.Points = b.Points"; 

$iStatus = 1; 
$stmt = $dbh->prepare($query); 
$stmt->bindParam(1, $iStatus); 

$stmt->execute(); 

?> 

PDO Manual
PDO PreparedStatement

+0

謝謝約翰,這有助於! –

+0

嘿,還有一件事,使用PHP時使用PDO或MySQLI擴展。 'mysql_ *'已經摺舊了。 –

+0

你是否有機會知道我將如何實施PDO –

0

爲什麼你不能只是測試腳本搞出來,你通過一個cron作業運行之前?我無法發現任何語法錯誤的地方;但是再一次,我只是快速瀏覽一下,我不知道你的表格結構是什麼樣的。

如果你正在尋找最好的方式來做事情,那麼你應該考慮使用mysqli或PDO而不是mysql函數。這樣,您可以使用準備好的語句,如果您計劃在循環中運行多個查詢,那麼這些語句不會像DBMS那樣徵稅。準備好的語句不要求你獨立往返服務器,而舊的mysql函數可以。

+0

多數民衆贊成多麼我想弄清楚如何我會做同樣的事情,我做了一個更好的方法,如使用PDO –