【问题标题】:How to use cron, PHP and MySQL code to delete records with multiple search terms如何使用 cron、PHP 和 MySQL 代码删除具有多个搜索词的记录
【发布时间】:2012-11-26 07:08:00
【问题描述】:

我陷入了困境,需要像你这样的聪明人的帮助。

这里有一些关于我使用的软件和技术的信息:cPanel、Linux 服务器、phpMyAdmin、MySQL。

我需要每天从表中删除一些记录。我通常在 phpMyAdmin 上使用 Select 语句,然后删除所有记录。

*

Select `user_id` FROM `user`
WHERE EXISTS ( SELECT `user_id`
FROM `userinfo`
WHERE `essay` like '% yahoo %' AND user.user_id = userinfo.user_id)

*

上面的代码基本上是在 userinfo 表中搜索特定的单词,并在 user 表中显示它们对应的 user_id,然后我手动将其删除。在这种特殊情况下,搜索词是“yahoo”。我搜索所有在其个人资料的essay中包含“yahoo”一词的用户,并将其从用户表中删除。

问题是我有太多的搜索字词无法手动完成。

如果可能的话,我希望将它写在 php 文件中并通过 cron 运行。最好在 php 文件中有一个或多个字段,我可以在其中键入所有可能的搜索词/短语,然后代码将一个接一个地执行所有这些。

我听说可以为此使用 cron 作业,阅读了一些关于它们的文章,但完全不知道如何处理它。

非常感谢您的帮助,如果不清楚,请告诉我。 问候, 伊戈尔

【问题讨论】:

    标签: php mysql cron records


    【解决方案1】:

    您最好的选择是首先创建一个 PHP 脚本,该脚本将连接到 MySQL 并执行您想要的操作。之后,您可以查看 Cron 以及它们是如何工作的。本质上,它将以指定的节奏为您启动脚本。 cPanel 有一个特殊部分,可让您安排 Cron。

    【讨论】:

      【解决方案2】:

      将 select user_id from user 更改为 delete from user 并保持语句的其余部分完全相同。

      在执行此操作之前,请务必备份您的用户表。

      一旦您验证了 SQL 的功能是否符合您的要求,您需要编写一个小型 PHP 脚本,将该 SQL 发送到 MySQL,并让 cron 每天运行一次该脚本。

      【讨论】:

        【解决方案3】:

        这至少应该让你开始。请记住,我不知道您的数据库的结构,因此您可能需要更改一些内容。这也是 FAR 不是最有效的方法,但它很容易遵循,您可以在单个 MySQL 查询中执行此操作,而不是循环遍历每个用户 ID(我显示了一个 untested 示例 ---faster way---),但我不知道你的数据库结构,所以你必须使用它,而且这种方式完全符合你现在所做的,一次一个,所以希望它更容易理解,你可以修改它以提高效率。在玩这个之前备份你的数据库。

        PHP 脚本做你想做的事:

        <?php
        //put your search terms in this array
        $search_terms = array('yahoo', 'google', 'bing');
        
        //conenct to your DB
        $db_conn = mysql_connect('yourdbhost', 'yourdbuser', 'yourdbpassword');
        mysql_select_db('yourdbname', $db_conn);
        
        //query the db for each search term
        foreach($search_terms as $search_term) {
            //----slow but clear way----    
            $result = mysql_query("SELECT user_id 
                                FROM user
                                WHERE EXISTS (
                                    SELECT user_id
                                    FROM userinfo
                                    WHERE essay like '%{$search_term}%' 
                                    AND user.user_id = userinfo.user_id)", $db_conn);
        
            //for eachr user id returned, delete them from your users table 
            //as you would have done manually. I don't know about your users
            //table so you will have to edit this query as you see fit.
            while($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
                $user_del_result = mysql_query("DELETE FROM user 
                                                WHERE user_id = {$row['user_id']}
                                                LIMIT 1", $db_conn);
                //might want to check here to see if the query executed successfully
            }
        
            //----faster way----
            $result = mysql_query("DELETE FROM user
                                    WHERE EXISTS (
                                    SELECT user_id
                                    FROM userinfo
                                    WHERE essay like '%{$search_term}%' 
                                    AND user.user_id = userinfo.user_id)", $db_conn);
        }
        ?>
        

        要定期调用它,您需要查看 cron 作业 (read this),然后只需在 crontab 中使用类似这样的内容定期调用 PHP 脚本(例如,每天午夜运行一次):

        0 0 * * *   /path/to/php-cli /path/to/the/above/php/file.php
        

        【讨论】:

        • 顺便说一句,您应该为新代码使用 mysqli 库而不是 mysql_* 库调用,这是低效且不安全的 :)
        • 感谢 shannonman。抱歉我的无知,与 mysql_ 相比,我在哪里可以获得有关 mysqli 库的更多信息?您的帮助将不胜感激。顺便说一句,您应该将 mysqli 库用于新代码而不是 mysql_ 库调用,这是低效且不安全的 :)
        • 嗨 shannonman,我正在尝试将您的脚本用于我的 cron 工作,但一点运气都没有。问题可能出在脚本的实际路径上,即 (* * * * * /usr/local/bin/php -q /home/gofishda/public_html/_cron/-cron-user-userinfo.php) 我设置了它每分钟运行一次只是为了测试,但它没有运行,甚至没有电子邮件通知,我已经设置它在脚本运行时通知我。我不太确定如何创建正确的路径。我提供的那个是我从其他 cron 任务中复制的。如果您知道任何事情或可以向我指出一些教程,我将不胜感激。干杯
        【解决方案4】:

        出于您使用脚本的目的,我认为您甚至不需要使用 PHP。如果我不得不做这样的事情,我可能会做以下事情:

        创建一个MySQL脚本script.sql如下:

        USE `database_name`;
        
        DELETE A.* FROM `userinfo` A
        INNER JOIN `user` B
        ON A.user_id = B.user_id
        AND (
            A.essay LIKE '% yahoo %'
            OR
            A.essay LIKE '% google %'
            OR
            A.essay LIKE '% microsoft %'
        );
        

        然后我会按如下方式设置一个 cron 作业:

        • 打开外壳并输入crontab -e 以编辑您的cron 文件。这应该会打开一个vi 编辑器实例(您应该知道如何使用vi)。
        • 将每日计划条目添加到您的 cron 文件 0 2 * * * mysql -u{user} -p{password} {db_name} &lt; {path of script.sql}。这将每天在2:00am 运行您的脚本。
        • 保存文件并退出

        当您需要修改或添加搜索词时,只需根据您的需要修改并使用A.essay LIKE '% microsoft %' 行。

        【讨论】:

          【解决方案5】:

          Deep s**t 从来都不是一个好去处......

          如果您打算使用 PHP 脚本,那么您可以使用 crontab 执行此操作。也许,在最基本的情况下,最好的办法是编写一个可以使用 cron 执行的 PHP 脚本:

          <?php
          
            $DB_hostname = "localhost";
            $DB_name     = "someDB";
            $DB_username = "someUser";
            $DB_password = "guessmeifyoucan";
          
            $connection = mysql_connect($DB_hostname, $DB_username, $DB_password) or die(mysql_error());
            mysql_select_db($DB_name, $connection) or die(mysql_error());
          
            $delete_query = "DELETE from `user`
                             WHERE EXISTS ( SELECT `user_id` FROM `userinfo`
                             WHERE `essay` like '%yahoo%' AND user.user_id = userinfo.user_id)";
          
            $result = mysql_query($delete_query) or die(mysql_error());
          
          ?>
          

          为了保持理智,我建议将任何删除记录到文件中或在数据库中使用活/死标志。通配符字符串匹配是危险的,您最好使用 DB 标志(活/死或 '0'/'1') - 除非不需要复出。

          然后您可以使用 crontab 设置和执行它。 cPanel 提供了运行 cron 脚本的能力,但您也可以使用 CLI/shell 实现同样的功能:

          1.crontab -e(使用您选择的编辑器)
          2. 设置0 6 * * * php /path/to/script.php(每天早上6:00)

          在 crontab 中使用以下格式(假设您使用的是某种 linux):

          Minutes [0-59]
          |   Hours [0-23]
          |   |   Days [1-31]
          |   |   |   Months [1-12]
          |   |   |   |   Days of the Week [Numeric, 0-6]
          |   |   |   |   |
          *   *   *   *   * php /path/to/script.php
          

          还有其他命令、选项和输出,但这是最基本的实现。您可以找到更详细的 cron 用法here。

          如果需要,您也可以使用 query.sql 文件执行此操作,并在 CLI 上使用 MySQL 执行它。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-11-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-06-16
            • 1970-01-01
            • 2017-04-12
            相关资源
            最近更新 更多