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

Недавно я узнал о важности подготовленных операторов, поэтому я приступаю к изменению всех моих существующих запросов mysqli на запросы PDO.

У меня есть таблица под названием «люди» с полями с именами name и dob (DATETIME), в которых есть такие данные, как:

name:  Johnny
dob:  2016-12-06 18:30:00

Сначала я указываю год в переменной PHP, например:

$theyear=2016;

Затем, используя этот пример, я пытаюсь получить все имена людей с доб в 2016 году и повторить их, как показано ниже, но это не отображает никаких результатов (а их много):

$stmt = $pdo->prepare("SELECT * FROM people WHERE `dob` BETWEEN ':theyear-01-01' AND ':theyear-12-31'");
$stmt->execute(['theyear' => $theyear]);
while ($row = $stmt->fetch()) {
    echo $row['name'] . "<br/>";
}

Будучи новичком в PDO, я уверен, что сделал что-то глупое/нелогичное.

Может ли кто-нибудь увидеть мою ошибку / помочь мне двигаться в правильном направлении?


person user3304303    schedule 19.07.2017    source источник
comment
stackoverflow.com/questions/11321491/ обман, технически   -  person Funk Forty Niner    schedule 19.07.2017
comment
и ваш запрос не имеет смысла, хотя. Вам нужно использовать разные имена, если эмуляция не установлена   -  person Funk Forty Niner    schedule 19.07.2017
comment
вам нужно установить значения ваших переменных до запроса, а затем передать их в запросе после, это в двух словах. На самом деле довольно много способов сделать это.   -  person Funk Forty Niner    schedule 19.07.2017
comment
php.net/manual/en/pdo.error-handling.php - вы вообще не проверяете на ошибки. То, что вы написали, вас бы что-то подбросило.   -  person Funk Forty Niner    schedule 19.07.2017


Ответы (2)


Если вы собираетесь объединять, делайте это в массиве, а не в запросе, и используйте отдельные заполнители для каждой переменной:

$stmt = $pdo->prepare("SELECT * FROM people WHERE `dob` BETWEEN :theyearbegin AND :theyearend");
$stmt->execute([':theyearbegin' => $theyear.'-01-01', ':theyearend' => $theyear.'-12-31']);

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

person Jay Blanchard    schedule 19.07.2017
comment
Способ CONCAT, упомянутый @MVG1984, работал, но похоже, что я не должен делать этого в самом запросе, поэтому я хочу, чтобы ваш способ работал, но по какой-то причине это не так. Никаких ошибок, просто эхо ничего. Может быть, у меня была опечатка или что-то в этом роде, но я скопировал это прямо отсюда, поэтому немного озадачен. Я продолжу играть, спасибо! - person user3304303; 19.07.2017
comment
Нашел. У вас не было дефиса перед 12-31. Добавил и теперь работает, еще раз спасибо за ваши знания! - person user3304303; 19.07.2017
comment
Быстрое продолжение, если вы позволите мне... Я вижу, у вас есть двоеточия в ключах. Я читал, что они не нужны. Считаете ли вы, что их ДОЛЖНО использовать по определенной причине? - person user3304303; 19.07.2017
comment
Спасибо @user3304303! Я смотрел на него и просто не видел. Рад, что помог! - person Jay Blanchard; 19.07.2017
comment
Я просто держу двоеточия для проверки работоспособности, они не нужны. - person Jay Blanchard; 19.07.2017

Попробуйте изменить

':theyear-01-01'

To

CONCAT(:theyear, '-01-01')

И если эмуляция не установлена, вам нужны две разные переменные, :theyear1 и :theyear2 например.

person MVG1984    schedule 19.07.2017
comment
Делать или не делать, нет попытки. Хороший ответ всегда будет содержать объяснение того, что было сделано и почему это было сделано таким образом, не только для OP, но и для будущих посетителей SO. - person Jay Blanchard; 19.07.2017
comment
Этот способ сработал, но мне придется прочитать об эмуляции, чтобы решить, следует ли ее устанавливать или нет, спасибо. - person user3304303; 19.07.2017