Прежде всего, я знаю, что это не так, как должно быть. Но система была настроена таким образом, поэтому я должен попытаться работать с ней.
У меня есть столбец записей в таблице MySQL, которые выглядят так: {12} — {32} и так далее. 12 — идентификатор марки автомобиля, 32 — модель.
Теперь я должен создать запрос в PHP, часть которого выглядит так:
(PD1.fieldValue = '{". $_SESSION['carId'] ."}-{". $_SESSION['carModelId'] ."}'
Угадайте, что, это не работает с фигурными скобками конечно. Часть SESSION полностью пуста (да, у них есть значение вне запроса).
Есть ли способ исправить это, чтобы я все еще мог отправлять переменные внутри фигурных скобок в mySQL?
Всякий раз, когда у вас возникают проблемы с вводом некоторых символов в базу данных, это сильный намек на то, что код вашей базы данных небезопасен и уязвим для внедрения SQL. Вы должны сделать шаг назад и посмотреть немного шире, думая: «Что такое все из возможных символов, которые не экранированы должным образом? «К счастью, вы не должны знать, на самом деле. Вам просто нужно использовать встроенные функции escape.
Идеальным решением является использование заполнителей. Синтаксис зависит от того, какой API базы данных вы используете (mysqli или PDO; устаревший mysql их не поддерживает). Существует много отличных ресурсов о том, как использовать заполнители; это первый результат, который я вытащил из Google, и это выглядит мне правильно.
Несколько менее идеальным решением является использование real_escape_string
функция для вашей базы данных API. Пример для любого mysqli
или же mysql
:
// Using heredoc syntax, you can clean up your queries like so.
$sql_template = <<<SQL
SELECT
PC.id AS cId,
P.id AS pId
FROM PAGE_CATALOG P
LEFT JOIN PAGE_CATALOG_CONFIG PC ON (PC.id = P.cId)
WHERE PD1.fieldValue = '%s'
AND P.productCode REGEXP '%s'
AND PC.id = '1'
AND P.enabled = '1'
GROUP BY P.id
ORDER BY P.productVolgorde ASC
LIMIT 0, 10
SQL;
// For mysqli:
// $mysqli = new mysqli(...)
$sql = sprintf(
$sql_template,
$mysqli->real_escape_string('{' . $_SESSION['carId'] . '}-{' . $_SESSION['carModelId'] . '}'),
$mysqli->real_escape_string($MAL_TYPE)
);
$result = $mysqli->query($sql);
// For mysql:
$sql = sprintf(
$sql_template,
mysql_real_escape_string('{' . $_SESSION['carId'] . '}-{' . $_SESSION['carModelId'] . '}'),
mysql_real_escape_string($MAL_TYPE)
);
$result = mysql_query($sql);
Других решений пока нет …