Возможно ли подставить в строку запроса к mysql переменное значение
Есть сессия $_SESSION['usercity'] = $user['city']; условно пусть значение этого будет msq
Можно ли как-нибудь это значение подставить в такую строку
$sql1 = "SELECT * FROM drivers ORDER BY shortname";
чтобы в запросе к таблице drivers приписывался этот хвост $_SESSION['usercity'] = $user['city']; и, условно, получалось driversmsq
Ответы (2 шт):
Да, возможно.
В SQL за подстановку условия с переменным значением отвечает предложение WHERE. То есть запрос с постоянным значением будет выглядеть, как
SELECT * FROM drivers WHERE city='msk' ORDER BY shortname
Для того, чтобы в РНР выполнить условие с переменным значением, используются подготовленные запросы. Для этого надо выполнить три действия:
- В SQL, в тех местах, где нужно подставить переменные значения, нужно поставить знаки вопроса
- Подготовить запрос с помощью метода prepare()
- Выполнить запрос с помощью метода execute(), передав в него в виде массива сами значения, в том же порядке, в котором в запросе идут знаки вопроса
В итоге получается такой аккуратный код
$stmt = $db->prepare("SELECT * FROM drivers WHERE city=? ORDER BY shortname");
$stmt->execute([$_SESSION['usercity']]);
И дальше в зависимости от драйвера. Если PDO, то сразу получить данные обычным порядком:
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
Если mysqli, то вызвать get_result() и дальше обычным порядком:
$result = $stmt->get_result();
$data = $result->fetch_all(MYSQLI_ASSOC);
Немного непонятно, вам из которой переменной надо брать ваш 'msq' из $_SESSION['usercity'] или из $user['city']?
Ну, предположим, из первого. Тогда всё просто:
$sql1 = "SELECT * FROM drivers{$_SESSION['usercity']} ORDER BY shortname";
Вот и всё. Только стоит помнить, если вы получаете эти данные из интернета непроверенные - это очень опасно, возможны sql-инъекции. Их стоит валидировать.
Если суффиксы таблиц всегда только из букв и '_', то например так:
$suffix=preg_replace('/[^a-z_]/','',$_SESSION['usercity']);
$sql1 = "SELECT * FROM drivers$suffix ORDER BY shortname";