Използвайки подготвено изявление за PDO и контейнер за конкретна година, не мога да повторя никакви резултати

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

Имам таблица, наречена „хора“ с полета, наречени name и dob (DATETIME), които имат данни като:

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

Първо предоставям година в PHP променлива, например:

$theyear=2016;

След това, използвайки този пример, се опитвам да изтегля всички имена за хора с dob през 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
Прави или не, няма опит. Добрият отговор винаги ще има обяснение какво е направено и защо е направено по такъв начин, не само за ОП, но и за бъдещите посетители на SO. - person Jay Blanchard; 19.07.2017
comment
Този начин проработи, но ще трябва да прочета за емулацията, за да реша дали това трябва да бъде зададено или не, благодаря - person user3304303; 19.07.2017