用于检查所有 databse 条目的 PHP 脚本只读取一行然后停止


PHP Script to check all databse entries only reads one row then stops

我正在尝试制作一个自动脚本,该脚本将每天检查一次帐户是否有"今天"的到期日,如果是,则添加其当前贷款的利率,但由于某种原因,我的脚本在扫描第一个条目后停止并且不会遍历数据库中的所有条目。

谁能告诉我我错过了什么或做错了什么?提前谢谢你!(或建议是否有更好的方法来完全做到这一点)

<?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'";
    }
}

你能提供有关数据库中的内容的信息吗?

目前,如果datedue被计算为 null 或任何无效的内容,则以下代码将导致函数返回值 FALSE(阻止处理更多行)。

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

你可能想要类似的东西

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

因为这只会跳过循环迭代的其余部分,并开始下一次迭代,这将处理下一个数据库行。

我设法解决了我的问题。这是一个粗略的解决方案,但我在计算数据库中的条目数量后做了一个 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());
}
?>