mysql_affected_rows()
站在用户的角度思考问题,与客户深入沟通,找到临高网站设计与临高网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:成都做网站、成都网站制作、企业官网、英文网站、手机端网站、网站推广、主机域名、雅安服务器托管、企业邮箱。业务覆盖临高地区。
返回最近一次与
连接句柄
关联的
INSERT,UPDATE
或
DELETE
查询所影响的记录行数.FOUND_ROWS()
:
select
ROW_COUNT()
:
update
delete
insert.
FOUND_ROWS()
:
select
ROW_COUNT()
:
update
delete
insert.
MySQL的函数中,SELECT是另外一个单独的函数
FOUND_ROWS()
,
UPDATE等是
ROW_COUNT()
如下案例:
mysql
INSERT
INTO
t
VALUES(1),(2),(3);
Query
OK,
3
rows
affected
(0.00
sec)
Records:
3
Duplicates:
Warnings:
mysql
SELECT
ROW_COUNT();
+-------------+
|
ROW_COUNT()
|
+-------------+
|
3
|
+-------------+
1
row
in
set
(0.00
sec)
mysql_affected_rows
(PHP
3,
PHP
4
,
PHP
5)
mysql_affected_rows
--
取得前一次
MySQL
操作所影响的记录行数说明
int
mysql_affected_rows
(
[resource
link_identifier])
mysql_affected_rows()
返回最近一次与
连接句柄
关联的
INSERT,UPDATE
或
DELETE
查询所影响的记录行数。如果连接句柄没有指定,
则默认使用最近一次由
mysql_connect()
函数打开的连接句柄。
注:
如果你使用事务处理(transactions),你需要在
INSERT,UPDATE
或
DELETE
查询后调用
mysql_affected_rows()
函数,而不是在
commit
命令之后。
如果最近一次操作是没有任何条件(WHERE)的
DELETE
查询,
在表中所有的记录都会被删除,但该函数返回值为
0。
注:
当使用
UPDATE
查询,MySQL
不会将原值和新值一样的列更新。
这样使得
mysql_affected_rows()
函数返回值不一定就是查询条件所符合的记录数。
只有真正被修改的记录数才会被返回。
mysql_affected_rows()
函数不适用于
SELECT
语句;只适用于能够修改记录的语句中。请使用
mysql_num_rows()
函数来获得
SELECT
所返回的记录行数。
如果最近一次查询失败的话,函数返回
-1。
例子
1.
Delete
操作
?php
/*
连接数据库
*/
mysql_pconnect("localhost",
"mysql_user",
"mysql_password")
or
die
("Could
not
connect"
.
mysql_error());
mysql_select_db("mydb");
/*
这会返回有效的被删除记录数。
*/
mysql_query("DELETE
FROM
mytable
WHERE
id
10");
printf
("Records
deleted:
%d/n",
mysql_affected_rows());
/*
没有任何条件(where)的删除语句,返回
*/
mysql_query("DELETE
FROM
mytable");
printf
("Records
deleted:
%d/n",
mysql_affected_rows());
?
以上的例子会得出下面的运行结果:
Records
deleted:
10Records
deleted:
例子
2.
Update
操作
?php
/*
连接数据库
*/
mysql_pconnect("localhost",
"mysql_user",
"mysql_password")
or
die
("Could
not
connect"
.
mysql_error());
mysql_select_db("mydb");
/*
Update
记录
*/
mysql_query("UPDATE
mytable
SET
used=1
WHERE
id
10");
printf
("Updated
records:
%d/n",
mysql_affected_rows());
mysql_query("COMMIT");
?
以上的例子会得出下面的运行结果:
Updated
Records:
10
参见
mysql_num_rows()
和
mysql_info()。
mysql_affected_rows()
返回的是对行操作的个数
$query=mysql_query("select
*
from
love_mp3_table
");
mysql_affected_rows();//其实对这个也有效,返回44,在这和mysql_num_rows($query)效果一样
$query=mysql_query("INSERT
INTO
table(id,title,hrefurl)
VALUE('','节节胜利','http://')");
mysql_affected_rows();//返回1
$query=mysql_query("DELETE
FROM
tabel
WHERE
id=45");
mysql_affected_rows();//返回1
$query=mysql_query("UPDATE
table
SET
title='我是'
WHERE
id=44");
mysql_affected_rows();//返回1
mysql自带CEILING函数,是向上取整,比如
select CEILING(12.54)
返回值是13
select CEILING(-10.63456)
返回值是-10
另外,mysql提供round(四舍五入)函数,FLOOR(向下取整)函数,用法与celling类似
代码如下:
CREATE function Get_StrArrayStrOfIndex
(
@str varchar(1024), --要分割的字符串
@split varchar(10), --分隔符号
@index int --取第几个元素
)
returns varchar(1024)
as
begin
declare @location int
declare @start int
declare @next int
declare @seed int
set @str=ltrim(rtrim(@str))
set @start=1
set @next=1
set @seed=len(@split)
set @location=charindex(@split,@str)
while @location0 and @index@next
begin
set @start=@location+@seed
set @location=charindex(@split,@str,@start)
set @next=@next+1
end
if @location =0 select @location =len(@str)+1
--这儿存在两种情况:1、字符串不存在分隔符号 2、字符串中存在分隔符号,跳出while循环后,@location为0,那默认为字符串后边有一个分隔符号。
return substring(@str,@start,@location-@start)
end
运行效果:
调用示例:select dbo.Get_StrArrayStrOfIndex('8,9,4',',',2)
返回值:9
mysql中要获得存储过程的返回值,可以增加一个out参数,用来返回。
mysql中存储过程的例子:
CREATE PROCEDURE addvoucher (
IN userid INT,
IN voucherid INT,
OUT result INT
)
BEGIN
SELECT
@endate_a := endate ,@batch_a := batch ,@c_count_a := c_count,
@isdead_a := isdead
FROM
t_voucher
WHERE
id = voucherid;
SET autocommit = 0;
IF EXISTS (
SELECT
*
FROM
t_user_voucher tuv,
t_voucher tv
WHERE
tv.id = tuv.voucherid
AND tv.batch =@batch_a
) THEN
SET result = 1;-- 已存在
SELECT
result;
ELSE
IF @c_count_a 0 THEN
IF (
TO_DAYS(@endate_a) - TO_DAYS(NOW())
) 0 THEN
IF @isdead_a = 1 THEN
INSERT INTO t_user_voucher (userid, voucherid, isdead)
VALUES
(userid, voucherid, 1);
UPDATE t_voucher SET c_count = c_count-1 where id = voucherid;
SET result = 0;-- 成功
END;
分析原因一:Mysql的自动备份功能可能导致数据库在备份的时候先关闭服务,而在此启动的时候服务器不响应,
开始-运行-services.msc,打开windows服务找到mysql的服务并双击,点击恢复选项卡,第一次失败:默认是“不操作”,改成”重新启动服务”。
在下方的“重新启动服务:分钟后”添上“0”表示如果服务意外终止则立即重启动。点击确定使设置生效。这时候你在任务管理器里结束mysql-nt进程,会发现结束不掉,不过要注意,这样mysql.exe是停不了的,如果要停必须把刚才修改的改回来.)
分析原因二,可能是mysql连接问题
修改mysql的最大连接数, 使用内存变量修改法修改mysql的最大连接数
步骤如下(同时适用windows和linux平台):
a、客户端登录mysql,输入用户名和密码’b、在mysql命令提示符下设置新的最大连接数为500:mysql set global max_connections=500
c、显示当前运行的query:mysql show processlist
d、显示当前mysql 系统参数状态:mysql show status# k;
e、退出客户端:mysql exit’
查看当前最大连接数只需要通过在mysqladmin所在目录下执行以下命令:mysqladmin -username -password variables |find “max_con” 即可看到。也可以使用php教程myadmin里头的mysql参数列表查看最大连接数。
缺点:重启计算机或者mysql后最大连接数又会复位成初始值,需要重新设定。
2、修改my.ini或my.cnf文件法(需要重启mysql),可参考同目录下mysql的配置模板(小内存、大内存、超大内存). e windows系统下打开my.ini文件找到set-variable =max_connections=100这一行,改成需要设定的最大连接数,然后重启即可。
linux控制台下:
1、打开my.cnf文件:vi /etc/my.cnf
2 在[mysqld]段下修改max_connections的值为设定值。
注意:
可能大家安装的mysql来源和版本不同(windows下mysql+iis和php+apache+mysql套件最终安装结果几乎都不相同),my.ini文件的路径可能有些不同,my.ini可能还会保留一份在c:windows目录下需要同时修改