Я переписываю приложение так, чтобы оно могло использовать запросы MYSQLI или PDO, управляемые переменной $ connection_type, которая содержит либо «mysqli», либо «pdo» в качестве флага, относительно которого используется.
В существующем коде есть много запросов, которые требуют количества строк данного запроса. Получение фактического количества строк, возвращаемых запросом, было подвергнуто сомнению и ответам по-разному в других местах Stackoverflow, но я думаю, что я наткнулся на железный метод, который будет работать с MYSQLI или PDO, а затем будет работать, когда Объект result является результатом запросов с вариациями в любой из этих форм (обратите внимание на третий пример; я разработал функцию для работы независимо от того, используется ли COUNT () в запросе):
select count(*) from table
select count(distinct column) from table
select column1, column2, column3 from table
Для MYSQLI мое решение основано на fetch_field_direct (), которая, очевидно, установлена и надежна. Однако для PDO мое решение опирается на соответствующую функцию getColumnMeta (), которая помечена таким образом в документации по PHP.NET:
Предупреждение
Эта функция является ЭКСПЕРИМЕНТАЛЬНОЙ. Поведение этой функции, ее название,
и окружающая документация может измениться без предварительного уведомления в будущем выпуске
PHP. Эту функцию следует использовать на свой страх и риск.
Итак, у меня есть два вопроса:
1) Может ли кто-нибудь увидеть то, что я упустил из виду в этом методе?
2) Кто-нибудь знает, присутствует ли getColumnMeta () (a) в готовящемся PHP 7 и затем (b), был ли он завершен и что он возвращает и какими операторами? Если имя функции будет таким же, и если она вернет столбец «name», как показано ниже, то мой код, который работает нормально на PHP 5.6.12, должен работать на PHP 7, когда он вышел.
Итак, вот текущее состояние моей функции, которая отлично работает для перечисленных выше типов запросов как для MYSQLI, так и для PDO (но я что-то упустил?):
function returnRowcount($result_object, $connection_type){
if ($connection_type == 'mysqli') {
$name_field = strtoupper($result_object->fetch_field_direct(0)->name);
if (substr($name_field, 0, 6) == "COUNT(") {
$row = $result_object->fetch_row();
return $row[0];
} else {
return mysqli_num_rows($result_object);
}
} elseif ($connection_type == 'pdo') {
// WARNING: THE PHP DOCUMENTATION STATES THAT getColumnMeta MAY CHANGE IN FUTURE:
$name_field = strtoupper($result_object->getColumnMeta(0)["name"]);
if (substr($name_field, 0, 6) == "COUNT(") {
return $result_object->fetchColumn();
} else {
return $result_object->rowcount();
}
}
}
В существующем коде есть много запросов, которые требуют количества строк данного запроса.
Вот что на самом деле неправильно в вашем приложении и должны быть исправлены вместо этого.
В каждом месте, где используется возвращенное количество строк, оно используется не специально, сказать, как могут быть возвращены строки, но только сказать, была ли вообще найдена какая-либо строка. Что делает такой вызов чрезвычайно лишним, так как у вас есть сами данные чтобы сказать, если какие-либо данные были возвращены.
Что касается конкретной функции в OP, функция, которая возвращает что-либо, кроме 1 из запроса count (*), не имеет абсолютно никакого смысла. Такие неоднозначные функции ужасно опасны и всегда приводят к печальным последствиям. НЕ запутывайте свой собственный код.
function returnRowcount($result_object, $connection_type){
if ($connection_type == 'mysqli') {
return mysqli_num_rows($result_object);
} elseif ($connection_type == 'pdo') {
return $result_object->rowcount();
}
}
это единственная форма, которая должна существовать.
Обратите внимание, что в этом нет ничего плохого rowCount()
метод. Не будь легкой добычей старых суеверий.
Тем не менее, как я уже отмечал ранее, такая функция крайне редко используется в веб-разработке. Вы либо выбираете данные (который вы можете рассчитывать в PHP) или подсчитывать (который вы просто должны получить), но не оба.
Других решений пока нет …