V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
nothing2
V2EX  ›  问与答

超业余选手请教一个 ajax 更新数据库问题,谢谢

  •  
  •   nothing2 · 2018-03-13 07:48:10 +08:00 · 1805 次点击
    这是一个创建于 2229 天前的主题,其中的信息可能已经有所发展或是发生改变。

    说明 1:sqlite 数据库中保存有一些新闻条目,表结构为 rowid | title | url | mark,分别表示 id、标题、链接、已读标志,其中已读标志 0 表示未读,1 为已读;

    说明 2:用 php 从数据库中读取 mark=0 的条目,用 while 循环拼凑为

    <li><a href="url1" id="go" itemid="rowid1">title1</a></li>
    <li><a href="url2" id="go" itemid="rowid2">title2</a></li>
    

    说明 3:我的需求是:点击某条新闻链接后,更新数据库中该条目的 mark=1

    说明 4:东拼西凑了一个脚本

    <script src="path/to/jquery.min.js"></script>
    <script type="text/javascript">
    $(document).ready(function(){
    	$("a#go").click(function(){
    		var itemid = $(this).attr("itemid");
    		$.ajax({
    			url: "go.php",
    			type: "post",
    			data: {id: itemid}
    		});
    	});
    });
    </script>
    

    其中 go.php 是 update 数据库

    $id = $_REQUEST["id"];
    $sql = 'UPDATE "table" SET "mark" = 1 WHERE "rowid" = '.$id;
    

    现在的问题是:点击链接后,有一定的概率不能更新 mark,即数据库中仍然标记为未读

    求指教,非常感谢。

    第 1 条附言  ·  2018-03-13 17:14:25 +08:00

    修改了几处代码,目前看起来是正常了。感谢回复的各位。

    1、修改新闻条目列表

    <li><a href="url1" itemid="rowid1">title1</a></li>
    <li><a href="url2" itemid="rowid2">title2</a></li>
    

    2、修改ajax

    $("a").click(function(){
    	var itemid = $(this).attr("itemid");
    	var itemurl = $(this).attr("href");
    	$.ajax({
    		url: "go.php",
    		type: "post",
    		async: false,
    			data: {"id": itemid}
    	});
    	window.location.href = itemurl;
    	return false;
    });
    
    
    13 条回复    2018-03-13 19:19:21 +08:00
    manhere
        1
    manhere  
       2018-03-13 08:07:24 +08:00 via Android
    一个页面里不要有重复的 id
    MeteorCat
        2
    MeteorCat  
       2018-03-13 08:09:16 +08:00 via Android
    什么时候 html 标签能够多个同名 id 了?
    lhx2008
        3
    lhx2008  
       2018-03-13 08:13:22 +08:00 via Android
    重复标签用 class,否则用 id 只会绑定到第一个元素上面
    DT27
        4
    DT27  
       2018-03-13 08:15:49 +08:00
    楼上说的对,但是跟楼主出现的问题没什么关系好像。
    点击的时候看下浏览器发开者工具里的控制台还有网络面板,看看请求有没有什么问题,是没请求,还是请求失败。
    另外 ajax 里的 success 跟 error 加上便于调试。
    nothing2
        5
    nothing2  
    OP
       2018-03-13 08:15:53 +08:00
    @manhere #1
    @MeteorCat #2
    @lhx2008 #3

    谢谢,我马上调整
    Troevil
        6
    Troevil  
       2018-03-13 09:02:17 +08:00
    你点击链接之后,ajax 请求是异步的,可能还未发出去,但是页面跳转出去了啊,当次请求就被扔掉了当然会出现更新失败了
    littleylv
        7
    littleylv  
       2018-03-13 09:11:56 +08:00
    6 楼说的对。可能 ajax 还没发送成功,a 链接就跳转了。稳妥一点的话,就在 ajax 返回后再用 js 手动跳转,但这样感觉不是很合理
    jasonyang9
        8
    jasonyang9  
       2018-03-13 09:15:30 +08:00
    $.ajax 加一个 async: true 试试
    chairuosen
        9
    chairuosen  
       2018-03-13 09:26:48 +08:00
    还有一个逻辑层的问题,已读状态和取文章是一件事,你分两个渠道来做就有不同步的风险。应该是在取文章的时候在服务端把已读标记置为 1。
    summerwar
        10
    summerwar  
       2018-03-13 10:48:41 +08:00
    如果打开的新闻链接是本站内的,那么就在阅读页面 ajax 将状态调整为已读; 如果是外部站点,就先拦截跳转,等更新完状态之后,在 ajax 里跳转至外部页面地址
    jasonyang9
        11
    jasonyang9  
       2018-03-13 11:11:33 +08:00
    @jasonyang9 写反了,那是 async: false
    nothing2
        12
    nothing2  
    OP
       2018-03-13 11:31:22 +08:00 via iPhone
    @summerwar 是站外链接,能给一下示例代码么?或者参考链接,谢谢
    Telegram
        13
    Telegram  
       2018-03-13 19:19:21 +08:00 via iPhone
    @littleylv #7 那有时候网络慢的时候,ajax 没返回成功,点链接都不会跳转了,还不如把 ajax 写到文章页面里,某个文章打开了,才 ajax 标记
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2495 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 15:44 · PVG 23:44 · LAX 08:44 · JFK 11:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.