Поэтому я использую 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
Вы можете сделать это так.
//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'.'%" ';
}
}