将PHP中的变量传递给查询数据库以进行删除

时间:2016-03-17 13:28:41

标签: php variables ldap joomla3.0

我正在尝试在php中创建一个cron作业,删除在csv文件中找到的已禁用用户,并将已删除的用户记录到txt文件中。除了只删除csv文件中的最后一个用户外,一切正常。以下是我到目前为止的情况:

class purgeInactive extends JApplicationCli
{
    public function doExecute()
    {
        $file     = '../tmp/purge_user.csv';
        $contents = file($file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
        $csvRows  = array_map('str_getcsv', $contents);
        $log      = ('../log/purged_users.txt');
        $today    = date('F j, Y, g:ia'); 
        $row      = 1;

        if (($handle = fopen("../tmp/purge_user.csv", "r")) !== FALSE) {
            while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
                $num = count($data);
                $row++;
                for ($c=0; $c < $num; $c++) {
                    file_put_contents($log, PHP_EOL . 'Removed Disabled User(s): ' . $data[$c] . PHP_EOL . '-' . $today . PHP_EOL, FILE_APPEND);

                    $disUsers = implode(',', $data);
                    echo ', ' . $disUsers ; // to test $disUsers output
                } // end for statement
            } // end while statment
        } // end if statement
        fclose($handle);

        $db        = JFactory::getDbo();
        $user      = JFactory::getUser();
        $query     = $db->getQuery(true);
        $userArray = var_export($disUsers,true);

        echo PHP_EOL.'This is to test the output of $userArray'.$userArray;

        $query
            ->select($db->quoteName(array('id')))
            ->from($db->quoteName('#__users'))
            //->delete ($db->quoteName('#__users'))
            //->where(array($db->quoteName('username') . ' IN(' . $userArray) . ')');
            ->where(array($db->quoteName('username') . ' = ' . $userArray));
            //->where($deleteReq);
            $db->setQuery($query);
            //$result = $db->execute();
            $result = $db->query();

        }
    }

    JApplicationCli::getInstance('purgeInactive')->execute();

有关如何单独在csv文件中运行每个用户的任何建议?因为我一直在研究这个问题,所以我脑子里已经死了。

注意:我正在运行使用ldap的Joomla,我使用echo $userArray来检查结果。

2 个答案:

答案 0 :(得分:0)

我认为不是......

->where(array($db->quoteName('username') . ' = ' . $userArray));

你只想要

->where(array($db->quoteName('username') . ' IN(' . $userArray) . ')');

假设您要删除用户名在$userArray的所有行。

如果$userArray中的值不一定是SQL安全的,您可能还想先这样做:

$userArray = array_map('mysql_real_escape_string', $userArray);

答案 1 :(得分:0)

csv的每一行都在迭代此行:$disUsers = implode(',', $data);

这意味着该行中的所有用户名都将保存到$disUsers,然后下一次迭代将用新行的用户名覆盖旧数据-这就是为什么只有最后一行数据将其删除的原因到您的删除查询。

$data[$c]应该这样被推入$disUsers数组中:$disUsers[] = $data[$c];

在查询中,您需要用引号将每个数组值包装起来;这将完成这项工作:

->where($db->qn('username') . ' IN (' . implode(',', array_map(function($username)use($db) {return $db->q($username);}, $disUsers)) . ')')

这是我的一个帖子,我在其中讨论如何使用INhttps://joomla.stackexchange.com/a/22898/12352

编写Joomla查询