2016-03-05 48 views
0

我想做一個自動化的腳本,每天檢查一次,如果一個帳戶有他們的到期日期「今天」,如果是這樣,在他們的利率加上目前的貸款,但由於某種原因,我的腳本一旦掃描了第一個條目並且沒有通過數據庫中的所有條目就會停止。PHP腳本檢查所有databse條目只讀取一行然後停止

任何人都可以告訴我我失蹤或做錯了什麼嗎?先謝謝你! (或建議是否有更好的方法來完全做到這一點)

<?php 
require('include/dbconfig.php'); 

$host  = "redacted"; 
$user  = "redacted"; 
$password = "redacted"; 
$datbase = "lending"; 
$tbl_name = "users"; 
mysql_connect($host, $user, $password); 
mysql_select_db($datbase); 

$sql_query = "SELECT user_id, datedue, locurrentamt, interestrate, first_name FROM $tbl_name"; 
$result_set = mysql_query($sql_query); 
while ($row = mysql_fetch_row($result_set)) { 
    $user_id = $row['0']; 
    $first_name = $row['4']; 
    // FOR EACH DATABASE ENTRY CHECK THE DUE DATE 
    date_default_timezone_set('Australia/Perth'); 
    $datetoday  = date("Y/m/d"); 
    $dateduefromdb = $row['1']; 
    // RETURN FALSE IF THE DATES ARE BOGUS 
    if (!$a = strtotime($datetoday)) 
     return FALSE; 
    if (!$z = strtotime($dateduefromdb)) 
     return FALSE; 
    // MAN PAGE http://php.net/manual/en/function.gregoriantojd.php 
    $a_jd   = GregorianToJD(date('m', $a), date('d', $a), date('Y', $a)); 
    $z_jd   = GregorianToJD(date('m', $z), date('d', $z), date('Y', $z)); 
    $countdowndate = $z_jd - $a_jd; 

    if ($countdowndate == 0 && $countdowndate >= 0) { 

     $dueamt   = $row['2']; 
     $dueinterest = $row['3']; 
     $interestcharge = $dueamt * $dueinterest; 
     $finalinterest = $interestcharge + $dueamt; 
     $first_name  = $row['4']; 

     $sql_query = "UPDATE users SET locurrentamt='$finalinterest' WHERE id='$user_id'"; 
    } 
} 
+0

你有一定的誤差?並且請不要使用mysql_ * –

+0

沒有錯誤,腳本運行正常,但它只返回一行,並停止出於某種原因。 我會在同一時間看看mysqli謝謝! – Judes

+0

可能導致循環(腳本)提早結束的一個明顯問題是「日期檢查」。例如:'if(!$ a = strtotime($ datetoday))...'。這些應該至少生成日誌錯誤或拋出異常?請不要抓住例外。如果還沒有將'error_reporting'設置爲E_ALL將會很有用。 –

回答

0

你能提供什麼是數據庫中的信息?

當前,如果datedue被評估爲null或任何無效,則以下代碼將導致函數返回值FALSE(阻止處理其他行)。

if (!$z = strtotime($dateduefromdb)) 
     return FALSE; 

您可能要像

if (!$z = strtotime($dateduefromdb)) 
     continue; 

由於這將簡單地跳過循環迭代的其餘部分,並開始下一次迭代,這將處理下一個數據庫行。

+0

你好!要回答你的問題,datedue變量是一個日期字段。謝謝你的提示!我將它添加到代碼中 – Judes

0

我設法弄清楚我的問題。這是一個粗略的解決方案,但是在計算數據庫中的條目數量之後,我做了for循環。如果任何人有興趣,這是完成的腳本供您參考。祝你有美好的一天!

<?php 
require('include/dbconfig.php'); 

$result2 = mysql_query("SELECT * FROM users"); 
$num_rows = mysql_num_rows($result2); 
$numrowsadjust = ++$num_rows; 

for ($x = $num_rows; $x <= $numrowsadjust; $x++){ 
$sql_query="SELECT * FROM $tbl_name WHERE user_id='$x' LIMIT 1"; 
$result_set=mysql_query($sql_query); 
while($row=mysql_fetch_row($result_set)) 
    { 
    //$user_id=$row['0']; 
    //$first_name = $row['1']; Display stuff for debugging 
    date_default_timezone_set('Australia/Perth'); 
    $alpha=date("Y/m/d"); 
    $omega=$row['20']; 
    // RETURN FALSE IF THE DATES ARE BOGUS 
     if (!$a = strtotime($alpha)) continue; 
     if (!$z = strtotime($omega)) continue; 
    // MAN PAGE http://php.net/manual/en/function.gregoriantojd.php 
     $a_jd = GregorianToJD(date('m', $a), date('d', $a), date('Y', $a)); 
     $z_jd = GregorianToJD(date('m', $z), date('d', $z), date('Y', $z)); 
    $countdowndate = $z_jd - $a_jd; 

     if ($countdowndate == 0 && $countdowndate >= 0){ 

     $dueamt = $row['76']; 
     $dueinterest = $row['82']; 
     $interestactual = ($dueinterest/100); 
     $interestcharge = $dueamt * $interestactual; 
     $finalinterest = $interestcharge + $dueamt; 
     $first_name = $row['1']; 

     $addthis = "UPDATE users SET locurrentamt='$finalinterest' WHERE user_id='$x'"; 
     mysql_query($addthis); 
     } 
    } 
    die(mysql_error()); 
} 
?> 
相關問題