Использование s для int в bind_param - PullRequest
1 голос
/ 30 января 2020

Давайте возьмем этот запрос mysqli:

$query = "SELECT * FROM table WHERE (".$id_type."=?)";

$id_type жестко запрограммирован и может быть "userID" (int(11) в таблице mysql) или "sessionID" (char(36) в таблице mysql).

Могу ли я просто связать параметры следующим образом?

$stmt->bind_param('s', $id);

Есть ли снижение производительности или что-то еще, что я должен учитывать при использовании s в bind_param, хотя $id может быть int? Если нет, то зачем мне вообще в будущем использовать правильные буквы (i, s, d, ...)?

Ответы [ 2 ]

2 голосов
/ 30 января 2020

Да, вы можете.

Крайние случаи редки, и, скорее всего, вам никогда не понадобится указывать тип c.

Этот трюк, предложенный в другом ответе, будет работать в данном конкретном случае. Но для приложения в целом, когда вы занимаетесь автоматизацией, установка определенных типов будет проблематична ниже уровня спины.

Миллионы вопросов о переполнении стека, о таких странных случаях, о которых вы никогда не мечтали Ни один из них о случаях использования, когда вы использовали s, и это вызвало какие-либо проблемы.

В вашем старом коде mysql_query вы использовали '$id' все время без единой проблемы.

PDO использует этот подход с s все время. Также нет отчетов.

Таким образом, вы можете выполнять некоторые трюки, если вы sh, но на практике они не нужны.

0 голосов
/ 30 января 2020

Всегда хорошо быть максимально точным, чтобы уменьшить риск побочных эффектов / проблем.

В вашем случае это должно быть довольно легко сделать.

Пример 1

$type = $id_type == 'userID' ? 'i' : 's';
$stmt->bind_param($type, $id);

Это будет хорошо работать, если у вас есть только два варианта.

Если у вас есть больше, будет работать следующий метод.

Пример 2

$types = [
    'userID'    => 'i',
    'sessionID' => 's',
];

$stmt->bind_param($types[$id_type], $id);

Затем вы можете продолжить добавление в массив $types, если вам нужно больше столбцов.

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