V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
miao
V2EX  ›  PHP

php如何自动读取第一个status为0的写法

  •  
  •   miao · 2013-12-31 15:15:12 +08:00 · 3828 次点击
    这是一个创建于 3979 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我是php菜鸟 请问一个问题

    我的mysql 设计举例如下

    id name status
    1 jack 1
    2 kate 1
    3 james 0
    4 brown 0
    5 Alston 0
    6 Charles 1
    7 Mark 0
    8 Sarah 1


    我一次只运行一下xxx.php

    那么xxx.php 会自动读取 第一个 status=0 的id 和 name, 然后赋值status = 1

    我第二次运行xxx.php 还是读取第一个 status=0 这个状态下的 id 和 name

    每次xxx.php只读取一行 mysql数据

    请问这个php和sql 怎么写?



    PS:我不要循环读取
    13 条回复    1970-01-01 08:00:00 +08:00
    Sunyanzi
        1
    Sunyanzi  
       2013-12-31 15:26:56 +08:00
    事实上我没能完全看懂你的提问 ... 我能看懂的部分是一个 MySQL 问题 ...

    SELECT `id`,`name` FROM `tablename` WHERE `status`=0 ORDER BY `id` ASC LIMIT 0, 1

    赋值 status = 1 我没明白 ... 不就是一条 UPDATE 语句么 ..?
    likexian
        2
    likexian  
       2013-12-31 15:33:47 +08:00
    update `table` set `status`=1 where status=0 limit 1
    miao
        3
    miao  
    OP
       2013-12-31 15:54:58 +08:00
    @Sunyanzi 感谢您的回答, 我确实不知道如何形容这个超级简单的问题, 您这条sql语句应该能用,

    后面 ORDER BY `id` ASC LIMIT 0, 1 这句话

    意思是不是 按`id`的升序排序, LIMIT 0, 1 就是只读取一条数据?
    miao
        4
    miao  
    OP
       2013-12-31 15:56:02 +08:00
    @likexian @likexian
    谢谢, 赋值 status = 1 确实就是

    update `table` set `status`=1 where status=0 limit 1

    这句话就是只赋值第一个status=0?
    66beta
        5
    66beta  
       2013-12-31 16:00:15 +08:00
    这属于SQL问题,楼主可以翻手册慢慢做,自己搞出来的比较有趣
    可以现在数据库GUI上跑一下,成功了再贴到PHP里面~
    arbipher
        6
    arbipher  
       2013-12-31 16:15:27 +08:00
    把cursor保存下来,但是我不知道这个在PHP里面怎么实现。。。
    我顺路问一下,PHP怎么实现全局变量(就像JSP里面Application范围的变量一样)
    zzNucker
        7
    zzNucker  
       2013-12-31 17:27:51 +08:00
    @arbipher 如果include了用global
    arbipher
        8
    arbipher  
       2013-12-31 17:59:48 +08:00
    @zzNucker 不是global吧。我没理解错的话,php的globa范围l应该等效于jsp的request范围,php global变量只在这一次请求中有效,下一次请求的时候会重新初始化。
    msg7086
        9
    msg7086  
       2014-01-01 05:44:13 +08:00
    @arbipher 因为以前PHP每次接受请求的时候都会产生一个新的php-cgi进程。既然每次都产生新进程了,那全局变量的生存周期当然只到脚本结束的时候就结束了。

    要持久化,就得用第三方的东西。apc/mc/radis/mysql/cookie/session等等
    arbipher
        10
    arbipher  
       2014-01-01 09:47:32 +08:00
    @msg7086 我去翻了下文档,可以用Semaphore。shm_get_var, shm_put_var。
    http://www.php.net/manual/en/ref.sem.php
    感觉这和读写数据库也没啥区别的。。。
    msg7086
        11
    msg7086  
       2014-01-01 09:53:43 +08:00
    @arbipher 嗯?信号量?应该是用来Linux下跨进程通信的?

    我觉得一般环境下还是用上面提的那些吧……
    zzNucker
        12
    zzNucker  
       2014-01-01 22:43:08 +08:00
    @arbipher 你这是啥 - - 是同步用的玩意吧, 一般你要跨request的话php确实难的,基本要靠用外部存储。。
    arbipher
        13
    arbipher  
       2014-01-01 23:01:06 +08:00
    @zzNucker
    这个问题我是在SAE上写PHP是遇到的。
    我要在服务器初始化的时候,从数据库读些东西放到memcache里面。函数是memcache_set($mmc,"foo","bar")。
    为了防止memcache的数据被洗掉,任何一个请求,只要memcache_get失败,就去数据库里面读一次,把结果存到memcache里。
    问题是我担心,这个“读数据库存到memcache”的操作不是原子的。当时就在想全局锁的事情。

    LZ这个帖子让我想到了这件事情。所以我的潜意识里,开始解答我自己的疑惑了。

    其实我也不知道,这个操作是不是一定要原子。可能是我想多了吧。
    至于LZ这个问题,利用mysql,或者Semaphore都能解决吧,绕了一下而已。
    但是PHP下,服务器级别的全局变量的最直接的方法,我还是不知道。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1109 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 23:29 · PVG 07:29 · LAX 15:29 · JFK 18:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.