【问题标题】:Send email alert when mySQL field equals a value当 mySQL 字段等于一个值时发送电子邮件警报
【发布时间】:2012-04-06 10:05:25
【问题描述】:

我有一个库存 mySQL 数据库。当“数量”等于或小于“最小”字段中的数字时,我需要向一些人发送一封电子邮件来提醒他们。

有谁知道如何创建脚本以在 "qty" 等于或小于 "min" 时发送电子邮件em>?这可以在服务器端完成吗?

埃里克

DATABASE NAME: _hero 

TABLE NAME:  CARTONS_CURRENT
+--------------+--------------+--------+--------+-------------------+---------+
| Column       |  Type        |  Null  |  Key   |  Default          |  Extra  |
+--------------+--------------+--------+--------+-------------------+---------+
| orig_time    | timestamp    |  No    |        | CURRENT_TIMESTAMP |         |
| type         | text         |  No    |        |                   |         |
| part_no      | varchar(20)  |  No    |  Prim  |                   |         |
| description  | varchar(75)  |  No    |        |                   |         |
| count        | varchar(2)   |  No    |        |                   |         |
| size         | varchar(30)  |  No    |        |                   |         |
| min          | int(7)       |  No    |        |                   |         |
| max          | int(7)       |  No    |        |                   |         |
| qty          | int(8)       |  No    |        |                   |         |
+--------------+--------------+--------+--------+-------------------+---------+

【问题讨论】:

  • 这对于表触发器来说似乎是一个完美的情况,否则您将不得不让脚本不断轮询库存水平。
  • @MikePurcell 我的第一个想法是“cron 工作!”我很想看看表触发器是如何工作的,我从未听说过它们。
  • 我认为服务器端会更容易。一旦库存水平大于“min”字段,我需要脚本自行重置以避免循环。
  • @Erik:但是确定库存水平需要脚本不断轮询您的表以获取当前值。可以编写一个表触发器,以便在违反阈值时调用 UDF(用户定义函数)来通知利益相关者。但是我们会看到 SO DB 向导中的一位是怎么说的……
  • mysql 没有本地电子邮件处理/发送设施。您可以轻松编写一个触发器来处理库存水平低于某个水平时的处理,但您必须为 mysql 编写一个 UDF 插件函数才能真正执行“外部”操作,例如电子邮件通知。

标签: php mysql email function


【解决方案1】:

我希望您的 MySQL/PHP 在 Linux 主机上...如果是这样,这是我的建议:

首先,创建一个用于检查数据库的 php 脚本,如果满足条件,则发送电子邮件。请记住,在我的方法中,该脚本必须可由服务器执行,因为我们稍后将创建一个 cronjob 来运行该脚本

将 /usr/bin/php 的值更改为 php 的路径(使用 whereis phpwhich php 来查找)

#!/usr/bin/php
<?php
//connect to database
$dbconnect=new mysqli('localhost','username','password','_hero');
$result=$dbconnect->query("SELECT `qty`,`min`,`part_no` FROM `CARTONS_CURRENT` WHERE `qty`<=`min`");
//if there are any records matching this query we send an email listing each one using 'part_no' as the identifier in this case
if($result->num_rows>=1) {
   $email='you@youremail.com';
   $subject = "PRODUCTS OUT OF STOCK";
   $message='One or more products are out of stock:\n\n';
   while($row=$result->fetch_assoc()) {
      $message.="{$row['part_no']}\n";
   }
   if(mail($email, $subject, $message)) {
      //mail successfully sent
   } else {
      //mail unsuccessful
   }
}
?>

保存/退出,并使文件可执行(chmod 700 或 777)

创建一个 cron 条目以每 5 分钟执行一次此脚本:

crontab -e

*/5   *   *   *   * /path/to/phpscript

如果您的 MySQL 不在 Linux 主机上和/或您没有设置可执行的 PHP,您仍然可以使用上述 PHP 脚本来完成这项工作,但您必须手动将浏览器指向脚本位置,或找出另一种执行该脚本的方法。

另外,请认真检查我的代码,因为我是在没有任何语法编辑器的情况下即时编写的。

【讨论】:

  • cron 对我来说是陌生的。不知道 cron 去哪里了。
  • 如果您以 root 身份输入 crontab -e,它应该会在编辑器中打开您的 cron 表。将我上面引用的内容附加到该文件的末尾,仅将 /path/to/phpscript 替换为脚本的实际路径。保存/退出文件,crond 现在将每 5 分钟执行一次该脚本。如果您没有 root 访问权限或没有 cron,如果您有 shell 访问权限,我还可以向您展示如何将其转换为守护进程。
  • 如果我有问题,我可以直接给你发电子邮件吗?我将在大约 2 小时后开始。
  • 如果必须的话! ;),出于垃圾邮件的原因,我不想在此网站上宣传我的电子邮件,我的电子邮件地址可以在这里找到:www.toscanagrill.ca/mymail.txt
  • 我正在使用 XAMPP,我应该使用这个:#!../xamppfiles/etc/php.ini 是否正确?
猜你喜欢
  • 1970-01-01
  • 2012-09-15
  • 1970-01-01
  • 2016-07-24
  • 2021-04-25
  • 1970-01-01
  • 2020-11-09
  • 2021-11-11
  • 1970-01-01
相关资源
最近更新 更多