【问题标题】:PHP execute the command "at" to run a SQL query problemsPHP执行命令“at”运行SQL查询问题
【发布时间】:2015-04-08 01:05:57
【问题描述】:

我有一个从 PayPal IPN 调用的 PHP 脚本。当用户从我的站点购买东西时,IPN PHP 脚本会在 mysql 数据库中创建用户。稍后,24 小时后,该用户需要从数据库中删除。我认为使用“at”命令会起作用。我相信我遇到的问题是关于我的命令中的括号。

<?php
$email = "buyer@gmail.com";
$cmd = 'mysql -u username -pPassword -e `DELETE FROM db.users WHERE users.email = "$email";`|at tomorrow';
exec($cmd);
?>

如果我按原样运行此页面,则会引发以下错误:

warning: commands will be executed using /bin/sh
sh: 1: DELETE: not found
mysql: option '-e' requires an argument
job 38 at Sun Feb  8 04:59:00 2015

这就是让我相信我的引号和括号有问题的原因。

【问题讨论】:

  • 为什么不使用mysqli函数集呢?这就是他们的目的
  • 因为我需要将它安排在以后运行。除非你知道 mysql 函数集中的一个方法可以完成那个..
  • 这就是 cron 作业的用途。在设定的时间运行,但运行纯 PHP 脚本来访问您的数据库

标签: php mysql paypal paypal-ipn


【解决方案1】:

您应该解释您遇到的问题。我要注意的第一件事是您使用单引号 - 那些不解释内部字符串,因此 $email 不会被替换为电子邮件值。

第二 - 你正在使用反引号。该命令在 bash shell 中执行,查询周围的反引号被解释为 shell 命令。尝试这个: $cmd = "echo mysql -u username -pPassword -e \\'DELETE FROM db.users WHERE users.email = \\\"$email\\\"\\' |at tomorrow";

【讨论】:

  • 至于使用at 进行调度,我不确定这是否可行;它取决于服务器配置(特别是如果您在不自己管理的系统上运行)。通常,此类任务可以通过将任务添加到队列并安排脚本运行(例如使用 crontab)来解决,该脚本将执行队列中的必要命令。
  • 这是我的个人服务器。我过去曾多次使用 AT,它对我来说效果很好。如果我有想法,我愿意接受 cron 工作......问题仍然存在于 $cmd 字符串中。我在整个命令周围有第一组括号,然后是 SQL 查询周围的另一组括号,然后是 $email 变量周围的第三组括号。这似乎效果不佳..
  • 做到了!谢谢你的解释!
  • 您不会碰巧知道为什么 sql 查询会立即执行而不是传递给 AT 命令吗?我检查了数据库,用户立即被删除。我检查了AT队列,里面什么都没有。
  • 你说得对,我忘记了。它将执行命令的第一部分,生成其输出并尝试将其传递给“at”。尝试回显第一部分 - $cmd = "echo mysql ..."
【解决方案2】:

试试这个:

"mysql -u username -pPassword -e `DELETE FROM db.users WHERE users.email = '$email'`|at tomorrow";

【讨论】:

    猜你喜欢
    • 2020-05-13
    • 1970-01-01
    • 2015-01-10
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    相关资源
    最近更新 更多