$conn->PageExecute($sql,$pageSize,$pageNo);

解决方案 »

  1.   

    我用的也是
    $conn->PageExecute($sql,$pageSize,$pageNo);
    没问题的,如果页码超出范围,会自动调为最后一页
      

  2.   

    请问ADO_Pager是怎么回事?
    怎么没有相关帮助呢?
      

  3.   

    哦,和你正常的用法是一样的,不用其他任何特殊的配置ADO_Pager不用管它。就把你平时用的
    $rs = $conn->GetAll($sql);
    直接替换成
    $rs = $conn->PageExecute($sql,$pageSize,$pageNo);
    就可以了。
    另外你可以得到以下的信息,饱含分页的所有的信息。
    $rs = $conn->PageExecute($sql,$pageSize,$pageNo);
    $data['data']        = $rs->getArray();
    $data['recordCount'] = $rs->_maxRecordCount;
    $data['pageCount']   = $rs->LastPageNo();
    $data['pageCount'] = ($data['pageCount']<0)? 0: $data['pageCount'];
    $data['pageSize']    = $rs->rowsPerPage;
    $data['isFirst']     = $rs->AtFirstPage();
    $data['isLast']      = $rs->AtLastPage();
    $data['pageNow']     = $pageNo>$data['pageCount']? $data['pageCount']: $pageNo;
    print_R($data);
      

  4.   

    那么PageExecute的效率如何呢?
    接用limit语句的sql能比这个快很多么?因为asp用ado调用的时候设置recordset的pagesize之间必须选出sql语句规定的所有数据,我不知道adodb的recordset类是怎么做的。
      

  5.   

    那么对于LockType和CursorType呢?
    是不是odbc根本就没有ado的这个概念?
      

  6.   

    不知道asp中LockType和CursorType是怎么工作的,所以不太清楚。你看看手册好了。
    http://phplens.com/lens/adodb/docs-adodb.htmodbc 和ado 都是数据库连接的方式。具体的差别
    http://www.homebay.net/home/news-3.htm
      

  7.   

    ado中的cursortype和locktype是为了优化操作的,比如是否锁定记录集,是否能够多用户同步数据修改等。这个用adodb这套组件能做到么?反正access的adodb接口实现了这样的功能,不知道mysql有没有adodb接口。还想问一句:unix/linux下可能不支持ado标准,他们支持的是不是odbc标准?
      

  8.   


    adodb这套组件可以做到你说的功能,你可以通过sql语句来锁定表这个adodb是用php实现的,操作仿照micro的adodb,实际上他们根本不是一个东西,只是实现它的操作方法,类试的用户接口,通过这种方式来实现数据库操作的通用性,它可以运行到任何支持php的系统里。
      

  9.   

    请问用什么sql语句可以锁定表?所谓的锁定表示怎么回事?是只有一个人可以访问,别的都得等?那么所谓访问的意思是读是写?谢谢!
      

  10.   

    具体的看手册阿.24 LOCK TABLES/UNLOCK TABLES句法
    LOCK TABLES tbl_name [AS alias] {READ | [LOW_PRIORITY] WRITE}
                [, tbl_name {READ | [LOW_PRIORITY] WRITE} ...]
    ...
    UNLOCK TABLESLOCK TABLES为当前线程锁定表。UNLOCK TABLES释放被当前线程持有的任何锁。当线程发出另外一个LOCK TABLES时,或当服务器的连接被关闭时,当前线程锁定的所有表自动被解锁。 如果一个线程获得在一个表上的一个READ锁,该线程(和所有其他线程)只能从表中读。如果一个线程获得一个表上的一个WRITE锁,那么只有持锁的线程READ或WRITE表,其他线程被阻止。 每个线程等待(没有超时)直到它获得它请求的所有锁。 WRITE锁通常比READ锁有更高的优先级,以确保更改尽快被处理。这意味着,如果一个线程获得READ锁,并且然后另外一个线程请求一个WRITE锁, 随后的READ锁请求将等待直到WRITE线程得到了锁并且释放了它。当线程正在等待WRITE锁时,你可以使用LOW_PRIORITY WRITE允许其他线程获得READ锁。如果你肯定终于有个时刻没有线程将有一个READ锁,你应该只使用LOW_PRIORITY WRITE。 当你使用LOCK TABLES时,你必须锁定你将使用的所有表!如果你正在一个查询中多次使用一张表(用别名),你必须对每个别名得到一把锁!这条政策保证表锁定不会死锁。 注意你应该不锁定任何你正在用INSERT DELAYED使用的表,这是因为在这种情况下,INSERT被一个不同的线程执行。 通常,你不必锁定表,因为所有单个UPDATE语句是原语;没有其他线程能防碍任何其它正在执行SQL 语句的线程。当你想锁定表,有一些情况: 如果你将在一堆表上运行许多操作,锁定你将使用的表是较快的。当然缺点是,没有其他线 
    程能更新一个READ锁定的表并且没有其他线程能读一个WRITE-锁定的表。 
    MySQL不支持事务环境,所以如果你想要保证在一个SELECT和一个UPDATE之间没有其他线程 
    到来,你必须使用LOCK TABLES。下面显示的例子要求LOCK TABLES以便安全地执行: 
    mysql> LOCK TABLES trans READ, customer WRITE;
    mysql> select sum(value) from trans where customer_id= some_id;
    mysql> update customer set total_value=sum_from_previous_statement
               where customer_id=some_id;
    mysql> UNLOCK TABLES;
    没有LOCK TABLES,另外一个线程可能有一个机会在执行SELECT和UPDATE语句之间往trans表中插入一个新行。 通过使用渐增更改(UPDATE customer SET value=value+new_value)或LAST_INSERT_ID()函数,在很多情况下你能使用LOCK TABLES来避免。 你也可以使用用户级锁定函数GET_LOCK()和RELEASE_LOCK()解决一些情况,这些锁保存在服务器的一张哈希表中并且用pthread_mutex_lock()和pthread_mutex_unlock()实现以获得高速度。见7.4.12 其他函数。 有关锁定政策的更多信息,见10.2.8 MySQL 怎样锁定表。 
      

  11.   

    10.2.8 MySQL怎样锁定数据库表
    MySQL中所有锁定不会是死锁的。这通过总是在一个查询前立即请求所有必要的锁定并且总是以同样的顺序锁定表来管理。 对WRITE,MySQL使用的锁定方法原理如下: 如果在表上没有锁,放一个锁在它上面。 
    否则,把锁定请求放在写锁定队列中。 
    对READ,MySQL使用的锁定方法原理如下: 如果在表上没有写锁定,把一个读锁定放在它上面。 
    否则,把锁请求放在读锁定队列中。 
    当一个锁定被释放时,锁定可被写锁定队列中的线程得到,然后是读锁定队列中的线程。 这意味着,如果你在一个表上有许多更改,SELECT语句将等待直到有没有更多的更改。 为了解决在一个表中进行很多INSERT和SELECT操作的情况,你可在一张临时表中插入行并且偶尔用来自临时表的记录更新真正的表。 这可用下列代码做到: mysql> LOCK TABLES real_table WRITE, insert_table WRITE;
    mysql> insert into real_table select * from insert_table;
    mysql> delete from insert_table;
    mysql> UNLOCK TABLES;如果你在一些特定的情况字下区分检索的优先次序,你可以使用LOW_PRIORITY选项的INSERT。见7.14 INSERT句法。 你也能改变在“mysys/thr_lock.c”中的锁代码以使用一个单个队列。在这种情况下,写锁定和读锁定将有同样优先级,它可能帮助一些应用程序。 10.2.9 数据库表级锁定的问题
    MySQL的表锁定代码是不会死锁的。 MySQL使用表级锁定(而不是行级锁定或列级锁定)以达到很高的锁定速度。对于大表,表级锁定对大多数应用程序来说比行级锁定好一些,但是当然有一些缺陷。 在MySQL3.23.7和更高版本中,一个人能把行插入到MyISAM表同时其他线程正在读该表。注意,目前只有在表中内有删除的行时才工作。 表级锁定使很多线程能够同时读一个表,但是如果一个线程想要写一个表,它必须首先得到独占存取权。在更改期间,所有其他想要存取该特定表的线程将等到更改就绪。 因为数据库的更改通常被视为比SELECT更重要,更新一个表的所有语句比从一个表中检索信息的语句有更高的优先级。这应该保证更改不被“饿死”,因为一个人针对一个特定表会发出很多繁重的查询。 从MySQL 3.23.7开始,一个人可以能使用max_write_lock_count变量强制MySQL在一个表上一个特定数量的插入后发出一个SELECT。 对此一个主要的问题如下: 一个客户发出一个花很长时间运行的SELECT。 
    然后其他客户在一个使用的表上发出一个UPDATE;这个客户将等待直到SELECT完成。 
    另一个客户在同一个表上发出另一个SELECT语句;因为UPDATE比SELECT有更高的优先级,该SELECT将等待UPDATE的完成。它也将等待第一个SELECT完成! 
    对这个问题的一些可能的解决方案是: 试着使SELECT语句运行得更快;你可能必须创建一些摘要(summary)表做到这点。 
    用--low-priority-updates启动mysqld。这将给所有更新(修改)一个表的语句以比SELECT语句低的优先级。在这种情况下,在先前情形的最后的SELECT语句将在INSERT语句前执行。 
    你可以用LOW_PRIORITY属性给与一个特定的INSERT、UPDATE或DELETE语句较低优先级。 
    为max_write_lock_count指定一个低值来启动mysqld使得在一定数量的WRITE锁定后给出READ锁定。 
    通过使用SQL命令:SET SQL_LOW_PRIORITY_UPDATES=1,你可从一个特定线程指定所有的更改应该由用低优先级完成。见7.25 SET OPTION句法。 
    你可以用HIGH_PRIORITY属性指明一个特定SELECT是很重要的。见7.12 SELECT句法。 
    如果你有关于INSERT结合SELECT的问题,切换到使用新的MyISAM表,因为它们支持并发的SELECT和INSERT。 
    如果你主要混合INSERT和SELECT语句,DELAYED属性的INSERT将可能解决你的问题。见7.14 INSERT句法。 
    如果你有关于SELECT和DELETE的问题,LIMIT选项的DELETE可以帮助你。见7.11 DELETE句法。