Как получить счетчик или количество строк в результирующем наборе в PHP с помощью соединения ODBC?


Пока я строю веб-страницу в своем веб-приложении PHP, мое соединение работает нормально, но когда я хочу получить количество строк оператора SELECT, которое я использовал в своем запросе, оно дает мне -1 !! хотя мой результирующий набор имеет около 10 строк.

Я хотел бы получить фактическое число строк результирующего набора. Я искал руководство по PHP и документацию, но не нашел прямого способа, такого как функция Count или что-то в этом роде.

Интересно, должен ли я сделать оператор Count (*) SQL в другом запросе и прикрепить его к моему соединению, чтобы получить количество строк ?

Знает ли кто-нибудь простой и прямой способ получить это ?

Функция odbc_num_rows всегда дает результат -1, поэтому я не могу получить фактическое число строк.

Мой язык программирования-PHP, мой движок баз данных-Sybase, а способ подключения к базе данных-ODBC.

Вот вам код, который я использовал: -

<?PHP

//PHP Code to connect to a certain database using ODBC and getting information from it

//Determining The Database Connection Parameters
$database = 'DatabaseName';
$username = 'UserName';
$password = 'Password';

//Opening the Connection
$conn = odbc_connect($database,$username,$password);

//Checking The Connection
if (!$conn)
{
exit("Connection Failed: " . $conn);
}

//Preparing The Query
$sql = "SELECT * FROM Table1 WHERE Field1='$v_Field1'";

//Executing The Query
$rs = odbc_exec($conn,$sql);

//Checking The Result Set
if (!$rs)
{
exit("Error in SQL");
}

echo "<p align='Center'><h1>The Results</h1></p>";

while ( odbc_fetch_row($rs) )

{
  $field1 = odbc_result($rs,1);
  $field2 = odbc_result($rs,2);
  $field3 = odbc_result($rs,3);
  echo "field1 : " . $field1 ;
  echo "field2 : " . $field2 ;
  echo "field3 : " . $field3 ;
}

$RowNumber = odbc_num_rows($rs);

echo "The Number of Selected Rows = " . $RowsNumber ; 

//Closing The Connection
odbc_close($conn);

?>

Спасибо за помощь :)

3 4

3 ответа:

odbc_num_rows похоже, что он надежен только для запросов INSERT, UPDATE и DELETE.

Руководство гласит:

Использование odbc_num_rows () для определения количества строк, доступных после выбора, вернет значение -1 со многими драйверами.

Один из способов обойти это поведение-сделать COUNT(*) в SQL вместо этого. Смотрите здесь для примера.

В php.net:

Простой способ подсчета строк в наборе результатов odbc, где драйвер возвращает значение -1, заключается в том, чтобы позволить SQL выполнить работу:

<?php

    $conn = odbc_connect("dsn", "", "");
    $rs = odbc_exec($conn, "SELECT Count(*) AS counter FROM tablename WHERE fieldname='" . $value . "'");
    $arr = odbc_fetch_array($rs);
    echo $arr['counter'];

?>

На каком основании вы ожидаете, что odbc_num_rows вернет что-либо, кроме -1 ?

Мы имеем факт из руководств, что OBDC не поддерживает @@ROWCOUNT / odbc_num_rows. Таким образом, нет никаких оснований ожидать, что он "должен" вернуть что-либо, кроме того, что задокументировано, -1 при любых обстоятельствах.

Даже если вы используете Sybase напрямую (а не через ODBC), у вас будет та же "проблема".

  • odbc_num_rows возвращает @@ROWCOUNT, то есть строки, вставленные/обновленные / удаленные немедленно предыдущая команда. -1 является правильным, задокументированным значением, если непосредственно предшествующая команда не insert/update/delete.

  • Это не имеет ничего общего с строки в таблице.

Используйте другой пакет и любой из документированных методов для получения строк в таблице и загрузки значения в переменную:

  • SELECT @Count = COUNT (*) -- медленно, требуется ввод / вывод
    или
  • SELECT @Count = ROW_COUNT(db_id, object_id) -- очень быстро, без ввода-вывода

Затем опросите результирующий массив, чтобы получить переменную, а не odbc_num_rows, которая будет продолжать возвращать значение -1.