2017-01-26 3 views
0

Я ищу способ использования поля в базе данных в качестве запроса. Это то, что у меня есть:Поле базы данных для MySQL Query

Колонка Название: banemail

Содержимое этого поля обновляется с помощью страницы настроек форума. В нем хранятся адреса электронной почты, которые я хочу запретить при регистрации. Мне нужен запрос, который удалит всех пользователей, которые уже зарегистрированы, и использует запрещенное электронное письмо. Я хочу получить содержимое из таблицы, а затем использовать его самостоятельно.

запрос до сих пор:

$datastoreemails = $vbulletin->db->query_read("SELECT data FROM ".TABLE_PREFIX."datastore WHERE title = 'banemail'"); 

while($content = $vbulletin->db->fetch_array($datastoreemails)) 
    { 
echo $content['data']."<br />"; 
    } 

Этот выход:

.cc .co hotmail

Как я могу затем превратить этот вывод в запрос, чтобы удалить кого-либо в базе данных, которая имеет адрес электронной почты, с указанной вышесказанное?

Это работает, когда я запускаю его вручную, но у меня есть 20-30 запрещенных адресов электронной почты, и я хотел бы сделать все это в 1 запросе, если это возможно.

DELETE FROM TABLE_PREFIX_user WHERE email LIKE '%.com%'; 

ТИА

+0

Являются ли '.cc',' .co' и 'hotmail' считаемыми тремя отдельными токенами, для которых необходимо удалить записи электронной почты? –

+0

Прости, да. Запрещенные электронные письма вводятся на странице настроек, разделенных пробелом. Я бы ввел электронные письма следующим образом: hotmail.com hotmail.co.uk gmail.com – John

ответ

0

Я никогда использование d vbulletin, поэтому вам может понадобиться отрегулировать ниже. Я не знал, что таблица пользователей была для примеров, поэтому я просто ввел «пользователей».



    $datastoreemails = $vbulletin->db->query_read("SELECT data FROM ".TABLE_PREFIX."datastore WHERE title = 'banemail'"); 

    //Create an array of banned emails. 
    $bannedEmails = []; 
    while($content = $vbulletin->db->fetch_array($datastoreemails)) 
    { 
     //Explode your data by a space to return an array of items you are looking for 
     $bannedEmails = array_merge($bannedEmails, explode(" ", $content['data'])); 
    } 

    //check if there is anything in the banned Emails, if so build your "delete" query 
    if(is_array($bannedEmails) && count($bannedEmails) > 0) : 

     $deleteQuery = "DELETE FROM ".TABLE_PREFIX."users WHERE"; 

     $deleteWhere = ""; 
     //Loop through the array adding each email stub in to the query 
     foreach($bannedEmails as $email): 

      //If this is the second time through the loop add the AND clause 
      if($deleteWhere != "") $deleteWhere .= "OR "; 

      //Add in where email like %hotmail.com% to match anything that looks like it. 
      $deleteWhere .= " email like '%" .$email . "%' "; 
     endforeach; 

     //Add the where on the end of the query 
     $deleteQuery .= $deleteWhere; 

     //Now all you need to do is execute the delete, I'm just going to print it out so you can check the 
     //sql first! 
     echo $deleteQuery; 
    endif; 

Из вашего кода видно, что есть одно текстовое поле, в котором будут храниться запрещенные адреса электронной почты в вашей базе данных. Если это так, тогда вы можете использовать «query_first», как этот $ vbulletin-> db-> query_first ($ query), поскольку он просто вытащит одну строку, и вам не придется перебирать результаты. Я написал код выше, если есть несколько строк с запрещенными электронными сообщениями, которые должны работать, даже если есть только один.

+0

Спасибо. Да, вы правы, контент хранится всего в 1 текстовом поле. Я дам вам знать, как я с этим справляюсь. – John

+0

Эхо выделяет именно то, что я хочу, но запрос не вызывается sql. Я даже попробовал это прямо в phpmyadmin, и это то, что я получил. '0 затронутых строк. (Запрос занял 0,0015 секунды.) УДАЛИТЬ ОТ tf_user ГДЕ электронная почта, как «% i.com%» И электронная почта, как «% hello%» ' – John

+0

Извините, измените AND для OR. Очевидно, что он не работает, поскольку нет строк, соответствующих HELLO и i.com .... В производстве убедитесь, что вы используете «@ i.com», иначе bini.com и benni.com или что-то, что заканчивается на i.com, будет быть согласованным. То же самое с использованием слов, оно будет соответствовать любому электронному письму с этими частями в нем. –

0

можно использовать reult отборных сюда удалить непосредственно

если у вас есть

SELECT data FROM ".TABLE_PREFIX."datastore WHERE title = 'banemail'" 

тогда вы могли бы

("DELETE 
    FROM " .TABLE_PREFIX ."user 
    WHERE email in ( SELECT data 
     FROM " .TABLE_PREFIX."datastore 
     WHERE title = 'banemail'"); 
+0

Когда я запускаю это через плагин, я получаю сообщение об ошибке: Ошибка анализа: синтаксическая ошибка, неожиданный «SELECT» (T_STRING) в /global.php(29): eval() 'd код в строке 3 – John

+0

показать мне точное сообщение об ошибке .. и если вы можете обновить свой вопрос, добавив точный, который вы используете .. прокомментируйте меня, когда сделали – scaisEdge

+0

'Ошибка базы данных в vBulletin 4.2.3: Invalid SQL: DELETE FROM tf_user WHERE электронной почты в (SELECT данные FROM tf_datastore WHERE название = 'banemail'; MySQL Ошибка: У Вас есть ошибка в вашем синтаксисе SQL, проверьте руководство, которое соответствует версия сервера MariaDB для правильного синтаксиса для использования рядом с '' по строке 5 Номер ошибки: 1064 Дата запроса: четверг, 26 января 2017 года, 04:13:28 PM Дата ошибки: четверг, 26 января 2017 года @ 04:13 : 28 PM Имя класса: vB_Database MySQL Версия: 5.5.52-MariaDB' – John

Смежные вопросы