Возможно ли подставить в строку запроса к 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

Для того, чтобы в РНР выполнить условие с переменным значением, используются подготовленные запросы. Для этого надо выполнить три действия:

  1. В SQL, в тех местах, где нужно подставить переменные значения, нужно поставить знаки вопроса
  2. Подготовить запрос с помощью метода prepare()
  3. Выполнить запрос с помощью метода 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);
→ Ссылка
Автор решения: Solt

Немного непонятно, вам из которой переменной надо брать ваш '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";
→ Ссылка