mysql pdo rowcount_PDOStatement::rowCount

用户评论:

[#1]

@rhavendc (twitter) [2015-11-23 08:10:56]

We're having problem with these PDOStatement::fetchColumn() and PDOStatement::rowCount(). I don't know if we have alike case to others or this is just a problem in our coding. In local, the rowCount() is not giving the correct number of rows but it is working fine when uploaded to our hosting site.. while the fetchColumn() is the reverse. The fetchColumn() is working fine in local but not anymore when uploaded. I don't know what is really going on with that but I think rowCount() is the best and the others are optional to use.

[#2]

info at buylikesandviews dot com [2015-03-21 09:04:13]

every good work

If you use "INSERT INTO ... ON DUPLICATE KEY UPDATE" syntax, mysql_affected_rows() will return you 2 if the UPDATE was made (just as it does with the "REPLACE INTO" syntax) and 1 if the INSERT was.

So if you use one SQL request to insert several rows at a time, and some are inserted, some are just updated, you won't get the real count.

[#3]

phpnet at maya-control dot ro [2014-04-10 11:09:20]

Yet another workaround to return the row count inside only ONE select (see limitations below!):

$sth = $dbh->prepare("SELECT *,count(*) AS howmany FROM users WHERE email=:email and password=:pass"); #var placeholders

$sth->execute(array(':email'=>$email, ':pass'=>$pass)); #var binding

$row = $sth->fetch(); #get one row (it'll always be one and only one!!!)

if ($row['howmany'] == 1){ #we have a match and only one! cool!

echo $row['email'], $row['name'], $row['phone'], ... ;

} elseif ($row['howmany']>1) { #more than one row returned

#one programmer should be fired 'cause he's not checking for

#for existing emails, before creating a new user

...

# treat this exception somehow or simply skip this branch,

# if you're sure it won't happen in your table

} else { #no match in the table ($row['howmany'] == 0)

echo "Email/pass didn't match the ones in the database!";

}

Advantages:

- only one select statement is executed, no two steps needed!

- it checks if one row exists in the table or not, according to the WHERE clause.

- it returns all (or only a selection of) fields for that one row, if exists.

Disadvantages:

- it doesn't return row fields reliable if more than one row found. If more than one row responds to the SELECT query, the query returns still only one row and you don't know which one exactly .

Maybe using a SORT BY, would make it a bit more predictible (as in: "if more than one users found, return the last user added in the table") but it's more a matter of good design of the program that fills in the table initially.

Uses:

- It is perfect for checking if a user/pass pair is present in a users table and to return the other fields of the user (like name, phone, whatever) if user was found.

[#4]

sERGE-01 [2013-11-04 12:15:19]

In some drivers rowCount() only works when using the prepare() with PDO::CURSOR_SCROLL

So, you can modify PDO class:

functionquery($query,$values=null)

{

if($query=="")

returnfalse;

if($sth=$this->prepare($query, array(PDO::ATTR_CURSOR=>PDO::CURSOR_SCROLL)))

{$res= ($values) ?$sth->execute($values) :$sth->execute();

if(!$res)

returnfalse;

}

return$sth;

}

}?>

Now let's test (i using php 5.2.9-2):

{$pdh= newPDO($dsn,$db_user,$db_pass);$sth=$pdh->query("SELECT * FROM sys.tables");

print"rowCount() Standart: ".$sth->rowCount()."
";$pdh= newmyPDO($dsn,$db_user,$db_pass);$sth=$pdh->query("SELECT * FROM sys.tables");

print"rowCount() New: ".$sth->rowCount()."
";$pdh=null;

}$db_server="xxx";$db_name="xxx";$db_user="xxx";$db_pass="xxx";

print"PDO_MSSQL"."
";TestRowCount("mssql:host=$db_server;dbname=$db_name",$db_user,$db_pass);

print"MSSQL throw PDO_ODBC"."
";TestRowCount("odbc:DRIVER={SQL Server};SERVER=$db_server;DATABASE=$db_name;",$db_user,$db_pass);

print"MS SQL driver 2.0"."
";TestRowCount("sqlsrv:server=$db_server;Database=$db_name",$db_user,$db_pass);?>

My results:

-------------------

PDO_MSSQL

rowCount() Standart: 0

rowCount() New: 0

MSSQL throw PDO_ODBC

rowCount() Standart: -1

rowCount() New: 53

MS SQL driver 2.0

rowCount() Standart: -1

rowCount() New: 53

-------------------

With myPDO class you can use prepared queries like:

$pdh= newmyPDO($dsn,$db_user,$db_pass);$sth=$pdh->query("select * from data where id>? or name like ?", array(100,"A%"));?>

[#5]

user at nospam dot example dot com [2013-09-03 18:49:57]

MySQL does not seem to return anything in rowCount for a select statement, but you can easily and efficiently get the row count as follows:

class db extends PDO {

public function last_row_count() {

return $this->query("SELECT FOUND_ROWS()")->fetchColumn();

}

}

$myDb = new db('mysql:host=myhost;dbname=mydb', 'login', 'password' );

Then, after running your query:

if ( $myDb->last_row_count() == 0 ) {

echo "Do something!";

}

[#6]

Daniel Karp [2012-08-31 00:09:13]

Note that an INSERT ... ON DUPLICATE KEY UPDATE statement is not an INSERT statement, rowCount won't return the number or rows inserted or updated for such a statement.  For MySQL, it will return 1 if the row is inserted, and 2 if it is updated, but that may not apply to other databases.

[#7]

leandro at marquesini dot com [2012-01-03 10:04:01]

To display information only when the query is not empty, I do something like this:

$sql='SELECT model FROM cars';$stmt=$db->prepare($sql);$stmt->execute();

if ($data=$stmt->fetch()) {

do {

echo$data['model'] .'
';

} while ($data=$stmt->fetch());

} else {

echo'Empty Query';

}?>

[#8]

Ome Ko [2011-07-16 12:08:41]

When updating a Mysql table with identical values nothing's really affected so rowCount will return 0. As Mr. Perl below noted this is not always preferred behaviour and you can change it yourself since PHP 5.3.

Just create your PDO object with

$p= newPDO($dsn,$u,$p, array(PDO::MYSQL_ATTR_FOUND_ROWS=>true));?>

and rowCount() will tell you how many rows your update-query actually found/matched.

[#9]

e dot sand at elisand dot com [2008-11-19 11:32:36]

My rowCount() workaround & how it's used:

private$queryString;

public functionquery() {$args=func_get_args();$this->queryString=func_get_arg(0);

returncall_user_func_array(array(&$this,'parent::query'),$args);

}

public functionrowCount() {$regex='/^SELECT\s+(?:ALL\s+|DISTINCT\s+)?(?:.*?)\s+FROM\s+(.*)$/i';

if (preg_match($regex,$this->queryString,$output) >0) {$stmt=parent::query("SELECT COUNT(*) FROM{$output[1]}",PDO::FETCH_NUM);

return$stmt->fetchColumn();

}

returnfalse;

}

}$pdo= newMyPDO("sqlite::memory:");$result=$pdo->query("SELECT row1, row2 FROM table WHERE something = 5");

if ($pdo->rowCount() >0) {

echo"{$result['row1']},{$result['row2']}";

}?>

[#10]

e dot sand at elisand dot com [2008-11-19 11:30:27]

As of SQLite 3.x, the SQLite API itself changed and now all queries are implemented using "statements".  Because of this, there is no way for PDO to know the rowCount of a SELECT result because the SQLite API itself doesn't offer this ability.

As a workaround, I created my own rowCount() function - it's a bit of a hack and hasn't been fully tested yet (I don't know how it will work when using JOINs in SELECTs, etc...), but at least alleviates the necessity for SELECT COUNT(*)'s everywhere in your code.

I would have preferred if it were possible to overload the rowCount() function from PDOStatement, but I don't think it's possible (or I don't know how to do it).  There's also potential room for a bit more security ensuring that $queryString is wiped clean after other query()s so that you don't get a bad result, etc...

The actual code should be posted in the above/below post (max post limits, argh!).  If others wish to extend/perfect this method, please keep me posted with an email as to what you've done.

[#11]

gunnrosebutpeace at gmail dot com [2008-06-03 03:19:27]

It'd better to use SQL_CALC_FOUND_ROWS, if you only use MySQL. It has many advantages as you could retrieve only part of result set (via LIMIT) but still get the total row count.

code:

$db= newPDO(DSN...);$db->setAttribute(array(PDO::MYSQL_USE_BUFFERED_QUERY=>TRUE));$rs=$db->query('SELECT SQL_CALC_FOUND_ROWS * FROM table LIMIT 5,15');$rs1=$db->query('SELECT FOUND_ROWS()');$rowCount= (int)$rs1->fetchColumn();?>

[#12]

Matt [2007-10-07 09:22:07]

Great, while using MySQL5, the only way to get the number of rows after doing a PDO SELECT query is to either execute a separate SELECT COUNT(*) query (or to do count($stmt->fetchAll()), which seems like a ridiculous waste of overhead and programming time.

Another gripe I have about PDO is its inability to get the value of output parameters from stored procedures in some DBMSs, such as SQL Server.

I'm not so sure I'm diggin' PDO yet.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ‘caching_sha2_password’ 是 MySQL 8.0 版本引入的一种插件,用于增强对用户密码的加密保护。在连接数据库时,如果发生 [tc_mysql::connect]: mysql_real_connect: authentication plugin 'caching_sha2_password' 错误,可能是以下两个原因之一: 1. MySQL 8.0 版本之前的客户端与 MySQL 8.0 版本以上的服务器进行连接时,由于默认加密插件不匹配,导致认证失败。解决方法是升级客户端版本或为相应的用户更改默认的加密插件。 2. MySQL 8.0 版本以上的服务器设置了默认使用 'caching_sha2_password' 插件进行认证,但客户端版本较低,并不支持该插件。解决方法是在服务器端修改用户的加密插件为旧版本所支持的插件,如 'mysql_native_password'。 在解决该错误时,可以采取以下步骤: 1. 升级客户端版本,确保与服务器兼容。 2. 在服务器端,找到相应用户并修改其加密插件为旧版本所支持的插件。 3. 如果连接仍然失败,可以尝试更新客户端的 MySQL 驱动程序,或使用其他不同版本的驱动程序。 总的来说,[tc_mysql::connect]: mysql_real_connect: authentication plugin 'caching_sha2_password' 错误是由于客户端与服务器的加密插件不匹配所致,需要升级客户端版本或修改服务器端的用户加密插件来解决。 ### 回答2: 这个错误是由于MySQL数据库连接时使用了"authentication plugin 'caching_sha2_password'",但是相应的驱动程序不支持此插件所导致的。 为了解决这个问题,有以下几种方法: 1. 更新驱动程序:查找并下载最新版本的MySQL驱动程序。新版本的驱动程序通常会支持新的插件。安装更新的驱动程序后,再次尝试连接数据库。 2. 修改MySQL用户的身份验证插件:如果使用的是MySQL 5.7以上版本,可以尝试将用户的身份验证插件修改为旧的插件,例如'mysql_native_password'。这可以通过修改MySQL用户的身份验证插件选项以及刷新权限来完成。 3. 修改MySQL服务配置:在MySQL配置文件中,可以尝试禁用所有新的身份验证插件,只使用旧的插件。找到MySQL配置文件(通常位于/etc/mysql目录下),找到并编辑my.cnf或my.ini文件,在[mysqld]部分添加或修改一行如下配置:default_authentication_plugin = mysql_native_password。保存文件后,重启MySQL服务。 以上是解决"tc_mysql::connect: mysql_real_connect: authentication plugin 'caching_sha2_password'"错误的几种方法。根据具体情况选择合适的方法来解决问题。 ### 回答3: 认证插件 'caching_sha2_password' 导致 MySQL 连接错误的可能原因有以下几点。 首先,该错误可能是因为 MySQL 服务器使用了不同的身份验证插件,而 PHP 中的 MySQL 扩展不支持该插件。在较新版本的 MySQL 中,默认身份验证插件是 'caching_sha2_password',而较旧版本的 PHP MySQL 扩展只支持旧的身份验证插件。 解决这个问题的一种方法是升级 PHP 版本,或者使用支持新身份验证插件的第三方 MySQL 扩展库,例如 MySQLi 或 PDO。这些扩展库兼容较新版本的 MySQL,并能正确地处理 'caching_sha2_password' 插件。 另外,该错误也可能是由于 MySQL 服务器未正确配置所致。您可以检查 MySQL 的配置文件(通常是 my.cnf 或 my.ini)中的设置。确保在 [mysqld] 部分中,有一个正确的默认身份验证插件设置,如下所示: default_authentication_plugin = mysql_native_password 如果该行不存在,或者设置为其他非 'mysql_native_password' 插件,可尝试添加或修改该设置并重启 MySQL 服务器。 最后,如果您无权更改 MySQL 服务器的配置或升级 PHP 版本,同时又无法使用其他支持新身份验证插件的扩展库,您可以联系服务器管理员或开发者,以获取进一步的帮助和解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值