Выравнивание элемента объединения

Так как это 2015, и устарела функциональность mysql_*, это только PDO визуализация.

';
    try {
        $theCategory="fruit";   // value from user, hard-coded here to get one in

        $dbh = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $username, $password);
        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        // prepared statement with named placeholders
        $stmt = $dbh->prepare("select id,foodName from foods where category=:theCat and perishable=1");
        $stmt->bindParam(':theCat', $theCategory, PDO::PARAM_STR,20);
        $stmt->execute();
        echo "rowCount() returns: ".$stmt->rowCount().$b;   // See comments below from the Manual, varies from driver to driver

        $stmt = $dbh->prepare("select count(*) as theCount from foods where category=:theCat and perishable=1");
        $stmt->bindParam(':theCat', $theCategory, PDO::PARAM_STR,20);
        $stmt->execute();
        $row=$stmt->fetch();    // fetches just one row, which is all we expect
        echo "count(*) returns: ".$row['theCount'].$b;

        $stmt = null;
        // PDO closes connection at end of script
    } catch (PDOException $e) {
        echo 'PDO Exception: ' . $e->getMessage();
        exit();
    }
?>

Схема для тестирования

create table foods
(   id int auto_increment primary key,
    foodName varchar(100) not null,
    category varchar(20) not null,
    perishable int not null
);
insert foods (foodName,category,perishable) values 
('kiwi','fruit',1),('ground hamburger','meat',1),
('canned pears','fruit',0),('concord grapes','fruit',1);

Для моей реализации я получаю вывод 2 для обоих echos выше. Цель вышеупомянутых 2 стратегий состоит в том, чтобы определить, использует ли реализация вашего драйвера rowCount, и если нет, искать запасную стратегию.

Из руководства по PDOStatement :: rowCount :

PDOStatement :: rowCount () возвращает количество строк, затронутых оператором DELETE, INSERT или UPDATE.

For most databases, PDOStatement :: rowCount () не возвращает количество строк, затронутых оператором SELECT. Вместо этого используйте PDO :: query (), чтобы выдать инструкцию SELECT COUNT (*) с теми же предикатами, что и предполагаемый оператор SELECT, а затем используйте PDOStatement :: fetchColumn (), чтобы получить количество строк, которые будут возвращены. Ваше приложение может затем выполнить правильное действие.

20
задан timrau 14 August 2012 в 23:49
поделиться

1 ответ

Начало каждого элемента выровнено с адресом самого объединения.

поэтому отдельные сравнения в выражении, о котором вы спрашиваете, верны, но выражение в целом ложно, если только объединение расположено по адресу 0x0001.

Удаленный текст применяется к следующим сравнениям :

&u.l == &u.i == &u.s == &u.c[0]

В исправленной версии сравниваются различные типы указателей - указатели должны быть преобразованы в недействительные указатели.


Меня попросили процитируйте стандарт - или укажите раздел стандарта.

C99 - раздел 6.7.2.1 Спецификаторы структуры и объединения (параграф 14):

Указатель на объект объединения, преобразованный соответствующим образом, указывает на каждый из его членов ( или, если член является битовым полем, то в единицу, в которой он находится), и наоборот.

27
ответ дан 30 November 2019 в 00:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: