Mysqli PHP подготовленный оператор, когда в запросе используется переменная SQL - PullRequest
0 голосов
/ 17 января 2020

Я хотел превратить мой SQL запрос в готовое утверждение, но понял, что это было не так просто, как я думал вначале. Вот запрос в его текущей форме, а не как подготовленное утверждение.

$mysqli = new mysqli(...);

$result = mysqli_query( $mysqli,
"SELECT count(*) as total from test_users, image_uploads 
    WHERE test_users.APPROVAL = 'granted'
    AND test_users.NAME = image_uploads.OWNER
    AND (test_users.IMGAUTO = 'enabled' OR image_uploads.IAPPROVAL = 'granted')
");
$data = mysqli_fetch_assoc( $result );
$row_cnt = $data['total'];
$totalPages = ceil(($row_cnt / $cardmax));

Так что моя проблема сейчас заключается в следующем. Когда я сделаю подготовленное утверждение, я больше не смогу получить доступ к image_uploads.OWNER, поскольку в данный момент использую его внутри запроса.

$grant = 'granted';
$owner = ""; //<<--- how to get image_uploads.OWNER
$enabl = 'enabled';

$sql = 
"SELECT COUNT(*) FROM test_users, image_uploads
    WHERE test_users.APPROVAL=?
    AND test_users.NAME=?
    AND (test_users.IMGAUTO=? OR image_uploads.IAPPROVAL=?)
";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('ssss', $grant, $owner, $enabl, $grant);
$stmt->execute();
$row = $stmt->get_result()->fetch_row();
$row_cnt = $row[0];
$totalPages = ceil(($row_cnt / $cardmax));

Есть ли способ получить это image_uploads.OWNER в моем подготовленном заявлении. Как мне сделать это правильно?

1 Ответ

3 голосов
/ 17 января 2020

Похоже, image_uploads.OWNER - это столбец в таблице SQL в вашей базе данных. Если это так, то вы можете просто оставить все как есть в вашей первой версии. Вам не нужно параметризировать это.

Параметризация должна выполняться только для значений данных, поступающих извне ядра базы данных (например, пользовательский ввод или данные из файла), поскольку эти данные потенциально неизвестны и могут содержать вредоносные значения / атаки внедрения, которые необходимо очистить против. Цитирование имени столбца из другой таблицы не может представлять такой угрозы - вы не помещаете неизвестное строковое значение в синтаксис запроса.

NB На самом деле ни один из ваших исходных запросов не основывается на внешнем вводе или неизвестных переменных - все данных жестко запрограммированы в тексте запроса. Таким образом, вам не нужно вообще что-либо параметризировать в этом конкретном запросе. Все настроено заранее, поэтому нет опасности, что неожиданный / неизвестный текст станет частью исполняемого файла SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...