Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > PDO и Token


Автор: ROM710 8.6.2019, 18:48
Здравствуйте форумчане. Всего три строчки, а где ошибка не могу понять. Если что то и меняю, сразу выдает другую ошибку. Если кто понимает подскажите пожалуйста.
Код

// удаляем токен из базы
$stmt  = $dbh->prepare("DELETE FROM pending_users WHERE name = ? AND token = ? AND tstamp = ?", $stmt->execute(array(
    $name,
    $token,
    $tstamp
)));
// 1 день в секундах = 60 секунд * 60 минут * 24 часа
$delta = 60;

// проверка
if ($_SERVER["REQUEST_TIME"] - $tstamp > $delta) {
    throw new Exception("время жизни токена истекло.");
}
// активируем пользовательский аккаунт
// ...


А выдает две ошибки - 1. Предупреждение: PDOStatement:: execute() [pdostatement.execute]: SQLSTATE[HY093]: недопустимый номер параметра: количество связанных переменных не соответствует количеству токенов

     2. Предупреждение: PDO:: prepare () ожидает, что параметр 2 будет массивом, логическим заданным в......





Автор: webproger 11.6.2019, 13:57
Попробуйте так
Код

$stmt = $dbh->prepare("DELETE FROM `pending_users` WHERE `name` = :name AND `token` = :token AND `tstamp` = :tstamp");
$stmt->execute(array(
    ':name' => $name,
    ':token' => $token,
    ':tstamp' => $tstamp
));

Автор: whatisnot 11.6.2019, 18:51
Цитата(webproger @  11.6.2019,  13:57 Найти цитируемый пост)
$stmt->execute(array(
    ':name' => $name,
    ':token' => $token,
    ':tstamp' => $tstamp
));


С чего вдруг не так?

$stmt->execute(array(
    'name' => $name,
    'token' => $token,
    'tstamp' => $tstamp
));

Именованная метка, это ключ переданного массива, превращать его в метку, это зачем? И ошибка не в том, что неименованные метки используются, а в синтаксисе. 

Автор: webproger 11.6.2019, 19:09
Цитата(whatisnot @ 11.6.2019,  18:51)
И ошибка не в том, что неименованные метки используются, а в синтаксисе. 

Ну, синтаксис я тоже исправил.
Сравните с тем, что было
Код

$stmt  = $dbh->prepare("DELETE FROM pending_users WHERE name = ? AND token = ? AND tstamp = ?", $stmt->execute(array(
    $name,
    $token,
    $tstamp
)));

Автор: whatisnot 12.6.2019, 06:09
Цитата(webproger @  11.6.2019,  19:09 Найти цитируемый пост)
Ну, синтаксис я тоже исправил.



Вы пишите отсебятину, а нужно https://www.php.net/manual/ru/pdo.prepare.php, внимательно.

Автор: webproger 12.6.2019, 13:42
Цитата

Вы пишите отсебятину, а нужно прочесть о функции, внимательно. 

Разве можно передавать метод PDOStatement::execute в $driver_options?
На сколько я знаю, это должен быть отдельный запрос, после подготовки PDO::prepare.

Или вы о том, что я названия параметров указал в массиве?
Ну так я просто так всегда делаю. Мне так удобней)

Автор: whatisnot 12.6.2019, 15:42
Цитата(webproger @  12.6.2019,  13:42 Найти цитируемый пост)
Разве можно передавать метод PDOStatement::execute в $driver_options?
На сколько я знаю, это должен быть отдельный запрос, после подготовки PDO::prepare.


Вы будете оспаривать то, о чем пишут разработчики? Вы воткнули одну функцию в другую, считая это порядком вещей, а как должно быть, и что может принимать эта функция, подвергаете сомнению.

Код

$stmt  = $dbh->prepare("DELETE FROM pending_users WHERE name = ? AND token = ? AND tstamp = ?"); //подготавливается запрос и возвращается объект 
//который теперь можно выполнить с передачей параметра- массива
$stmt->execute(array(
    $name,
    $token,
    $tstamp
));




Автор: whatisnot 14.6.2019, 04:39
webproger,  перепутал вас с автором. smile Это он косячит, это у него непорядки.

А у вас, нет ошибок, кроме лишнего, ведь метки для запроса, а не для массива. Разница в неименованных и именованных такая же как между индексным и ассоциативным массивом - для первых они должны идти в том же порядке как и объявлены в запросе, а для вторых они связаны по именам/ключам.  


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)