PHP SQL Match как значение из массива
Поэтому я использую PHP и SQL (PDO) для написания запроса, который будет принимать значения из массива флажков (names[]), чтобы, например, кто-то мог передать значения "Боб", "Джон" и "Билл", и я хочу сопоставить те, с колонкой в базе данных.
Проблема: База данных - это импорт из электронной таблицы Excel, использовавшийся годами, и для столбца, с которым я сопоставляю, нет заданного формата, некоторые примеры значений, хранящихся в базе данных, могут выглядеть следующим образом:
"Bill & Bob"
Bill
John and Bill
"Bill"
John, Bill, and Bob
John will perform the task
Как видите, мне нужно использовать Like %value%
чтобы сопоставить значения, потому что запрос отправит только Билл, Джон и Боб. Моя проблема в том, как мне сделать это с переданным массивом, потому что это может быть просто Джон или это может быть 2 или все 3, но вы не можете использовать что-то вроде WHERE column LIKE in(array)
правильный? Будет ли лучше всего выполнить запрос один раз для каждого имени и добавить результаты в один массив? Я знаю, что мог бы сделать какое-то динамическое утверждение, что-то вроде:
WHERE column LIKE '%Bob%' OR
column LIKE '%John%' OR
column LIKE '%Bill%';
Моя проблема заключается в том, что вышеуказанный метод подвержен SQL-инъекции, если ввод не удовлетворен правильно? Даже если я использую bindValue() и превращаю каждую из них в привязываемую переменную, мне нужно выяснить, сколько существует привязок, и я чувствую, что если мне придется добавлять имена в будущем, это будет сложнее, чем должно быть. Это лучший способ сделать то, что я сказал выше об одном запросе, выполненном несколько раз, по одному разу для каждого имени и затем добавить результаты вместе?
Заранее спасибо.
РЕДАКТИРОВАТЬ: Драйвер PDO, двигатель MSSQL
2 ответа
Вы можете сделать это так.
//Prepare an array with names
$names = [
':name_1' => '%Bob%',
':name_2' => '%Bill%',
];
//build the where
$whereQuery = '';
foreach($names as $bind => $value) {
if(empty($whereQuery)) $whereQuery .= ' OR ';
$whereQuery .= ' column LIKE '.$bind;
}
//here is missing the code with SQL and pdo preparing query
//after preparing query just execute with $names
$sth->execute($names);
Будьте осторожны, в этом примере представлен только код, помогающий вам найти решение.
Надеюсь это поможет
Вы должны определенно нормализовать вашу базу данных.
Но просто быстрый подход, и так как php был упомянут, вы можете сгенерировать запрос как
$names = ['John','Bob','Bill'];
$query = 'SELECT * FROM my_weird_table WHERE ';
$first = true;
foreach ($names as $name) {
if ($first) {
$query .= '`column` LIKE "%'.$name.'%" ';
$first = false;
} else {
$query .= 'OR `column` LIKE "%'.$name'.'%" ';
}
}