我正在尝试在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
来检查结果。
答案 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)) . ')')
这是我的一个帖子,我在其中讨论如何使用IN
:https://joomla.stackexchange.com/a/22898/12352