Как получить счетчик или количество строк в результирующем наборе в 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 ответа:
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.