เกิดอะไรขึ้นเมื่อ Fetch Array ออกมาได้ แต่.. Count นับเป็น 0
ใช้ class db ตัวไหนครับ?
คำสั่งนับน่าจะทำงานผิดมั้งนะ ถ้าค่า fetchall ออกมาเป็นแบบนี้ใช้ count() ธรรมดาตรง fetchall ก็ได้นะครับ
Date :
2014-08-31 20:39:26
By :
mr.v
PDOStatement::rowCount() ไม่ได้บอกจำนวนของแถวจากการ SELECT ครับ
แต่เป็นจำนวนของแถวที่ "affected" ด้วย DELETE, INSERT หรือ UPDATE ครับ
PDOStatement::rowCount() จะบอกว่า UPDATE ไปกี่แถว หรือ DELETE ไปกี่แถว
ถ้าต้องการจำนวนแถวที่ SELECT ได้ แบบง่ายๆ ก็ fetchAll() มาก่อนแล้วใช้ count()
Code (PHP)
$data = $sth->fetchAll();
echo count($data);
แต่มันเป็นวิธีที่ไม่ค่อยดีหากข้อมูลที่ SELECT ได้มีจำนวนแถวเยอะ จะเปลือง RAM มาก
ทางที่ดีควรทำการ SELECT COUNT(*) ก่อน แล้วอ่านค่าที่ได้มา
แต่จากโค้ดของคุณ ดูเหมือนจะเป็นการตรวจว่ามีผู้ใช้อยู่หรือไม่
ซึ่งปกติจะมีแค่แถวเดียวที่ตรงเงื่อนไข ดังนั้นไม่จำเป็นต้อง count() ก็ได้ครับ
แค่ SELECT แล้ว fetch() ออกมา ถ้ามันไม่ใช่ null หรือ false ก็หมายความว่า SELECT เจอ
Code (PHP)
$query = "SELECT * FROM Users WHERE
Login = :login And Password = :password ";
$sth = $this->database->prepare($query);
$sth->execute(array(
':login' => $_POST['login']
,':password' => md5($_POST['password'])
));
$user = $sth->fetch();
if ($user) {
// User found
} else {
// User not found or wrong password
}
Date :
2014-09-01 08:45:19
By :
FRINGE
ถ่าแปลเป็น php ต้องเขียน code อย่างไรครับ
Date :
2022-06-16 09:37:41
By :
โต้ง
Code (SQL)
-- phpMyAdmin SQL Dump
-- version 5.1.3
-- https://www.phpmyadmin.net/
--
-- Host: localhost
-- Generation Time: Jun 16, 2022 at 06:45 PM
-- Server version: 10.6.7-MariaDB
-- PHP Version: 8.1.6
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
START TRANSACTION;
SET time_zone = "+00:00";
--
-- Database: `test_generic-tests`
--
-- --------------------------------------------------------
--
-- Table structure for table `dummy_people`
--
CREATE TABLE `dummy_people` (
`id` int(11) NOT NULL,
`name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`address` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`test_double` double(20,9) NOT NULL,
`add` date DEFAULT NULL,
`update` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
-- Dumping data for table `dummy_people`
--
INSERT INTO `dummy_people` (`id`, `name`, `address`, `test_double`, `add`, `update`) VALUES
(1, 'Madyson Cummerata', '332 Jast Knoll\nEast Carolanne, WA 70869-1568', 12.458100000, '1981-03-06', '2020-12-30'),
(2, 'Mrs. Kathlyn Olson', '', 0.000000000, '2000-12-16', '2005-09-06'),
(3, 'Freeda Hodkiewicz', '23132 Kovacek Alley Apt. 060\nHowellfort, NJ 47945', 0.000000000, '1996-02-12', '2006-01-07'),
(4, 'Shanny Weissnat', '63976 Huels Inlet\nSouth Noemiehaven, CA 60696-8648', 0.000000000, '2009-10-01', '2017-06-10'),
(5, 'Demarcus Huels', '627 Reynolds Plain\nNorth Nicoport, MD 72711-7777', 0.000000000, '1977-11-04', '1998-10-18');
--
-- Indexes for dumped tables
--
--
-- Indexes for table `dummy_people`
--
ALTER TABLE `dummy_people`
ADD PRIMARY KEY (`id`);
--
-- AUTO_INCREMENT for dumped tables
--
--
-- AUTO_INCREMENT for table `dummy_people`
--
ALTER TABLE `dummy_people`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=122;
COMMIT;
Code (PHP)
$dsn = 'mysql:dbname=test_generic-tests;host=127.0.0.1';
$user = 'user';
$password = 'pass';
$options = [
\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_OBJ
];
$dbh = new PDO($dsn, $user, $password);
$sql = 'SELECT `id` FROM `dummy_people` WHERE `id` = :id';
$Sth = $dbh->prepare($sql);
//$Sth->bindValue(':id', 2, \PDO::PARAM_INT);
$Sth->execute([':id' => 2]);
$result = $Sth->fetchAll();
$count = $Sth->rowCount();
var_dump($result);
echo '<br>';
var_dump($count);
$Sth->closeCursor();
unset($Sth, $dbh);
Quote: array (size=1)
0 =>
array (size=2)
'id' => int 2
0 => int 2
int 1
https://www.php.net/manual/en/pdostatement.rowcount.php
Quote: returns the number of rows affected by the last DELETE, INSERT, or UPDATE statement executed by the corresponding PDOStatement object.
If the last SQL statement executed by the associated PDOStatement was a SELECT statement, some databases may return the number of rows returned by that statement. However, this behaviour is not guaranteed for all databases and should not be relied on for portable applications.
หมายความว่า rowCount() จะแสดงจำนวนในฐานข้อมูลที่ query ได้ ผ่านคำสั่ง SELECT เฉพาะฐานข้อมูลบางประเภทเท่านั้น เช่น จากที่ทดลองก็มี MySQL ตัวเดียว. นอกนั้นใช้ไม่ได้
ประวัติการแก้ไข 2022-06-16 18:20:38
Date :
2022-06-16 18:19:56
By :
mr.v
Load balance : Server 00