MySQL переменные типа bind_param почему бы не следовать правилам - PullRequest
0 голосов
/ 25 апреля 2018

Я использую следующий запрос с bind_param:

$qry=" UPDATE `prog_m` SET prog_descr=? WHERE prog_id=? ";
$stmt= $conn->prepare($qry);
$stmt->bind_param('si', $content_text, $prog_id);

В коде prog_id очевидно целое число, если я связываю обе переменные в виде строки, т.е.

bind_param('ss', $content_text, $prog_id);

все еще код работает. Может кто-нибудь объяснить, пожалуйста, как?

1 Ответ

0 голосов
/ 25 апреля 2018

MySQL неявно выполняет преобразования типов данных.

В качестве демонстрации рассмотрим:

SELECT 4       + 1
     , ' 4'    + 1
     , '4tune' + 1

Мы также можем явно преобразовывать типы данных, например, используя CAST или CONVERT.

Преобразование из строки в число является простым. Поведение задокументировано в Справочном руководстве MySQL:

https://dev.mysql.com/doc/refman/5.7/en/type-conversion.html


Мы можем наблюдать это поведение в конкретном примере. Рассмотрим случай числового литерала:

UPDATE `prog_m` SET prog_descr = 'foo' WHERE prog_id = 42 ;

и сравнение со строковым литералом

UPDATE `prog_m` SET prog_descr = 'bar' WHERE prog_id = '42' ;
                                                       ^  ^

Если столбец prog_id является числовым, MySQL выполняет неявное преобразование строкового литерала в числовой.

Если prog_id является символьным типом, в первом случае MySQL неявно преобразует числовой литерал в строку.

Если prog_id является столбцом символьного типа, в первом случае MySQL неявно преобразует значения столбца в числовые значения и сравнивает их с числовым литералом.


Также, спасибо за использование подготовленных операторов с заполнителями связывания!

...