В моей таблице есть столбец corder, это int(3).

Используя PDO, я запускаю следующее:

$maxCorder = "SELECT MAX(`corder`) FROM cats WHERE `user` = :uid AND `cparent` = :cp"; 
            $database->query($maxCorder);
            $database->bind(':uid', $_SESSION['userid']);
            $database->bind(':cp', $catID);
            $maxCorderResult = $database->single();

И обнаружил, что если я выведу $maxCorderResult, это верное максимальное значение столбца. Я хочу добавить 1 к нему, поэтому преобразовать его в int:

$maxCorderResult = (int)$database->single();

И найдите, что $maxCorderResult теперь int равен 1. То же самое относится к (float). Я не уверен, где я иду не так. Исследование этого, кажется, только обнаруживает несвязанную проблему, где число слишком велико, чтобы быть преобразованным в целое число и приводит к непредсказуемым результатам. Для этого теста у меня есть только 4 строки с corder 0,1,2 и 3. Я вручную изменил их на различные целые числа, и получаются те же результаты.

Я использую пользовательский класс PDO, как подробно здесь.. Метод single() вызывает следующую функцию в классе:

public function single(){
    $this->execute();
    return $this->stmt->fetch(PDO::FETCH_ASSOC);
}

Обновление:

Как подсказали некоторые, я по глупости упустил из виду существенное знакомство с тем, что на самом деле возвращал PDO класс, который я использовал. Это был array, а не int или string, который всегда будет плохо работать при попытке привести его к int напрямую.

Надеюсь, я усвоил урок не с помощью отвлекающих факторов, таких как получение желаемого результата вплоть до момента конверсии (все еще не понимаю, как я это сделал), и для тройной проверки того, что возвращается в документах.

-1
biscuitstack 25 Апр 2017 в 02:12

2 ответа

Лучший ответ

Прямо из руководства:

PDOStatement::fetch - извлекает следующую строку из набора результатов

  • fetch_style

    Управляет тем, как следующая строка будет возвращена вызывающей стороне. Это значение должна быть одной из констант PDO :: FETCH_ *, по умолчанию она имеет значение PDO :: ATTR_DEFAULT_FETCH_MODE (по умолчанию PDO :: FETCH_BOTH).

    PDO::FETCH_ASSOC: возвращает массив , проиндексированный по имени столбца как вернулся в ваш набор результатов

  • Возвращаемые значения

    Возвращаемое значение этой функции в случае успеха зависит от выборки. тип. Во всех случаях FALSE возвращается при ошибке.

Нет смысла приводить массив к int.

3
Álvaro González 25 Апр 2017 в 08:12

Я действительно не понимаю, зачем кому-то использовать такой самодельный суррогат, если с ванильным PDO это можно сделать намного проще:

$sql = "SELECT MAX(`corder`) FROM cats WHERE `user` = ? AND `cparent` = ?"; 
$stmt = $pdo->prepare($sql);
$stmt->execute([$_SESSION['userid'], $catID]);
$maxCorderResult = $stmt->fetchColumn();
1
Your Common Sense 25 Апр 2017 в 08:11
43599083