php mysql 操作影响行数_PHP 返回受上一个 SQL 语句影响的行数

用户评论:

user at holland dot nl (2013-05-30 14:46:06)

for InnoDB users; note; that rowCount will give 1 for updated AND inserted rows... so if you want to check if a row is updated, you have to find another solution

Mike Robinson (2013-02-08 05:13:59)

Please note that using PDOStatement::rowCount with a MySQL SELECT statement returns the number of rows found by that statement, not the number of rows affected (which would obviously be 0).

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.

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';

}?>

dcahh at gmx dot de (2011-08-19 06:53:35)

It's pretty obvious, but might save one or the other from bug tracking...

Alltough rowCount ist returned by the statement, one has to execute the statement before rowCount returns any results...

Does not work

$statement=$dbh->prepare('SELECT FROM fruit');$count=$statement->rowCount();?>

Works

$statement=$dbh->prepare('SELECT FROM fruit');$statement->execute();$count=$statement->rowCount();?>

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

 php

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

?>

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

php at alishabeth dot com (2009-01-20 17:15:04)

It appears that rowCount behavior is different on Mysql 5.0 vs 5.1.  Here's the test I ran:

$db= newPDO('mysql:host=localhost;dbname=test','test','test');$sql="SELECT 1";$st=$db->prepare($sql);$st->execute();print_r($st->rowCount());?>

Mysql 5.0.45, PHP 5.2.5 returned 1

Mysql 5.1.30, PHP 5.1.6 returned 0

I know... I need to test against same php versions... buy I'm getting lazy...

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']}";

}?>

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.

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();?>

Anonymous (2007-12-26 04:10:33)

The rowCount method does not seem to work with pdo_sqlite, maybe because it will not support forward-only cursors:

error_reporting(E_ALL+E_NOTICE);$dsn='sqlite::memory:';$pdo= newPDO($dsn);$pdo->exec('CREATE TABLE foo(id varchar(11) NOT NULL, PRIMARY KEY(id))');$pdo->exec("INSERT INTO foo(id) VALUES ('ffs')");$sqlGet='SELECT * FROM foo WHERE id=:id';$stmt=$pdo->prepare($sqlGet);$id='ffs';$stmt->bindParam(':id',$id,PDO::PARAM_STR);$stmt->execute();var_dump($stmt->rowCount(),count($stmt->fetchAll()));?>

which outputs: 0 1

http://php.net/manual/en/function.sqlite-num-rows.php says sqlite_num_rows() cannot be used on unbuffered results; the explanation to the failure of the rowCount() method is probably along the same lines.

The workaround would be to use the count() function on a fetched result, but it might not be as efficient.

Mr. Perl (2007-11-14 07:06:29)

To Matt,

PDO is very similar in design to Perl's DBI which does allow you to set driver specific attributes such as mysql_client_found_rows=1 as part of the DSN.

PDO has a setAttribute() method, but afaik there is no

MYSQL_ATTR_CLIENT_FOUND_ROWS constant (yet). Hopefully some PDO developer will patch it in one day.

Setting that (at least in Perl and C) will make rowCount() return the number of rows selected for the update, not just the number of rows actually updated.

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
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值