Допустим, я хочу выбрать записи, где Id = 30
, Подготовленные операторы допускают два способа привязки параметров:
вопросительные знаки
$id = 30;
$q = $conn->prepare("SELECT * FROM pdo_db WHERE id > ?");
$q->execute(array($id)); // Here above ID will be passed
именованные параметры
$sth = $conn->prepare("SELECT `id`, `title` FROM `pdo_db` WHERE `id` > :id");
$sth->execute(array(
':id' => 30
));
Оба работают нормально и дают точные результаты, но я не могу получить точные различия между этими двумя, ни когда я должен использовать тот или иной?
Параметры вопросительного знака называются позиционный параметры.
Параметры, определенные с :
и имя называются названный параметры.
Правило состоит в том, что вы не можете смешать два в своем подготовленном утверждении.
Позиционные параметры работают простым способом — если у вас есть два позиционных параметра, вы можете указать массив с двумя элементами. Значения массива будут связаны в порядке их появления в массиве.
Именованные параметры немного сложнее, они не должны быть связаны, чтобы они появились. Вы также можете повторить один именованный параметр несколько раз в операторе, но вы можете связать его только один раз, чтобы передать значение — эта последняя часть работает, когда PDO настроен на эмуляцию через $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, TRUE);
,
Кажется, что это скорее вопрос, основанный на предпочтениях, поскольку нет строгого правильного или неправильного ответа.
Лично я избегаю ?
так как он тесно связан с порядком параметров. Хотя теоретически вы не сможете испортить это, добавив или удалив привязку одной привязки, просто кажется, что это вызывает проблемы. Это (немного) меньше работы, хотя.
:name
является более кратким и тесно связано с идентификацией привязок, а не произвольно с порядком. Это требует (крошечной) немного больше работы, но ее гораздо легче отлаживать, и она менее подвержена ошибкам.
Я предпочитаю быть (немного) сжатым, чем писать (немного) меньше кода.
Это разные заполнители
? -- > question mark placeholders
:name --> named Placeholders
Разница между named and question mark placeholders
это с вопросительным знаком заполнителей вам нужно позаботиться о порядке, в котором они будут связаны с запросом.