Допустим, у меня есть запрос MySQL, который создается в зависимости от определенных условий: пример
$query = "SELECT * from `usertable` where users_active=:users_active";
if($mode=="archived") {
$query .= " AND archived=:archived";
}
$stmt = $dbpdo->prepare($query);
$stmt->bindParam(':users_active', $users_active);
$stmt->bindParam(':archived', $archived);
$stmt->execute();
Теперь, если я выполню вышеприведенное, он будет работать только в том случае, если $ mode == «archived», иначе именованный заполнитель «: archived» не будет частью запроса.
Это имеет смысл для меня в одном отношении, но напрашивается вопрос о том, как с этим справиться элегантно. У меня есть много запросов в моем приложении, которые построены условно. Я мог бы сделать это, но это кажется мне дублированием:
if($mode=="archived") {
$stmt->bindParam(':archived', $archived);
}
Это кажется запутанным, особенно если есть много условий для построения запроса. Есть ли у кого-нибудь более четкое представление о том, как это сделать, не добавляя много условных тестов.
Любые мысли будут оценены.
С уважением
Джеймс
Вы можете использовать массив со значениями и отправить его в качестве параметра execute()
метод.
Если приведение типа переменных, которые bindParam()
предложения не так важны (вы даже не используете их …), это значительно упрощает построение запросов, поскольку вы можете заполнить массив при построении строки запроса.
Для вашего примера:
$query = "SELECT * from `usertable` where users_active=:users_active";
$params = array(':users_active' => $users_active);
if($mode=="archived") {
$query .= " AND archived=:archived";
$params[':archived'] = $archived;
}
$stmt = $dbpdo->prepare($query);
$stmt->execute($params);
Других решений пока нет …