У меня есть функция getRows(), которая может быть запущена в цикле foreach. Он дает мне все строки, возвращаемые из запроса MySQL. Имена хранятся как first.last
, и я получаю только первое имя. Проблема в том, что есть повторяющиеся имена, поэтому мне нужно что-то делать с ними, если они одинаковы (я думал о получении подстроки имени).
Учитывая мою функцию, как я могу проверить наличие обмана и выполнить другое действие?
Функция getRows()
public function getRows($query, $params = []) {
try {
$stmt = $this->db_data->prepare($query);
$stmt->execute($params);
return $stmt->fetchAll();
} catch (PDOException $e) {
throw new Exception($e->getMessage());
}
}
Предпросмотр
<?php
foreach($division_result = $db->getRows('SELECT * FROM users WHERE division=? ORDER BY username', ['AWM']) as $division) {
$username = $division['username'];
$short_list_name = substr($username, 0, strpos($username, '.'));
echo $short_list_name . '<br>';
}
?>
Результат
alicia
amy
angel
ashley
caitlin
cassie
cory
courtney
debbie
gabby
jamie
kamron
kelly
mallory
oliver
rhonda
tim <-- THIS ONE
tim <-- AND THIS ONE
tommy
travis
я могу бежать
mysql> SELECT SUBSTRING_INDEX(username, '.', 1) FROM users WHERE division='AWM' GROUP BY SUBSTRING_INDEX(username, '.', 1) HAVING count(*) > 1;
от терминала, который производит:
+-----------------------------------+
| SUBSTRING_INDEX(username, '.', 1) |
+-----------------------------------+
| tim |
+-----------------------------------+
1 row in set (0.00 sec)
Редактировать Но я не знаю, как я включил бы это в мой текущий foreach, так как мне нужны оба имени. Мне просто нужно их обнаружить и сделать что-то другое со струнами.
Вы можете сохранить список имен в массиве и проверить, существует ли в нем имя
$names = [];
foreach($division_result = $db->getRows('SELECT * FROM users WHERE division=? ORDER BY username', ['AWM']) as $division) {
$username = $division['username'];
$short_list_name = substr($username, 0, strpos($username, '.'));
if (in_array($short_list_name, $names)) {
// another action
} else {
$names[] = $short_list_name;
echo $short_list_name . '<br>';
}
}
?>
Другой вариант - добавить данные в свой запрос. Если вы используете светлую БД, вы можете переписать свой запрос так:
SELECT *
FROM users join
(SELECT username,COUNT(*) as dupes FROM users GROUP BY username) as foo using(username)
WHERE division=?
ORDER BY username
Довольно тяжелый и может не работать на всех БД. Но более прямо, после этого вам нужно проверить dupes
> 1.
array_unique
?DISCTINCT
?in_array
?DISTINCT
MySQL:SELECT SUBSTRING_INDEX(DISTINCT username, '.', 1)